opencv matlab 混合编程,matlab C++混合编程——opencv

Canny边缘检测

C++代码

#include

#include

#include

/*

nlhs 输出参数个数

plhs 输出参数指针

nrhs 输入参数个数

prhs 输入参数指针

*/

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

//获取输入矩阵的行、列

int rows = mxGetM(prhs[0]);

int cols = mxGetN(prhs[0]);

//获取输入图像的指针

unsigned char* img_ptr = (unsigned char*)mxGetPr(prhs[0]);

//实例化Mat, 注意,matlab中数据是按列存储的,但是C++ opencv中图像是按行存放的,因此

//在构造图像时候,构造为图像的转置,然后对图像进行一次转置就得到opencv中真实图像

cv::Mat image = cv::Mat(cols, rows, CV_8UC1, img_ptr);

cv::Mat image_;

cv::transpose(image, image_);

//Canny边缘检测

cv::Mat dst;

cv::Canny(image_, dst, 20, 50);

plhs[0] = mxCreateNumericMatrix_700(rows, cols, mxClassID::mxUINT8_CLASS, mxComplexity::mxREAL);

cv::Mat dst_ = cv::Mat(rows, cols, CV_8UC1, (unsigned char*)(mxGetPr(plhs[0])));

cv::transpose(dst, dst_);

//cv::imshow("canny", dst);

//cv::waitKey(0);

}

matlab测试代码

clear;

clc;

image = imread('F:\\lena\\lena_gray.jpg');

canny_img = compute_canny(image);

imshow(canny_img)

f6a5e565ac3d

image.png

Sobel边缘检测

C++代码

#include

#include

#include

//https://blog.csdn.net/shaoxiaohu1/article/details/8269690

//https://blog.csdn.net/u012978091/article/details/51138505

void mexFunction(

int nlhs, /* number of expected outputs */

mxArray *plhs[], /* array of pointers to output arguments */

int nrhs, /* number of inputs */

const mxArray *prhs[] /* array of pointers to input arguments */

) {

/*

判断matlab传入的数据类型,图像要求uint8

*/

if (!mxIsUint8(prhs[0])) {

std::runtime_error("Image data must be uint8 type!");

}

/*

将matlab中的图像转换为opencv Mat对象指针

*/

cv::Ptr<:mat> image = ocvMxArrayToImage_uint8(prhs[0]);

/*

Sobel

*/

cv::Mat dx, dy;

cv::Sobel(*image.get(), dx, -1, 1, 0);

cv::Sobel(*image.get(), dy, -1, 0, 1);

/*

oepncv Mat 转换为matlab中mxArray

*/

plhs[0] = ocvMxArrayFromMat_uint8(dx);

plhs[1] = ocvMxArrayFromMat_uint8(dy);

}

matlab测试代码

clear;

clc;

image = imread('F:\\lena\\lena_gray.jpg');

[sobel_dx_img, sobel_dy_img] = compute_sobel(image);

figure(2)

subplot(1,3,1)

imshow(image)

subplot(1,3,2)

imshow(sobel_dx_img)

subplot(1,3,3)

imshow(sobel_dy_img)

f6a5e565ac3d

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值