gpt4 book ai didi

python - Python 和 Julia 中的 OpenCV、DMatch 对象不匹配

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:13:03 52 4
gpt4 key购买 nike

我正在尝试使用 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

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

非常感谢任何帮助。

编辑:写作 print(matches)对于这两个示例,都给出了以下内容:

在 Julia 中:

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>]]

最佳答案

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 会为您提供 matches 中的第一个元素,在本例中为第一行的第一列。

(注意打印的时候,二维数组通常是对齐的,元素之间用空格分隔,而一维数组是不对齐的,元素之间用逗号分隔,这个很好分辨。)

关于python - Python 和 Julia 中的 OpenCV、DMatch 对象不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37847201/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com