2011-09-02 96 views
4

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

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

我想避免每次产生新线程时都必须从硬盘读取相同的文件。这怎么可以避免?

回答

3

如果您正在使用的存储在新格式哈尔级联那么就可以避免从文件系统中读取级联为每个新线程LBP级联工作:

装载级联到内存:

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级联都以旧格式存储。而且他们很可能永远不会被转换为新的格式(但如果你想要的话,你可以写一个转换器并贡献)。识别新格式的最简单标准 - 在级联文件中搜索标签' BOOST' - 对于新格式是强制性的。 –

+1

从哪里可以找到关于这两种格式的信息来编写转换器? – rossb83