1

我已将此作为问题发布在 GitHub opencv_contrib 上,但尚未收到任何回复。

系统信息(版本)
  • OpenCV => 4.2.0
  • 操作系统/平台 => Windows 10、64 位
  • 编译器 => Visual Studio 16 2019
  • Python => 3.7.6,使用 Anaconda
详细说明

我想在 Windows 上使用 Python 中的 Tracker 类,似乎在 Python 中访问算法参数的唯一方法是向 .yaml 文件写入/读取 Tracker 对象。当我尝试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 与 int)或者它是一个空的空指针)。”,到目前为止,我已经把她的时间强加给了她足够多的时间。有人可以查看 C++ 代码,看看出了什么问题,也许为什么它可以在 Linux 上运行,而不是在 Windows 上运行?

在四处寻找类似问题时,我认为 #2393 看起来有些熟悉,其中 Mat 类的行为不如预期。

[注:这是我第一次打开问题,我不熟练使用 C++ 或使用 VS(我在重新编译时得到了很多帮助!),我还在学习 Python——我希望 OpenCV 团队会支持像我这样的 Python 最终用户访问跟踪算法参数,即使他们别无选择,只能 Windows。:-) 谢谢。]

4

1 回答 1

0

这看起来像是 OpenCV 中几个月/几年的错误。以下代码对我来说也崩溃了opencv-contrib-python版本4.2.0.343.4.9.33

import cv2
tracker = cv2.TrackerMedianFlow_create()
tracker.save('tracker_params.yaml')
# or tracker.save('tracker_params.json')

但是,当我使用旧版本3.3.0.9时,它工作得很好,作为证明,这里是我的 YAML 文件的内容:

%YAML:1.0
---
my_object:
   pointsInGrid: 10
   winSize: [ 3, 3 ]
   maxLevel: 5
   termCriteria_maxCount: 20
   termCriteria_epsilon: 2.9999999999999999e-01
   winSizeNCC: [ 30, 30 ]
   maxMedianLengthOfDisplacementDifference: 10.

我也听说这个问题在 Linux 中不存在,但尚未验证自己。

我的规格:Windows 10 Python 3.6.8,. 使用命令安装 OpenCVpip install opencv-contrib-python==3.3.0.9


编辑 1:以下是哪个版本的 OpenCV 工作/失败与此错误的摘要:

3.2.0.7
3.2.0.8

3.3.0.9 pass
3.3.0.10
3.3.1.11

3.4.0.12 pass
3.4.0.14
3.4.1.15
3.4.2.16 pass
3.4.2.17
3.4.3.18
3.4.4.19 pass
3.4.5.20 pass
3.4.6.27 pass
3.4.7.28 fail
3.4.8.29 fail
3.4.9.31 fail
3.4.9.33

4.0.0.21 pass
4.0.1.23
4.0.1.24
4.1.0.25 pass
4.1.1.26 fail
4.1.2.30 fail
4.2.0.32
4.2.0.34 fail

我没有尝试没有通过/失败标签的版本。


编辑 2:现在使用版本3.4.6.27。对于从 YAML/JSON 文件设置配置,以下方式有效:

import cv2
tracker = cv2.TrackerCSRT_create()
file_name = 'tracker_params.yaml'

tracker.save(file_name)  # Dump tracker configuration to YAML file

# ---- Pause here. Open the YAML file and modify any parameter

# Read the parameters from saved YAML file
fp = cv2.FileStorage(file_path, cv2.FILE_STORAGE_READ)  # Read file
tracker.read(fp.getFirstTopLevelNode())  # Do not use: tracker.read(fp.root())

# Your tracker now has update configuration parameters. Verify it like this:
tracker.save('updated_tracker_params.yaml')
于 2020-07-02T15:05:51.317 回答