Я пытаюсь реализовать метод сопоставления объектов с использованием 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>]]
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]
Юлия дает вам первый элемент в совпадениях, который в этом случае является первым столбцом первой строки.
(Обратите внимание, что при печати двумерные массивы обычно выравниваются, а элементы разделяются пробелами, а одномерные массивы не выравниваются, а элементы разделяются запятыми. Это хороший способ сказать.)
Других решений пока нет …