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
}
같은 기능을 사용하여이 일을보다 효율적인 방법이 있나요 이러한 목표를 달성하려면?
이것은 내가 무엇을 최대 온 드디어 ...'템플릿 ARMA : 매트 cvMat2armaMat (CV : 매트 cvMatIn) {\t \t \t ARMA : 매트 armaConv (cvMatIn.data, cvMatIn. 행, cvMatIn.cols, false); \t \t return armaConv; }' –
Vishy
귀하의 코드가 안정적이거나 효율적이라고 생각하지 않습니다. 이 코드는 cvMatIn 행렬을 값으로 전달합니다.이 행렬은 함축적으로 함수 내부에 임시 복사본을 만듭니다. 그런 다음 임시의 기존 메모리에서 바로 아르마딜로 행렬을 만듭니다. C++ 컴파일러에서 RVO (Return Value Optimization)를 사용하는 경우 임시가 삭제되면 코드가 손상되어 메모리가 더 이상 유효하지 않게됩니다. 컴파일러가 RVO를 사용하지 않는 경우 새로 생성 된 것을 복사하여 _another_ 아르마딜로 행렬을 반환합니다. – mtall
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