这被称为单应性矩阵。您需要知道梯形的四个角,然后使用findHomography函数计算单应性矩阵,再使用warpPerspective函数生成校正后的图像。我为您编写了一个简单的Python程序,并提供了结果图像,以便您了解它的作用并查看是否符合您的要求。
![enter image description here](https://istack.dev59.com/aTiC2.webp)
代码
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)
findHomography
基于4个点(最少要求)计算此矩阵(H
),如果有多于4个点,则会计算最小化重投影误差的最小二乘拟合。warpPerspective
执行将原始图像像素映射到由此矩阵描述的新平面的操作。请参考在线资源以获取更详细的解释(http://www.cs.toronto.edu/~jepson/csc2503/tutorials/homography.pdf)。 - Zaw Lin