Jav*_*ock 7 c++ opencv image-processing matlab-engine
我想在c ++代码中使用"engine.h"将Matrix发送到Matlab.事实是我在cv :: Mat中有数据,我需要发送一个mxArray.我试图使用这个表达式,但它不起作用:
cv::Mat _priorP;
_priorP = Mat::eye(13, 13, CV_32FC1);
mxArray *mat;
mat = mxCreateDoubleMatrix(13, 13, mxREAL);
memcpy(mxGetPr(mat),_priorP.data, 13*13*sizeof(double));
Run Code Online (Sandbox Code Playgroud)
有人知道进行转换的正确方法吗?任何帮助都会被贬低.谢谢.
编辑
我发现了这种方式:https: //stackoverflow.com/a/8848711/744859
Ale*_*xey 10
Kota Yamaguchi在http://github.com/kyamagu/mexopencv开发了一个库. 该软件包包含一个C++类(称为MxArray),可在Matlab的本机数据类型(mxArray)和OpenCV数据类型之间进行转换.该库直接支持OpenCV的C++ API(Open CV 2.0及更高版本),因此无需进行额外的转换(例如从cvMat到cv :: Mat或从IplImage到cv :: Mat).样品用法:
#include "mexopencv.hpp" // include the library
#include "highgui.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
cv::Mat image;
image = imread("filename"); // read an image from file
plhs[0] = MxArray(image); // convert from cv::Mat to mxArray
}
Run Code Online (Sandbox Code Playgroud)
而已.确保将mex函数与库中的MxArray.cpp文件一起编译; 你可以在MATLAB命令行中这样做:
mex yourmexfile.cpp MxArray.cpp
Run Code Online (Sandbox Code Playgroud)
该线程展示了如何将 a 转换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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6070 次 |
最近记录: |