首页 > 解决方案 > 如何在 Visual Studio 和 C++ 中使用 emxArray_cell_wrap_0?

问题描述

我用于编码器的 Matlab 脚本是:

function [B,N]=run_bwboundaries(im)
if coder.target('MATLAB')
else
    coder.rowMajor;
    [B,~,N]=bwboundaries(im);
end

我希望 run_bwboundaries 接受任何尺寸的图像,例如 25x 52 图像的 100x100 图像

我在 Matlab 中尝试了以下操作:

ARGS=cell(1,1);
ARGS{1}=coder.typeof(0, [Inf,Inf], [1,1]);
codegen -config:dll run_bwboundaries -args ARGS -report

然后我在生成的头文件 run_bwboundaries.h 中看到:

 extern void run_bwboundaries(const emxArray_real_T *im, emxArray_cell_wrap_0 *B, double *N)

但是当我在 C++ 中尝试以下操作时,我得到unhandled exception access violation reading location error

run_bwboundaries_initialize();
cv::Mat im=cv::imread("input.bmp");
vector<vector<double>> imvec=matTo2Dvec(im);
double **temp;
temp=new double*[im.rows];
for(int i=0;i<im.rows;i++){
    temp[i]=new double[im.cols];
    for(int j=0;j<im.rows;j++){
        temp[i][j]=imvec[i][j];
    }
}
double* mat_ptr=&temp[0][0];
emxArray_real_T *emx = emxCreateWrapper_real_T(mat_ptr, im.rows, im.cols);
double N=0;
emxArray_cell_wrap_0 *pCW = emxCreate_cell_wrap_0(0,1);
run_bwboundaries(emx, pCW, &N);
std::cout << "N is " << N << "\n";

标签: c++opencv

解决方案


嗯……

1. for(int i=0;i<im.rows;i++) - for(int j=0;j<im.rows;j++)

行和行?也许行和列?

  1. 尝试在内存中创建线性数组:

    run_bwboundaries_initialize();
    cv::Mat im=cv::imread("input.bmp", cv::IMREAD_GRAYSCALE);
    cv::Mat dblIm;
    im.convertTo(dblIm, CV_64FC1, 255, 0);
    emxArray_real_T *emx = emxCreateWrapper_real_T(static_cast<double*>(dblIm.data), im.rows, im.cols);
    double N=0;
    emxArray_cell_wrap_0 *pCW = emxCreate_cell_wrap_0(0,1);
    run_bwboundaries(emx, pCW, &N);
    std::cout << "N is " << N << "\n";
    

推荐阅读