如何通过 mex return OpenCV C++ Mats 的向量到 MatLab
How to return a vector of OpenCV C++ Mats to MatLab via mex
我有一个 C++ 的 OpenCV 程序,它需要一个大垫子和 returns 一个较小垫子的向量,我试图在 MatLab 中使用 mex(特别是 mexOpenCV 来自这里:https://github.com/kyamagu/mexopencv ).
例如,我可以简单地使用 plhs[0]=MxArray(theMats[0]) 将单个 Mat 放回 plhs[0],但是我如何 return 整个向量?
谢谢!
#include "mexopencv.hpp"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
// Check number of arguments
nargchk(nlhs<=1 && nrhs==1);
// Convert mxArray to cv::Mat
cv::Mat mat = MxArray(prhs[0]).toMat();
std::vector<cv::Mat> theMats;
int ySize = 400;
int xSize = 400;
int yStride = ySize;
int xStride = xSize;
int cols = (mat.cols-xSize)/xStride + 1;
int rows = (mat.rows-ySize)/yStride + 1;
for (int i=0; i<cols; i++){
for (int j=0; j<rows; j++){
cv::Rect crop(cv::Point(i*xStride,j*yStride),
cv::Point(i*xStride+xSize, j*yStride+ySize));
theMats.push_back(mat(crop));
}
}
// Convert cv::Mat back to mxArray
plhs[0] = MxArray(theMats[0]); //I want theMats, not just theMats[0]
}
在一般情况下,每个 cv::Mat 可能具有不同的大小,将每个 cv::Mat 作为矩阵返回并将集合作为元胞数组返回可能是您唯一且最好的选择:
https://www.mathworks.com/help/matlab/apiref/mxcreatecellarray.html
如果每个 cv::Mat 的大小都相同,您还可以将 cv::Mat 的集合作为 N 维数字矩阵返回,其中一个维度是每个 cv::Mat其余维度是每个 cv::Mat 对象的维度。
我有一个 C++ 的 OpenCV 程序,它需要一个大垫子和 returns 一个较小垫子的向量,我试图在 MatLab 中使用 mex(特别是 mexOpenCV 来自这里:https://github.com/kyamagu/mexopencv ). 例如,我可以简单地使用 plhs[0]=MxArray(theMats[0]) 将单个 Mat 放回 plhs[0],但是我如何 return 整个向量?
谢谢!
#include "mexopencv.hpp"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
// Check number of arguments
nargchk(nlhs<=1 && nrhs==1);
// Convert mxArray to cv::Mat
cv::Mat mat = MxArray(prhs[0]).toMat();
std::vector<cv::Mat> theMats;
int ySize = 400;
int xSize = 400;
int yStride = ySize;
int xStride = xSize;
int cols = (mat.cols-xSize)/xStride + 1;
int rows = (mat.rows-ySize)/yStride + 1;
for (int i=0; i<cols; i++){
for (int j=0; j<rows; j++){
cv::Rect crop(cv::Point(i*xStride,j*yStride),
cv::Point(i*xStride+xSize, j*yStride+ySize));
theMats.push_back(mat(crop));
}
}
// Convert cv::Mat back to mxArray
plhs[0] = MxArray(theMats[0]); //I want theMats, not just theMats[0]
}
在一般情况下,每个 cv::Mat 可能具有不同的大小,将每个 cv::Mat 作为矩阵返回并将集合作为元胞数组返回可能是您唯一且最好的选择:
https://www.mathworks.com/help/matlab/apiref/mxcreatecellarray.html
如果每个 cv::Mat 的大小都相同,您还可以将 cv::Mat 的集合作为 N 维数字矩阵返回,其中一个维度是每个 cv::Mat其余维度是每个 cv::Mat 对象的维度。