多线程下使用C++接口的OpenCV CascadeClassifier

4
我希望能在多个线程中使用CascadeClassifier对象来运行OpenCV C++接口。
我的程序的工作方式是主线程将“some_file.xml”加载到CascadeClassifier对象中。然后会生成三个或更多的线程,并将级联对象传递给它们。但程序很快就会崩溃。我进行了多次测试并得出结论,即在执行“detectmultiscale”函数时,CascadeClassifier对象不是线程安全的。
我希望避免每次生成新线程时都需要从硬盘读取相同的文件。如何避免这种情况发生?
1个回答

4
如果您正在使用存储在新格式中的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();

1
你怎么知道xml文件是不是“新”的格式?它们在最新的版本中是否都转换成了最新的格式? - rossb83
1
所有来自OpenCV的haar级联都以旧格式存储。而且大多数情况下它们将永远不会被转换为新格式(但如果您想,可以编写转换器并进行贡献)。识别新格式的最简单标准-在级联文件中搜索标签<stageType>BOOST</stageType> -这是新格式的必要条件。 - Andrey Kamaev
1
我在哪里可以找到关于编写转换器的两种格式的信息? - rossb83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接