python - OpenCV-contrib/Python/Windows:Tracker.write()在matrix_wrap.cpp中引发错误,Tracker.read()使Python崩溃

标签 python c++ windows opencv opencv-contrib

我已将其发布为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中访问算法参数的唯一方法是通过从.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的 friend ,她为我确认,此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会直接崩溃到命令提示符-根本没有错误消息。我想这是一个密切相关的问题。

    我 friend 的评价是“据我所知,在Windows中创建的Mat对象是错误的数据类型(它是否具有额外的维数或类型(即float与int)还是空的空指针)。”,到目前为止,我已经把她的时间强加给她了。有人可以调查一下C++代码以查看发生了什么问题,以及为什么它可以在Linux而不是Windows上运行吗?

    在寻找类似问题时,我认为#2393看起来有点熟悉,但Mat类的表现不如预期。

    [注意:这是我第一次打开问题,我不懂C++或使用VS(我得到了很多帮助来进行重新编译!),而且我仍在学习Python,希望OpenCV团队能够支持像我这样的Python最终用户访问跟踪算法参数,即使他们除了Windows之外别无选择。 :-) 谢谢。]

    最佳答案

    这看起来像是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')
    

    关于python - OpenCV-contrib/Python/Windows:Tracker.write()在matrix_wrap.cpp中引发错误,Tracker.read()使Python崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59793004/

    相关文章:

    c++ - 使用默认网络摄像头的 API?

    windows - 最新版本 Chromium Embedded Framework 3

    python - Hyperledger Indy 节点配置错误导致错误,并显示一条消息: "undefined symbol: indy_crypto_init_logger"

    python - 以视觉可读的方式将张量写入文件

    python - 如何将csv文件中的所有列更改为str?

    c++ - 在 C++ 中比较两个 std::strings

    c++ - std::aligned_storage 的分配目标(堆栈或堆?)

    python - 在 Pandas 中按整数天计算滚动平均值

    c# - C# 和 C++ 中的可选参数

    windows - Windows 上的线程堆栈大小 (Visual C++)