Объекты OpenCV, DMatch в Python и Julia не совпадают

Я пытаюсь реализовать метод сопоставления объектов с использованием OpenCV, но перевод из версии Python в Julia не совпадает:

Методы абсолютно одинаковые и используют одни и те же изображения для обработки. ([:method] это просто стандартное соглашение для доступа к определенному типу метода в Джулии, так что не обманывайте себя! Кроме того, индексирование Юлии начинается с 1, а не с 0, поэтому эти два набора операторов печати должен дают тот же результат, но они этого не делают.)

Юлия версия:

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 хранится в 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>]]

2

Решение

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]Юлия дает вам первый элемент в совпадениях, который в этом случае является первым столбцом первой строки.

(Обратите внимание, что при печати двумерные массивы обычно выравниваются, а элементы разделяются пробелами, а одномерные массивы не выравниваются, а элементы разделяются запятыми. Это хороший способ сказать.)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]