我正在尝试使用OpenCV实现功能匹配方法,但是从Python版本到Julia的翻译不匹配:
方法完全相同,并且使用相同的图像进行处理。 ([:method]
只是用于访问Julia中特定类型方法的标准约定,因此请不要上当!而且,Julia索引从1开始,而不是从0开始,因此这两组print语句应产生相同的结果,但它们却不会')
朱莉娅版本:
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])
打印以下内容。仅一个DMatch对象存储在
matches
中。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创建的一个print(matches)
中,[注意:我需要两个DMatch对象才能成功实现功能匹配,因此Python 1是正确的!],如何解决该问题?任何帮助深表感谢。
编辑:
为这两个示例编写
[[<DMatch 0x7fcda37c5730>, <DMatch 0x7fcda37c5830>], [<DMatch 0x7fcda37c5650>, <DMatch 0x7fcda37c5610>],... [<DMatch 0x7fcda375f5d0>, <DMatch 0x7fcda375f5f0>], [<DMatch 0x7fcda375f610>, <DMatch 0x7fcda375f630>]]
可以得到以下结果:在朱莉娅:
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中:
ojit_code
最佳答案
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将为您提供match中的第一个元素,在这种情况下,它是第一行的第一列。(请注意,在打印时,二维数组通常是对齐的,元素之间用空格隔开,而一维数组不是对齐的,元素之间用逗号隔开。这是一种很好的判断方法。)