2011-09-02 2 views
4

여러 스레드에서 CascadeClassifier 개체를 사용하여 OpenCV C++ 인터페이스를 실행하고 싶습니다.OpenCV CascadeClassifier 다중 스레드에서의 C++ 인터페이스

내 프로그램의 작동 방식은 내 메인 스레드가 "some_file.xml"을 CascadeClassifier 개체로로드하는 것입니다. 세 개 이상의 스레드가 생성되고 캐스케이드 개체가 전달됩니다. 프로그램은 곧 그 후 충돌합니다. 몇 가지 테스트를 수행했으며 "detectmultiscale"함수를 수행 할 때 CascadeClassifier 객체가 스레드로부터 안전하지 않다고 결론지었습니다.

새 스레드가 생성 될 때마다 동일한 파일을 하드 드라이브에서 읽지 않아도됩니다. 어떻게 피할 수 있습니까?

답변

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와 함께 제공되는 모든 하얼 폭포는 이전 형식으로 저장됩니다. 그리고 아마 그들은 새로운 형식으로 변환되지 않을 것입니다 (그러나 당신이 원한다면 변환기를 작성하고 기여할 수 있습니다). 새로운 형식을 식별하는 가장 간단한 기준 - 캐스케이드 파일에서 ' BOOST'태그를 검색하십시오 - 새로운 형식에서는 필수 항목입니다. –

+1

변환기를 작성하는 두 가지 형식에 대한 정보는 어디에서 찾을 수 있습니까? – rossb83

관련 문제