多线程中的 OpenCV CascadeClassifier C++ 接口

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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> - 对于新格式是强制性的。 在哪里可以找到有关这两种格式的信息来编写转换器?

以上是关于多线程中的 OpenCV CascadeClassifier C++ 接口的主要内容,如果未能解决你的问题,请参考以下文章

多线程 OpenCV 程序

OpenCV C++ 多线程

OpenCV 多线程 (Windows/.NET) 从视频捕获延迟几秒钟

如何编译openCV以保证单线程?

在多线程应用程序中使用 opencv waitKey()

OpenCV C++ 多线程提高帧率