如何返回Opencv形象简历:垫与墨西哥人Matlab c++ API

32视图(30天)
我目前使用墨西哥人c++ API与巴斯勒相机拍照(塔API)并将其发送回Matlab。转换一个opencv的简历:我有一些问题:垫为Matlab数据类型到合适的类型。Matl万博 尤文图斯ab提供的解决方案( https://de.mathworks.com/help/vision/ug/opencv-interface.html ),不幸的是只有使用opencv转换数据类型老墨西哥人c api,所以我不能使用它们。
我有以下解决方案管理。这种方法使用两个循环两个的值分配给一个matlab::数据::TypedArray。这个解决方案是非常缓慢的,由于两个循环和值的副本。有人能推荐另一种方法更快或没有循环工作?看到从我的c++墨西哥人文件提取代码与ne墨西哥人c++ API:
#包括< opencv2 /核心/ core.hpp >
#包括< opencv2 / opencv.hpp >
#包括<塔/ PylonIncludes.h >
#包括<塔/ usb / PylonUsbIncludes.h >
#包括<塔/ usb / BaslerUsbInstantCamera.h >
#包括<塔/ PylonUtilityIncludes.h >
#包括“mex.hpp”
#包括“mexAdapter.hpp”
#包括<空间>
#包括<字符串>
MexFunction:公共matlab::墨西哥人:函数{
公众:
MexFunction () {}
无效操作符()(ArgumentList输出,ArgumentList输入){
CGrabResultPtrptrGrabResult
我拍照的相机,将其保存到“ptrGrabResult”…
openCvImage;
CImageFormatConverterformatConverter;
CPylonImagepylonImage;
/ /第一次转换“ptrGrabResult”pylonImage
formatConverter。转换(pylonImage ptrGrabResult);
/ /将其转换一个openc图片
openCvImage =简历::垫(ptrGrabResult - >获得(),ptrGrabResult - > GetWidth (), CV_8UC1, (uint8_t *) pylonImage.GetBuffer(),垫::AUTO_STEP);
常量size_t行= openCvImage.rows;
常量size_t关口= openCvImage.cols;
matlab::数据::TypedArray < uint8_t > Yp =工厂。createArray < uint8_t >({行,关口});
(int i = 0;我< openCvImage.rows;+ + i) {
(int j = 0;j < openCvImage.cols;+ + j) {
/ /(行)[Coloumn] =(行、列)
Yp[我][j] = openCvImage.at < uint8_t > (i, j);;
}
}
输出[0]= Yp;
}
}
这个解决方案的问题是,这对我来说时间太长。有更快更方便的方法来投简历:没有一个循环垫类型? ?或者可以使用指针在这种情况下,但我无法实现这个…

答案(2)

崔
2022年9月19日
编辑: 2022年9月19日
您可以使用opencv ptr指针将简历::垫/ matlab矩阵,例如,matlab矩阵转化opencv垫类型如下:
/ /将matlab矩阵opencv垫,反之亦然,fishEyeImgMatlab图像矩阵,oriImg简历::垫吗
简历:垫oriImg;
boolis3Channels = fishEyeImg.getDimensions () [2] = = 3;
如果(is3Channels)
{
oriImg =简历::垫::0 (oriImgS CV_8UC3);
(size_t我= 0;我< fishEyeImg.getDimensions () [0];我+ +){
简历:Vec3b *数据= oriImg.ptr <简历::Vec3b >(我);
(size_t j = 0;j < fishEyeImg.getDimensions () [1];j + +) {
数据[j] =简历::Vec3b ((uchar) fishEyeImg[我][j] [2], (uchar) fishEyeImg[我][j] [1], (uchar) fishEyeImg[我][j] [0]);
}
}
}
其他的
{
oriImg =简历::垫::0 (oriImgS CV_8UC1);
(size_t我= 0;我< fishEyeImg.getDimensions () [0];我+ +){
uchar *数据= oriImg.ptr < uchar >(我);
(size_t j = 0;j < fishEyeImg.getDimensions () [1];j + +) {
数据[j] = (uchar) fishEyeImg[我][j];
}
}
}
引用:

崔
2022年9月20日
编辑: 2022年9月20日
也许这些可以帮助你如果你使用MATLAB2022a或更高版本。
uchar*数据= openCvImage.data;
matlab::数据::TypedArray < uint8_t > Yp =工厂。createArray({rows, cols},data,data+rows*cols,MemoryLayout::ROW_MAJOR);
R2022a以来,添加了“inputLayout”参数语法创建数组。
模板< typename ItType typename T >
TypedArray < T > createArray (ArrayDimensions退去,
ItType开始,
ItType结束,
InputLayout InputLayout)
引用:

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!