【发布时间】:2015-06-11 11:34:00
【问题描述】:
我创建了一个 Matlab 引擎来将 OpenCV Mat 文件转换为 Matlab 矩阵。但是,我得到了错误的结果。我附上了我的代码,以便您可以直接测试它。
#pragma comment (lib, "libmat.lib")
#pragma comment (lib, "libmx.lib")
#pragma comment (lib, "libmex.lib")
#pragma comment (lib, "libeng.lib")
void cvLoadMatrixToMatlab(const Mat& m, const string name, Engine *m_pEngine)
{
int rows=m.rows;
int cols=m.cols;
string text;
mxArray *T=mxCreateDoubleMatrix(cols, rows, mxREAL);
memcpy((char*)mxGetPr(T), (char*)m.data, rows*cols*sizeof(char));
engPutVariable(m_pEngine, name.c_str(), T);
text = name + "=" + name + "'"; // Column major to row major
engEvalString(m_pEngine, text.c_str());
mxDestroyArray(T);
}
int main(int argc, char **argv)
{
/*Open Matlab Engine*/
Engine *m_pEngine;
m_pEngine = engOpen("null");
cv::Mat img = imread("panda.jpg",0);
cvLoadMatrixToMatlab(img,"imgMatlab", m_pEngine);
engEvalString(m_pEngine, "imshow(imgMatlab)");
cv::waitKey(0);
}
我怀疑下面的代码会导致这个问题,但我不知道如何解决。
memcpy((char*)mxGetPr(T), (char*)m.data, rows*cols*sizeof(char));
【问题讨论】:
-
如果我没记错的话,
memcpy会以行主要格式复制数据。您可能应该做的是在执行memcpy之前先转置矩阵。这样,即使复制是以行为主的,在执行以行为主的读出时,数据也会以列为主的格式排列。 -
嘿@rayryeng。感谢您的回复。我尝试将 transpose 放在 memcpy 函数的前面,但它仍然无法正常工作。您是否能够修改我的代码,以便我可以最终对其进行测试。谢谢!
标签: c++ matlab opencv matrix mixed-programming