【发布时间】:2020-02-19 11:02:30
【问题描述】:
我正在使用在 Matlab 中编码的特征匹配算法。我使用 Matlab 的库编译器为 C++ 创建了共享库。
结果,我得到了一个由 n 个特征点和点坐标 x,y(n 行,2 列)组成的 mwArray。现在我想将 mwArray 转换为 std::vector<double> 甚至更好的 std::vector<cv::Point2d>,这样我就可以继续了。
我尝试使用GetData() 方法,但我不知道必须使用哪些参数。
代码如下:
mclmcrInitialize();
//const char *args[] = { "-nojvm" };
//const int count = sizeof(args) / sizeof(args[0]);
if (!mclInitializeApplication(NULL, 0)) {
std::cerr << "Could not initialize the application properly" << std::endl;
return -1;
}
if (!MatchingInitialize()) {
std::cerr << "Could not initialize the library properly" << std::endl;
return -1;
}
else {
try {
// Create the output arrays
mwArray FSC_1, FSC_2, NBCS_1, NBCS_2;
mwArray path_1 = "C:\\test\\img_1.jpg";
mwArray path_2 = "C:\\test\\img_2.jpg";
Matching(1, FSC_1, FSC_2, NBCS_1, NBCS_2, path_1, path_2);
// Output that works
std::cout << "The value is " << FSC_1 << std::endl;
// Conversions I tried
double *FSC_1_Copy = mxGetPr(FSC_1.GetData());
std::vector<double> FSC_1_Copy = FSC_1.GetData();
std::vector<double> data_copy;
FSC_1.GetData(data_copy, FSC_1.RowIndex());
}
catch (const mwException& e) {
std::cerr << e.what() << std::endl;
return -2;
}
catch (...) {
std::cerr << "Unexpected error thrown" << std::endl;
return -3;
}
MatchingTerminate();
}
【问题讨论】:
-
在 C++ 中,我这样做:
float * var_C= static_cast<float *>(mxGetData(var_matlab));。也许与std::vector<double>类似的东西是可能的。我怀疑你可以投到Point2D。 -
@ThomasSablik 是的,我在添加评论时意识到,我的错误,我之前是用 C 做的。
-
尝试类似
double *FSC_1_Copy = static_cast<double *>(mxGetData(FSC_1));我得到错误no suitable conversion function from "mwArray" to "const mwArray" exists -
我看不懂代码。
FSC_1.GetData()应该有返回类型void。此参考是否正确:de.mathworks.com/help/compiler_sdk/cxx/mwarray.html?double *FSC_1_Copy = new double[FSC_1.NumberOfElements()]; FSC_1.GetData(FSC_1_Copy, FSC_1.NumberOfElements()); delete[] FSC_1_Copy; -
你也可以试试
std::vector<double> FSC_1_Copy(FSC_1.NumberOfElements()); FSC_1.GetData(FSC_1_Copy.data(), FSC_1.NumberOfElements());
标签: c++ matlab opencv shared-libraries feature-extraction