OpenCV Python中的findHomography函数中,srcPoint输入不兼容。

3

我正在尝试找到将加载的图像转换为在检测到标记的平面上的变换,以便我可以将其转换为垂直于标记平面。 我遇到了将输入放入 cv2.findHomography 的困难。 请帮助更改此函数的输入格式。

这是导致问题的代码:

muffinImg = cv2.imread('muffin.jpg',0)
muffinCoords = np.zeros((4,2), np.float32)
muffheight, muffwidth = muffinImg.shape
muffinCoords[0] = (0,muffwidth)
muffinCoords[1] = (muffwidth,muffheight)
muffinCoords[2] = (0,muffheight)
muffinCoords[3] = (0,0)

found, corners = cv2.findChessboardCorners(frameLeft, (5,4),None)

if (found):
    corners2 = cv2.cornerSubPix(grayframeLeft,corners,(11,11),(-1,-1),criteria)
    q = [(0,0)]*4
    q[0] = corners[0][0]
    q[1] = corners[3][0]
    q[2] = corners[19][0]
    q[3] = corners[16][0]

    retvalHomography, mask = cv2.findHomography(q, muffinCoords, cv2.RANSAC)
    cv2.warpPerspective(muffinImg, retvalHomography, (400, 500), muffinImg, cv2.INTER_NEAREST, cv2.BORDER_CONSTANT,  0)

我在cv2.findHomography这行代码出现了错误:srcPoints不是numpy数组,也不是标量

下面是微软视觉对象检查工具的截图:

q: enter image description here

muffin: enter image description here

编辑:我有一些关于输入的额外信息,但我不知道它们有什么不同,可能只是我犯了一个新手错误:http://opencv-users.1802565.n2.nabble.com/Anyone-have-a-Python2-example-using-estimateRigidTransform-td7322817.html.

一个快速的解答可能会有所帮助(取决于您要做什么),即cv2.findHomography函数可以从python工作。它返回3x3矩阵而不是2x3矩阵,但如果变换确实是刚体,则会在底部行中发现接近零或一的系数,因此请将它们切掉。

a=np.array([0,0,1,0,0,1,1,1],np.float32).reshape(-1,2) #small square 
b=a*2  #scale x2 
b+=0.5 #translate across and down 
H,matches=cv2.findHomography(a,b,cv2.RANSAC) 
1个回答

1
您的变量q不是一个numpy数组。在传递给cv2.findHomography()之前,请尝试将其转换为数组。
我不太了解cv2 API,但我认为您应该更改以下内容:
q = [(0,0)]*4
q[0] = corners[0][0]
q[1] = corners[3][0]
q[2] = corners[19][0]
q[3] = corners[16][0]

将其翻译成中文:将其转换为以下内容:

像这样:

q = np.zeros((4,2), dtype=np.float32)
q[0] = corners[0][0]
q[1] = corners[3][0]
q[2] = corners[19][0]
q[3] = corners[16][0]

浏览了一下cv2文档,我认为corners是一个形状为n x 2的数组,所以那些赋值对我来说没有太多意义。corners[0][0](可以更简洁地写成corner[0,0])是第一个角落的第一个坐标,即corner[0][0]是一个标量。为什么只将第一个坐标分配给q[0]?那段代码的意图是什么?我怀疑它可以简化为:

q = corners[[0, 3, 19, 16]]

例如:

In [12]: corners = np.arange(40).reshape(20,2).astype(np.float32)

In [13]: corners
Out[13]: 
array([[  0.,   1.],
       [  2.,   3.],
       [  4.,   5.],
       [  6.,   7.],
       [  8.,   9.],
       [ 10.,  11.],
       [ 12.,  13.],
       [ 14.,  15.],
       [ 16.,  17.],
       [ 18.,  19.],
       [ 20.,  21.],
       [ 22.,  23.],
       [ 24.,  25.],
       [ 26.,  27.],
       [ 28.,  29.],
       [ 30.,  31.],
       [ 32.,  33.],
       [ 34.,  35.],
       [ 36.,  37.],
       [ 38.,  39.]], dtype=float32)

In [14]: q = corners[[0, 3, 19, 16]]

In [15]: q
Out[15]: 
array([[  0.,   1.],
       [  6.,   7.],
       [ 38.,  39.],
       [ 32.,  33.]], dtype=float32)

谢谢,这确实帮助我澄清了代码周围的事情。事实证明,我提取的校准参数比我最佳结果的误差要大10倍。我仍然对为什么在使用findHomography找到转换矩阵后应用warpPerspective时我的图像没有受到影响感到困惑。 - Michael Lorenzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接