多线程中的 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++ 接口的主要内容,如果未能解决你的问题,请参考以下文章