2012-04-27 2 views
1

컴퓨터 비전 어플리케이션에 opencv C++ API를 사용하고 cv :: Mat 구조로 매트릭스를 관리합니다. Opencv는 ref 카운팅을 사용하여 생성 된 객체를 cv :: Mat로 릴리즈합니다. 더 구체적인 기계 학습 알고리즘을 위해 libshogun을 사용합니다. Shogun은 SGMatrix라는 자체 행렬 구조를 가지고 있습니다. 나는 이력서에서 SGMatrix를 초기화 :: 매트를 같이 : 내가 좋아하는 장군의 lib에 다른 개체를 사용할 때매트릭스 (dis) 할당

cv::Mat cvmat(100,100,CV_32FC1,cv::Scalar(0.0)); 
SGMatrix<float> sgmatrix((float*)cvmat.data, cvmat.rows, cvmat.cols); 

내 문제는 다음과 같습니다 장군이 생성 행렬을 소유하고 지금 예정이다

CSimpleFeatures<float>* features = new CSimpleFeatures<float>(sgmatrix); 

features으로, 나는 런타임에 opencv가 shogun에 의해 이미 풀어 놓은 cvmat을 해제하려고 할 때 오류가 발생합니다. 어떻게 처리 할 수 ​​있습니까? 나는 매트릭스를 복제하고 싶지 않다.

+0

참고 : cvmat 객체에 대한 참조를 추가하려했지만 동일한 오류가 발생했습니다. Opencv가 아닌 쇼군. *** glibc가 발견되었습니다. ***/home/eric/dev/(...) : 이중 자유 또는 손상 (아웃) : 0x0000000000a2f1c0 *** ======= Backtrace : ======== = /usr/local/lib/libshogun.so.12 – Eric

답변

2

OpenCV 외부에서 Shogun 또는 new/malloc을 사용하여 매트릭스 내부 메모리를 할당하십시오. 그런 다음 이전에 할당 한 매트릭스 데이터에 대한 포인터로 void* 포인터를 사용하는 생성자 중 하나를 사용하여 매트릭스를 만듭니다. 이렇게하면 데이터에 대한 opencv 헤더가 만들어집니다.

그런 식으로, opencv는 행렬 내부의 데이터를 소유하지 않으며, cv::Mat 객체가 해제 될 때 해제하지 않을 것이라고 알고 있습니다.

+0

이 오류는 쇼군이 제공합니다. 하지만 당신의 요점을 봅니다. – Eric

+0

글쎄, 실제로 2 가지 문제가있다. (쇼군에서는 1 개의 가짜 할당 해제, 1은 "유용한 데이터를 공개하지 못하게하는 방법"을 의미한다.). 나는 문제 # 2에 대한 대답을 가지고 있으며 여전히 # 1을 찾을 필요가있다. 어쩌면 쇼군은 뒤에서 데이터를 수정하거나 헤더의 일부 opencv 필드를 지우고 opencv가 뭔가 잘못되었다고 판단 할 수있다. – sansuiso

3

Shogun은 SGMatrix 및 simplefeature 객체가 삭제 되 자마자 매트릭스를 할당 해제합니다. 사용을 피하려면

SGMatrix<float> sgmatrix((float*)cvmat.data, cvmat.rows, cvmat.cols, false); 

이렇게하면 메모리 할당을 처리해야합니다!