gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:37:07 28 4
gpt4 key购买 nike

我已将其发布为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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com