This thread cho thấy làm thế nào để chuyển đổi một CvMat
để mxArray
. Mặc dù nó không chính xác mã chuyển đổi bạn đang tìm kiếm, nó khá gần.
Đây là một chuyển đổi đơn giản và bạn sẽ có thể điều chỉnh mã để hoạt động với cv::Mat
thay vì CvMat
. Nếu bạn không thể, một cách nhanh chóng hack là để chuyển đổi cv::Mat
dữ liệu của bạn để CvMat
và sau đó sử dụng mã dưới đây như là (lấy từ các liên kết tôi đã gợi ý):
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;
}
Cảm ơn. Vì vậy, nó luôn luôn là lộn xộn để sử dụng engine.h với openCV, phải không? Tôi đã mong đợi một cái gì đó trực tiếp hơn, nhưng nếu không có giải pháp đơn giản, tôi sẽ cố gắng này. –
Một câu hỏi. Bạn có xem xét rằng opencv lưu trữ dữ liệu theo hàng và MATLAB theo cột? –
Tôi phải nhấn mạnh rằng bạn mở chuỗi mà tôi đề xuất và xem xét mã nguồn ** hoàn chỉnh ** có sẵn ở đó. Theo những người dùng khác, mã đó hoạt động. Nhưng nếu nó không, ít nhất là một sự khởi đầu cho bạn. – karlphillip