【问题标题】:OpenCV CascadeClassifier C++ Interface in Multiple Threads多线程中的 OpenCV CascadeClassifier C++ 接口
【发布时间】:2011-09-02 15:10:00
【问题描述】:

我想在多个线程中使用 CascadeClassifier 对象运行 OpenCV C++ 接口。

我的程序的工作方式是我的主线程将“some_file.xml”加载到 CascadeClassifier 对象中。产生三个或更多线程,并将它们传递给级联对象。该程序很快就崩溃了。我做了几个测试,得出的结论是 CascadeClassifier 对象在执行“detectmultiscale”函数时不是线程安全的。

我希望避免每次产生新线程时都必须从硬盘读取相同的文件。如何避免这种情况?

【问题讨论】:

    标签: c++ multithreading opencv


    【解决方案1】:

    如果您使用 LBP 级联或 Haar 级联以新格式存储,那么您可以避免从文件系统中为每个新线程读取级联:

    将级联加载到内存中:

    cv::FileStorage fs(path_to_cascade_file, cv::FileStorage::READ);
    if (!fs.isOpened())
        HandleError();
    

    接下来将 fs 对象传递给每个新线程并创建 CascadeClassifier 对象:

    cv::CascadeClassifier cc;
    if (!cc.read(fs.getFirstTopLevelNode())
        HandleError2();
    

    【讨论】:

    • 如何知道 xml 文件是否为“新”格式?它们是否都转换为最新版本中的最新格式?
    • OpenCV 附带的所有 haar 级联都以旧格式存储。而且很可能它们永远不会转换为新格式(但如果你愿意,你可以编写一个转换器并做出贡献)。识别新格式的最简单标准 - 在级联文件中搜索标签 <stageType>BOOST</stageType> - 对于新格式是强制性的。
    • 在哪里可以找到有关这两种格式的信息来编写转换器?
    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2018-06-22
    • 1970-01-01
    • 2014-02-08
    • 2021-12-28
    相关资源
    最近更新 更多