12.4.3 图像识别(4)
实现图像处理、识别和药丸计数的程序代码如下:
- Engine *ep;
- mxArray *count=NULL; //定义mxArray类型变量指针
- double *Result; //定义double变量指针
- if(!(ep=engOpen(NULL)))
- ::MessageBox(NULL,"不能启动MATLAB engine"," Visual C++(www.cppentry.com)调用matlab engine示例程序",MB_OK);
- engeva lString(ep,"[FileName,PathName] = uigetfile('*.*','选择二值图像文件');");
- engeva lString(ep,"imfile = strcat(PathName,FileName);");
- engeva lString(ep,"I=imread(imfile);");
- engeva lString(ep,"i=rgb2gray(I);");
- engeva lString(ep,"F0=imadjust(i,stretchlim(i),[0 1]);");
- engeva lString(ep,"Ft=medfilt2(F0,[5 5]);");
- engeva lString(ep,"level=graythresh(Ft);");
- engeva lString(ep,"BW=im2bw(Ft,level);");
- engeva lString(ep,"BW1=edge(BW,'sobel',0.3);");
- engeva lString(ep,"se90=strel('line',7,90);");
- engeva lString(ep,"se0=strel('line',7,0);");
- engeva lString(ep,"BW2=imdilate(BW1,[se90,se0]);");
- engeva lString(ep,"BW3=imfill(BW2,'holes');");
- engeva lString(ep,"BW4=imclearborder(BW3,4);");
- engeva lString(ep,"[labeled numpills]=bwlabel(BW4,4);");
- count = engGetVariable(ep,"numpills");
- Result = mxGetPr(count);
- CString Result_str;
- int m_intResult;
- m_intResult = (int)(Result[0]+0.5); //double转换为整型
- Result_str.Format( "%d ",m_intResult); //整型转换为CString型
- SetDlgItemText(IDC_EDIT1,Result_str); //计数结果写到Edit控件上面
- ::MessageBox(NULL,"按下任意键继续"," Visual C++(www.cppentry.com)调用matlab引擎",MB_OK);
- engClose(ep);
程序编译运行后的主界面如图12.19所示。单击"计数结果"按钮,将在Edit控件上显示计数结果为10,和直接使用MATLAB进行统计的数据结果相符合。
|
| 图12.19 程序主界面 |