matlab m文件 mex,记录改写MATLAB .m文件为mex文件经过

1、新建项目,项目命名,选择 dll,空项目

2、在源文件添加.def文件,写入语句:

LIBRARY;"Find_conpix_C"

EXPORTS;mexFunction

3、添加 .cpp文件,写mexFunction

4、配置——项目-属性:

(1) C/C++-常规-附加包含目录-添加路径”.\extern\include“——自己找到MATLAB对应安装路径

(2) C/C++-常规-配置管理器-平台-新建-x64——如果生产32位mexw文件则不用这一步骤

(3)链接器-常规-输出文件填”.\Debug\filename.mexw64“——这是生成要用的mexw文件的设置

(4)链接器-常规-附加库目录-添加路径”.\extern\lib\win64\microsoft“——生成32位就找对应的文件夹

(5)链接器-输入-附加依赖项-添加:

libmx.lib libeng.lib libmat.lib libmex.lib

******************************************************************************************************

这是另外一个待改写的函数Center_weight.m:

输入图像和阈值,为所有像素计算与大于阈值像素的距离,进行加权,离大于阈值像素越近,权重越大,输出距离矩阵

function [min_c] = Center_weight( img_in,yu_value )

img_in=mat2gray(img_in);

[h,w]=size(img_in);

[row,col]=find(img_in>yu_value);%    找到所有大于阈值的点,记录坐标

l=length(row);

a(1,:)=row;

a(2,:)=col;

for i0=1:h  %计算图像每个点

for j0=1:w

for i=1:l %与阈值以上所有点

c_store(i)=norm(a(:,i)-[i0;j0]);  %的欧式距离

end

min_c(i0,j0)=min(c_store);%min_c最小欧式距离图

end

end

end

******************************

改写成的mex

#include "mex.h"

#include    //用到了sqrt()

//被调用的子函数:返回数组 a 的最小值

double minum(double * a,int num){

double temp=a[0];

for(int i=0;i

if(temp>a[i])

temp=a[i];

}

return temp;

}

// MEX文件接口函数:计算并输出“距离”矩阵

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

{

int i,j;

double * img_in = mxGetPr(prhs[0]);   //输入图像,得到第一个参数的指针

double yu_value  = *(mxGetPr(prhs[1])); //阈值,第二个参数的指针值

int h=mxGetDimensions(prhs[0])[0];  //得到维度

int w=mxGetDimensions(prhs[0])[1];  //h高,w款

plhs[0] = mxCreateDoubleMatrix( h,w, mxREAL );  //构建矩阵,空间大小弄错MATLAB也会崩溃,闪退

double * min_c=mxGetPr(plhs[0]);    //输出距离矩阵

//统计大于阈值的像素个数

int num=0;

for (i=0;i

for(j=0;j

if(img_in[j*h+i]>yu_value){  //matlab按列数,数完一列数下一列,所以用[j*h+i]索引

num=num+1;

}

}

//为要用到的变量分配空间,如果没有分配空间,MATLAB会崩溃

int *row=(int *)mxCalloc(num,sizeof(int));

int *col=(int *)mxCalloc(num,sizeof(int));

double *c_store=(double *)mxCalloc(num,sizeof(double));

//找大于阈值的像素的坐标

int k=0;

for (i=0;i

for(j=0;j

if(img_in[j*h+i]>yu_value){

row[k]=i;  //横坐标,行

col[k]=j;  //纵坐标,列

k=k+1;

}

}

double temp;

for(i=0;i

for(j=0;j

for(k=0;k

temp=(row[k]-i)*(row[k]-i)+(col[k]-j)*(col[k]-j);

c_store[k]=sqrt(temp);

}

min_c[j*h+i]=minum(c_store,num);  //这个地方也要索引对,按列索引,挨个放

}

mxFree(row);

mxFree(col);

mxFree(c_store);

}

mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) //左个数、左指针;右个数、右指针

mxGetPr()获取参数指针,

*()获取指针值,

mxGetDimensions()获取矩阵维度,

mxCreateDoubleMatrix()构建矩阵

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值