В настоящее время я использую API Mex C ++, чтобы сделать снимок с помощью камеры Basler (Pylon API) и отправить его обратно в Matlab. У меня есть некоторые проблемы с преобразованием типа данных opencv cv :: mat в подходящий тип для Matlab. Решения, предоставляемые Matlab (https://de.mathworks.com/help/vision/ug/opencv-interface.html) для преобразования типов данных opencv, к сожалению, работают только со старыми mex c api, поэтому я не могу их использовать.
Я справился со следующим обходным решением. Этот обходной путь использует двадва цикла присваивают значения matlab :: data :: TypedArray. Это решение очень медленное из-за двух циклов. Может кто-нибудь порекомендовать другой способ, который быстрее или работает без циклов? См. фрагмент кода из моего mex-файла c ++ с nemex c ++ API:
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <pylon/PylonIncludes.h>
#include <pylon/usb/PylonUsbIncludes.h>
#include <pylon/usb/BaslerUsbInstantCamera.h>
#include <pylon/PylonUtilityIncludes.h>
#include "mex.hpp"
#include "mexAdapter.hpp"
#include <chrono>
#include <string>
class MexFunction : public matlab::mex::Function{
public:
MexFunction(){}
void operator()(ArgumentList outputs, ArgumentList inputs) {
CGrabResultPtr ptrGrabResult
... Here I take a picture with the camera and save it to "ptrGrabResult"...
Mat openCvImage;
CImageFormatConverter formatConverter;
CPylonImage pylonImage;
// First convert the "ptrGrabResult" to a pylonImage
formatConverter.Convert(pylonImage, ptrGrabResult);
// Convert it to a openc picture
Mat openCvImage = cv::Mat(ptrGrabResult->GetHeight(), ptrGrabResult->GetWidth(), CV_8UC1,(uint8_t *)pylonImage.GetBuffer(), Mat::AUTO_STEP);
const size_t rows = openCvImage.rows;
const size_t cols = openCvImage.cols;
matlab::data::TypedArray<uint8_t> Yp = factory.createArray<uint8_t>({ rows, cols });
for(int i = 0 ;i < openCvImage.rows; ++i){
for(int j = 0; j < openCvImage.cols; ++j){
// [Row][Coloumn] = (row, column)
Yp[i][j] = openCvImage.at<uint8_t>(i,j);;
}
}
outputs[0] = Yp;
}
}
Проблема с этим решением в том, что оно занимает слишком много времени для меня. Есть ли более быстрый и удобный способ приведения типа cv: mat без цикла ?? Можно использовать указатель в этом случае, но я не смог реализовать это ...
У кого-нибудь есть предложения?