2013-06-21 3 views
4

OpenCV를 사용하여 이미지 프로세싱 응용 프로그램을 구축하고 있습니다. 또한 Armadillo 라이브러리에는 매우 근사한 매트릭스 관련 기능이 있기 때문에 사용하고 있습니다. 문제는 cv :: Mat에 대해 Armadillo 함수를 사용하기 위해 CV :: Mat에서 Arma :: Mat로 자주 변환해야한다는 것입니다. 내가 이력서를 변환 :: 매트를 ARMA에 :: 매트이Armadillo 라이브러리와 함께 OpenCV 라이브러리를 사용하는 가장 좋은 방법은 무엇입니까?

arma::Mat cvMat2armaMat(cv::Mat M) 
{ 
    copy cv::Mat data to a arma::Mat 
    return arma::Mat 
} 

같은 기능을 사용하여이 일을보다 효율적인 방법이 있나요 이러한 목표를 달성하려면?

답변

2

복사를 피하거나 줄이려면 .memptr() 멤버 함수를 통해 아르마딜로 행렬에 사용 된 메모리에 액세스 할 수 있습니다. 예를 들어 당신이 (아르마 여전히 메모리를 관리합니다) 메모리를 직접 무료로 허용하지 않는 한, 위의를 사용하는 경우

mat X(5,6); 
double* mem = X.memptr(); 

은주의해야합니다.

또는 기존 메모리에서 아르마딜로 매트릭스 directly을 생성 할 수 있습니다. 예 :

double* data = new double[4*5]; 
// ... fill data ... 
mat X(data, 4, 5, false); // 'false' indicates that no copying is to be done; see docs 

이 경우 수동으로 메모리를 관리해야합니다.

또한 Armadillo는 행렬을 저장하고 column-major order에 액세스합니다. 열 0이 먼저 저장되고 열 1, 열 2 등이 저장됩니다. 이는 MATLAB, LAPACK 및 BLAS에서 사용 된 것과 동일합니다.

+0

이것은 내가 무엇을 최대 온 드디어 ...'템플릿 ARMA : 매트 cvMat2armaMat (CV : 매트 cvMatIn) {\t \t \t ARMA : 매트 armaConv (cvMatIn.data, cvMatIn. 행, cvMatIn.cols, false); \t \t return armaConv; }' – Vishy

+0

귀하의 코드가 안정적이거나 효율적이라고 생각하지 않습니다. 이 코드는 cvMatIn 행렬을 값으로 전달합니다.이 행렬은 함축적으로 함수 내부에 임시 복사본을 만듭니다. 그런 다음 임시의 기존 메모리에서 바로 아르마딜로 행렬을 만듭니다. C++ 컴파일러에서 RVO (Return Value Optimization)를 사용하는 경우 임시가 삭제되면 코드가 손상되어 메모리가 더 이상 유효하지 않게됩니다. 컴파일러가 RVO를 사용하지 않는 경우 새로 생성 된 것을 복사하여 _another_ 아르마딜로 행렬을 반환합니다. – mtall

+0

cvMatIn으로 전달 된 객체가 생성 된 아르마딜로 행렬만큼 길게 유지되도록하려면 다음 행의 코드가 더 좋을 것입니다. template inline void cvMat2armaMat (const cv :: Mat & cvMatIn) {return arma :: Mat (cvMatIn.data, cvMatIn.rows, cvMatIn.cols, false); }. 보장 할 수 없다면, 마지막 "false"를 생략하십시오. 즉, return arma :: Mat (cvMatIn.data, cvMatIn.rows, cvMatIn.cols); }. 두 경우 모두 Armadillo가 열 우선 순위를 사용한다는 점을 고려해야합니다. cvMatIn이 행 메이저 순서를 사용하고있는 경우, 행렬 요소는 옮겨 놓을 수 있습니다. – mtall

관련 문제