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()构建矩阵