This thread顯示瞭如何轉換CvMat
到mxArray
。儘管它不完全是您正在尋找的轉換代碼,但它非常接近。
這是一個簡單的轉換,您應該能夠調整代碼以使用cv::Mat
而不是CvMat
。如果不能,快速黑客對你的cv::Mat
數據轉換爲CvMat
然後用下面的代碼爲是(從我所建議的鏈接所):
mxArray* CvMat_to_new_mxArr (const CvMat* mat)
{
const int TYPE = cvGetElemType (mat);
// 2-d image
if (CV_64FC1 == TYPE) {
return helper_2dcvmat_to_mat<CV_64FC1> (mat);
}
else if (CV_32FC1 == TYPE) {
return helper_2dcvmat_to_mat<CV_32FC1> (mat);
}
else if (CV_32SC1 == TYPE) {
return helper_2dcvmat_to_mat<CV_32SC1> (mat);
}
else if (CV_16SC1 == TYPE) {
return helper_2dcvmat_to_mat<CV_16SC1> (mat);
}
else if (CV_16UC1 == TYPE) {
return helper_2dcvmat_to_mat<CV_16UC1> (mat);
}
else if (CV_8UC1 == TYPE) {
return helper_2dcvmat_to_mat<CV_8UC1> (mat);
}
else if (CV_8SC1 == TYPE) {
return helper_2dcvmat_to_mat<CV_8SC1> (mat);
}
//Multi-dimensional arrays not supported, yet.
/*
// 3-d image
else if (CV_64FC3 == TYPE) {
return helper_rgbimage_to_mat<IPL_DEPTH_64F> (img);
}
else if (CV_32FC3 == TYPE) {
return helper_rgbimage_to_mat<IPL_DEPTH_32F> (img);
}
else if (CV_8UC3 == TYPE) {
return helper_rgbimage_to_mat<IPL_DEPTH_8U> (img);
}
*/
// unsupported conversion, return null mxArray
return mxCreateDoubleMatrix(0,0,mxREAL);
}
template<int TYPE>
mxArray* helper_2dcvmat_to_mat (const CvMat* mat)
{
void* pBeg;
int pitch;
cvGetRawData(mat, (uchar**)&pBeg,&pitch);
CvSize size = cvGetSize (mat);
const mxClassID cid = cvm_traits<TYPE>::CID;
mxArray* pArrOut =
mxCreateNumericMatrix(size.height,size.width,cid,mxREAL);
void* pBegOut = mxGetData(pArrOut);
typedef mc_traits<cid>::CT T;
pix_iterator_2d<T,eRowWise> it_src1(static_cast<T*>(pBeg),
size.width,size.height,pitch);
pix_iterator_2d<T,eRowWise> it_src2(static_cast<T*>(pBeg),
size.width,size.height,pitch);
it_src2.end();
pix_iterator_2d<T,eColWise> it_dest(static_cast<T*>(pBegOut),
size.width,size.height);
std::copy (it_src1,it_src2,it_dest);
return pArrOut;
}
謝謝。所以在openCV中使用engine.h總是很麻煩,不是嗎?我期待更直接的東西,但如果沒有更簡單的解決方案,我會嘗試這一個。 – 2012-01-12 12:31:58
一個問題。你是否考慮opencv按列存儲數據行和matlab? – 2012-01-12 12:36:35
我必須堅持你打開我建議的線程,並看看那裏提供的** complete **源代碼。根據其他用戶,該代碼有效。但如果沒有,至少是你的開始。 – karlphillip 2012-01-12 15:37:16