Как вернуть изображение Opencv cv :: mat в Matlab с помощью Mex C ++ API - PullRequest
0 голосов
/ 07 октября 2019

В настоящее время я использую 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 без цикла ?? Можно использовать указатель в этом случае, но я не смог реализовать это ...

У кого-нибудь есть предложения?

...