java - OpenCV:如何实现 "Keystone Correction"?

标签 java opencv

我想拍摄一张从下面看矩形的图像(创建一个梯形)并将其更改为原始矩形。例如,假设您在地面上拍摄摩天大楼的照片。我想使用这些数据来找出摩天大楼的侧面是什么样子的。我该怎么做?

Keystone 校正通常指的是偏移投影仪,但事实并非如此。我的源图像已经像胶印投影仪一样乱七八糟了。我需要直接获取它。

感谢您的帮助。如果重要的话,我使用的是 Java 版本的 OpenCV,但我对任何答案都很满意;我确信将它从任何其他语言转换为 java 很容易。

编辑:我想执行此页面上为巴黎圣母院显示的操作:https://en.wikipedia.org/wiki/Perspective_control

最佳答案

这叫做单应性。您需要知道梯形的角,然后使用 findHomography 函数计算单应矩阵,然后使用 warpPerspective 函数生成校正后的图像。我已经编写了一个简单的 Python 程序供您试用,并提供了结果图像,以便您了解它的作用并查看这是否是您所说的。

enter image description here

代码

import cv2
import numpy as np
import cv

pSrc = [(  98,67),( 331 ,  75),( 415 , 469),(  27 , 466)]
pDst = [(  27,67),( 415 ,  75),( 415 , 469),(  27 , 466)]
def srcMouse(event, x, y, flags,params):
    global pSrc
    if event == cv.CV_EVENT_LBUTTONDOWN:

        if len(pSrc) >=4:
            pSrc=[]
        pSrc.append((x,y))
        print np.array(pSrc,dtype=np.float32)

def dstMouse(event, x, y, flags,params):
    global pDst
    if event == cv.CV_EVENT_LBUTTONDOWN:
        if len(pDst) >=4:
            pDst=[]
        pDst.append((x,y))

cv2.namedWindow('src')
cv.SetMouseCallback('src', srcMouse, 0)
cv2.namedWindow('dst')
cv.SetMouseCallback('dst', dstMouse, 0)

im = cv2.imread('c:/data/notre.jpg')
dst = np.zeros(im.shape,dtype=np.uint8)
while(1):
    imD = im.copy()
    dstD = dst.copy()
    for p in pSrc:
        cv2.circle(imD,p,2,(255,0,0),-1)
    for p in pDst:
        cv2.circle(dstD,p,2,(255,0,0),-1)

    if len(pSrc)==4 and len(pDst)==4:
        H = cv2.findHomography(np.array(pSrc,dtype=np.float32),np.array(pDst,dtype=np.float32),cv2.LMEDS)
        dstD=cv2.warpPerspective(imD,H[0],(dstD.shape[1],dstD.shape[0]))
    cv2.imshow('src',imD)
    cv2.imshow('dst',dstD)
    if cv2.waitKey(1) ==27:
        exit(0)    

关于java - OpenCV:如何实现 "Keystone Correction"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25724923/

相关文章:

java - (Java) 尝试对 if 语句中的打印项目进行编号

使用mysql函数时Java总内存和内存使用量增加?

python - 使用opencv和python的简单图像拼接问题

opencv - 模板匹配——不同尺寸的模板和图像

python - Raspberry Pi 4 上的断言失败

java - JPA 2.1/hibernate 5 : Search on inner type of Composite User Type with criteria API

java - 为 Android 警报对话框创建模型类

c++ - 释放 std::list<cv::Mat> c++ 的内存

python - 将颜色应用于渐变方向

java - SWT DateTime - 从两个小部件读取日期和时间