OpenCV,Python中的DMatch对象和Julia不匹配

时间:2016-06-15 22:58:32

标签: python c++ opencv julia feature-detection

我尝试使用OpenCV实现功能匹配方法,但从Python版本到Julia的转换不匹配:

方法完全相同,并使用相同的图像进行处理。 ([:method]只是访问Julia中特定类型方法的标准约定,所以不要被愚弄!另外,Julia索引从1开始,而不是0,所以这两组打印语句应该产生相同的结果,但他们不会。)

Julia版本:

query = cv2.imread("images/q1.jpg",0)
train = cv2.imread("images/q2.jpg",0) 

orb = cv2.ORB_create()

kp1 = orb[:detect](query)
kp1, des1 = orb[:compute](query, kp1)

kp2 = orb[:detect](train)
kp2, des2 = orb[:compute](train, kp2)

bf = cv2.BFMatcher()
matches = bf[:knnMatch](des1, des2, k=2)

print(matches[1])
print(matches[1][:distance])

打印下面的内容。 matches中只存储了一个DMatch对象。

PyObject <DMatch 0x7fac68b2be50>
305.0639343261719

Python版本:

query = cv2.imread('images/q1.jpg',0)       
train = cv2.imread('images/q2.jpg',0)

orb = cv2.ORB_create()

kp1 = orb.detect(query)
kp1, des1 = orb.compute(query, kp1)

kp2 = orb.detect(train)
kp2, des2 = orb.compute(train, kp2)

bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

print(matches[0])
print(matches[0][0].distance)

打印下面的内容。两个DMatch对象存储在matches

[<DMatch 0x7f0266a47a70>, <DMatch 0x7f0266a47c50>]
305.0639343261719

我的问题是,为什么只有一个DMatch对象存储在我用Julia创建的matches中,但是有两个存储在我用Python创建的那个中,[注意:我需要两个DMatch对象才能成功实现功能匹配,因此Python正确!]以及如何解决问题?

非常感谢任何帮助。

编辑: 为这两个例子写print(matches)给出了以下内容:

朱莉娅:

Any[PyObject <DMatch 0x7ff58c290f90> PyObject <DMatch 0x7ff58c290fb0>
    PyObject <DMatch 0x7ff58c290fd0> PyObject <DMatch 0x7ff58c2bc030>
…
    PyObject <DMatch 0x7ff58c24be10> PyObject <DMatch 0x7ff58c24be30>
    PyObject <DMatch 0x7ff58c24be50> PyObject <DMatch 0x7ff58c24be70>]

在Python中:

[[<DMatch 0x7fcda37c5730>, <DMatch 0x7fcda37c5830>], [<DMatch 0x7fcda37c5650>, <DMatch 0x7fcda37c5610>],... [<DMatch 0x7fcda375f5d0>, <DMatch 0x7fcda375f5f0>], [<DMatch 0x7fcda375f610>, <DMatch 0x7fcda375f630>]]

1 个答案:

答案 0 :(得分:1)

PyCall会将Python中的嵌套列表转换为Julia中的二维数组。例如,

julia> pyeval("[[1, 2], [3, 4]]")
2×2 Array{Any,2}:
 1  2
 3  4

这意味着,在您尝试matches[1]时,要访问第一行,您需要matches[1,:]。要访问第一行的第一个元素,请尝试matches[1,1]

当您执行matches[1]时,Julia会为您提供匹配中的第一个元素,在这种情况下,它是第一行的第一列。

(请注意,打印时,二维数组通常是对齐的,元素用空格分隔,而一维数组没有对齐,元素用逗号分隔。这是一个很好的说法。)