OpenCV-contrib / Python / Windows: Tracker.write () вызывает ошибку в matrix_wrap. cpp, Tracker.read () вылетает Python - PullRequest
0 голосов
/ 17 января 2020

Я опубликовал это как проблему на GitHub opencv_contrib и пока не получил ответа.

Информация о системе (версия)
  • OpenCV => 4.2.0
  • Операционная система / Платформа => Windows 10, 64-битный
  • Компилятор => Visual Studio 16 2019
  • Python => 3.7.6 с использованием Anaconda
Подробное описание

Я хотел бы использовать классы Tracker от Python до Windows, и, похоже, в Python единственный способ получить доступ к параметрам алгоритма - записать / прочитать объект Tracker в / из Файл .yaml. Когда я пытаюсь Tracker.write(), я получаю cv2.error. Вот мой тестовый пример:

Действия по воспроизведению
import cv2
import os

#Display OpenCV version
print(f"OpenCV version: {cv2.__version__}")

#Create tracker object
tracker = cv2.TrackerCSRT_create()

settings_file = "settings.yaml"

#Delete settings file if it exists
if os.path.isfile(settings_file): os.remove(settings_file)

#Create FileNode
fs = cv2.FileStorage(settings_file,cv2.FILE_STORAGE_WRITE)

#Write defaults
tracker.write(fs)

#Release file
fs.release()

Когда я попробовал это (Python 3.7.6, OpenCV 4.2.0… с предварительно упакованными двоичными файлами или при перестройке из исходного кода), он не удался на строка tracker.write(fs) с этим сообщением:

Traceback (most recent call last): File "<stdin>", line 1, in <module> cv2.error: OpenCV(4.2.0) C:\Users\dick\OpenCV\opencv-4.2.0\modules\core\src\matrix_wrap.cpp:112: error: (-213:The function/feature is not implemented) You should explicitly call mapHost/unmapHost methods for ogl::Buffer object in function 'cv::_InputArray::getMat_'

В немного другом тесте я получил это сообщение об ошибке:

Traceback (most recent call last): File "<stdin>", line 5, in <module> cv2.error: OpenCV(4.2.0) C:\Users\dick\OpenCV\opencv-4.2.0\modules\core\src\matrix_wrap.cpp:130: error: (-213:The function/feature is not implemented) Unknown/unsupported array type in function 'cv::_InputArray::getMat_'

У меня есть подруга, которая более опытна в C ++ / Linux / Visual Studio, чем я, и она подтвердила для меня, что этот tracker.write() отлично работает на Linux, записывая файл .yaml, как и при использовании tracker.read() для прочитайте его обратно следующим образом:

#Read in the settings
fs_settings = cv2.FileStorage(settings_file,cv2.FILE_STORAGE_READ)
tracker.read(fs_settings.root())

#Release file
fs_settings.release()

Когда я пытаюсь tracker.read() с заведомо исправным файлом .yaml, Python вылетает прямо в командную строку - сообщений об ошибках нет вообще. Я предполагаю, что это тесно связанный вопрос.

Оценка моего друга звучала так: «Насколько я могу судить, в Windows создаваемый объект Mat имеет неправильный тип данных (имеет ли он дополнительное измерение или неправильный). типа (то есть float vs int) или это пустой нулевой указатель). ", и я наложил на нее время вполне достаточно для этого момента. Может кто-нибудь, пожалуйста, загляните в код C ++, чтобы увидеть, что идет не так, и, возможно, почему он работает на Linux, а не Windows?

При поиске подобных проблем я подумал, что # 2393 выглядел несколько знакомым где класс Mat вел себя не так, как ожидалось.

[Примечание: это мой первый раз, когда я открываю проблему, я не бегло говорю на C ++ или использую VS (я получил большую помощь для выполнения перекомпиляция!), и я все еще изучаю Python - я надеюсь, что команда OpenCV поддержит Python конечных пользователей, таких как я, для доступа к параметрам алгоритма отслеживания, даже если у них нет выбора, кроме Windows. :-) Спасибо.]

...