【问题标题】:OpenCV-contrib/Python/Windows: Tracker.write() raises error in matrix_wrap.cpp, Tracker.read() crashes PythonOpenCV-contrib/Python/Windows:Tracker.write() 在 matrix_wrap.cpp 中引发错误,Tracker.read() 使 Python 崩溃
【发布时间】:2020-05-04 16:12:08
【问题描述】:

我已将其发布为 issue on GitHub opencv_contrib,但尚未收到任何回复。

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

我想在 Windows 上使用 Python 中的 Tracker 类,似乎在 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 与 int)或者它是一个空的空指针) .”,到目前为止,我已经对她施加了足够的时间。有人可以查看 C++ 代码以了解问题所在,以及为什么它可以在 Linux 上运行而不是在 Windows 上运行吗?

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

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

【问题讨论】:

    标签: python c++ windows opencv opencv-contrib


    【解决方案1】:

    这看起来像是 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。使用命令pip install opencv-contrib-python==3.3.0.9安装的OpenCV


    编辑 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')
    

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2017-08-23
      相关资源
      最近更新 更多