首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV:我如何实现“基石修正”?

OpenCV:我如何实现“基石修正”?
EN

Stack Overflow用户
提问于 2014-09-08 13:01:21
回答 1查看 3.6K关注 0票数 4

我想要从下面看到一个矩形的图像(创建一个梯形),并将它转换为原始的矩形。例如,想象一下你在地上拍摩天大楼的照片。我想用这些数据来找出摩天大楼的侧面是什么样子。我怎么能这么做?

Keystone校正通常指的是偏移投影仪,但这并不完全是正在发生的事情。我的源图像已经被弄乱了,就像偏置投影仪一样。我要直截了当。

谢谢你的帮助。如果重要的话,我正在使用Java的OpenCV,但我对任何答案都很满意;我确信,从任何其他语言中将其转化为java是很容易的。

编辑:我想做在这个页面上为圣母大学显示的内容:control

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-08 14:06:34

这叫做同调。您需要知道梯形的角点,然后使用findHomography函数计算单形矩阵,然后使用warpPerspective函数生成校正后的图像。我已经为您编写了一个简单的python程序,供您使用,并提供了结果映像,以便您了解它所做的事情,并查看您所谈论的内容。

代码

代码语言:javascript
复制
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)    
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25724923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档