Я опубликовал это как проблему на 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. :-) Спасибо.]