【OpenCV学习笔记4】OpenCV GUI 之VCWin32+OpenCV 实现细胞计数

OpenCV GUI 之VC WIn32+OpenCV 实现细胞计数

SkySeraph Mar 19th 2011  HQU

Email:zgzhaobo@gmail.com    QQ:452728574

Latest Modified Date:Mar 19th 2011 HQU

 
  
1 #include " iostream "
2   using namespace std;
3
4 #include " highgui.h "
5 #include " cv.h "
6
7   #pragma comment(lib,"cv.lib")
8   #pragma comment(lib,"cxcore.lib")
9 #pragma comment(lib,"highgui.lib")
10
11 /* ------------------------------------------------------------------ */
12
13 int main( int argc, char ** argv)
14 {
15
16 /* -------------------------------------------//
17 //功能:载入图像
18 //原型:IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
19 //参数:
20 flags:指定读入图像的颜色和深度,指定的颜色可将输入图像转换为以下三种格式
21 3通道(CV_LOAD_IMAGE_COLOR)也即彩色(>0),
22 单信道 (CV_LOAD_IMAGE_GRAYSCALE)也即灰色(=0),
23 保持不变(CV_LOAD_IMAGE_ANYCOLOR)(<0)
24 深度指定输入的图像是否转为每个颜色信道每象素8位
25 如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR
26 //------------------------------------------- */
27 char * fileName = argc == 2 ? argv[ 1 ] : ( char * ) " rice.png " ; // "lena.jpg";
28 IplImage * src = 0 ;
29 // 原色彩
30 src = cvLoadImage(fileName, - 1 );
31 // 3通道
32 // src=cvLoadImage(fileName,1);
33 // 灰度
34 // src=cvLoadImage(fileName,0);
35 //
36 if ( ! src)
37 {
38 cout << " Could not load image file! " << endl;
39 return - 1 ;
40 // exit(0);
41 }
42
43 /* -------------------------------------------//
44 //功能:创建窗口
45 //原型:int cvNamedWindow( const char* name, int flags=CV_WINDOW_AUTOSIZE );
46 //参数:CV_WINDOW_AUTOSIZE为1,表示窗口自动调整以适合图像
47 为0时,表示自动按上一次使用的窗口尺寸
48 //------------------------------------------- */
49 cvNamedWindow( " src " , 1 );
50 cvNamedWindow( " dst " , 1 );
51
52 /* -------------------------------------------//
53 //功能:改变窗口大小
54 //原型:void cvResizeWindow( const char* name, int width, int height );
55 //参数:\\
56 //------------------------------------------- */
57 cvResizeWindow( " src " , 512 , 512 );
58 cvResizeWindow( " dst " , 512 , 512 );
59
60 /* -------------------------------------------//
61 //功能:移动窗口,不重叠
62 //原型:void cvMoveWindow( const char* name, int x, int y );
63 //参数:x、y:窗口左上角的x、y坐标
64 //------------------------------------------- */
65 cvMoveWindow( " src " , 0 , 0 );
66 cvMoveWindow( " dst " , 200 , 200 );
67
68 /* -------------------------------------------//
69 //功能:指定窗口中显示图像
70 //原型:void cvShowImage( const char* name, const CvArr* image );
71 //------------------------------------------- */
72 cvShowImage( " src " ,src);
73
74 /* -------------------------------------------//
75 //功能:保存图像
76 //原型:int cvSaveImage( const char* filename, const CvArr* image );
77 //参数:图像格式的的取决于扩展名
78 //------------------------------------------- */
79 cvSaveImage( " rice.jpg " ,src);
80 cvSaveImage( " rice.bmp " ,src);
81
82 /* -------------------------------------------//
83 //功能:图像反转
84 //说明:仅是测试用
85 //------------------------------------------- */
86 // 定义工作位图
87 IplImage * dst = cvCreateImage(cvGetSize(src),src -> depth,src -> nChannels);
88 cvCopy(src,dst); // dst已经创建
89 // 获取图像信息
90 int height,width,step,channels;
91 uchar * data;
92 height = dst -> height;
93 width = dst -> width;
94 step = dst -> widthStep; // 排列的行字节数
95 channels = dst -> nChannels;
96 data = (uchar * )dst -> imageData; // 图像数据 char *imageData;
97 // 反转图像
98 for ( int i = 0 ;i < height;i ++ )
99 {
100 for ( int j = 0 ;j < width;j ++ )
101 {
102 for ( int k = 0 ;k < channels;k ++ )
103 {
104 data[i * step + j * channels + k] = 255 - data[i * step + j * channels + k];
105 }
106 }
107 }
108 // 显示
109 cvShowImage( " dst " ,dst);
110 // 释放资源
111 cvReleaseImage( & dst);
112
113 /* -------------------------------------------//
114 //功能:图像背景估计
115 //说明:
116 //------------------------------------------- */
117 // 创建工作位图
118 IplImage * tmp = 0 ; // 定义临时图像指针
119 IplImage * src_back = 0 ; // 定义源图像背景指针
120 tmp = cvCreateImage( cvGetSize(src), src -> depth, src -> nChannels);
121 src_back = cvCreateImage( cvGetSize(src), src -> depth, src -> nChannels);
122 // 创建结构元素
123 IplConvKernel * element = 0 ; // 定义形态学结构指针
124 element = cvCreateStructuringElementEx( 4 , 4 , 1 , 1 , CV_SHAPE_ELLIPSE, 0 );
125 // 用该结构对源图象进行数学形态学的开操作后,估计背景亮度
126 cvErode( src, tmp, element, 10 );
127 cvDilate( tmp, src_back, element, 10 );
128 cvNamedWindow( " src_back " , CV_WINDOW_AUTOSIZE );
129 cvShowImage( " src_back " , src_back );
130
131 /* -------------------------------------------//
132 //功能:从源图象中减去背景图像
133 //说明:
134 //------------------------------------------- */
135 IplImage * dst_gray = 0 ; // 定义源文件去掉背景后的目标灰度图像指针
136 dst_gray = cvCreateImage( cvGetSize(src), src -> depth, src -> nChannels);
137 cvSub( src, src_back, dst_gray, 0 );
138 cvNamedWindow( " dst_gray " , CV_WINDOW_AUTOSIZE );
139 cvShowImage( " dst_gray " , dst_gray );
140
141 /* -------------------------------------------//
142 //功能:使用阀值操作将图像转换为二值图像
143 //说明:
144 //------------------------------------------- */
145 IplImage * dst_bw = 0 ; // 定义源文件去掉背景后的目标二值图像指针
146 dst_bw = cvCreateImage( cvGetSize(src), src -> depth, src -> nChannels);
147 cvThreshold( dst_gray, dst_bw , 50 , 255 , CV_THRESH_BINARY ); // 取阀值为50把图像转为二值图像
148
149 // cvAdaptiveThreshold( dst_gray, dst_bw, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5 );
150
151 cvNamedWindow( " dst_bw " , CV_WINDOW_AUTOSIZE );
152 cvShowImage( " dst_bw " , dst_bw );
153
154 /* -------------------------------------------//
155 //功能:检查图像中的目标对象数量
156 //说明:
157 //------------------------------------------- */
158 int Number_Object = 0 ; // 定义目标对象数量
159 CvMemStorage * stor = 0 ;
160 CvSeq * cont = 0 ;
161 CvContourScanner contour_scanner;
162 CvSeq * a_contour = 0 ;
163 stor = cvCreateMemStorage( 0 );
164 cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof (CvSeq), sizeof (CvPoint), stor);
165 Number_Object = cvFindContours( dst_bw, stor, & cont, sizeof (CvContour), \
166 CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint( 0 , 0 ) ); // 找到所有轮廓
167
168 printf( " Number_Object: %d\n " , Number_Object);
169
170 /* -------------------------------------------//
171 //功能:计算图像中对象的统计属性
172 //说明:
173 //------------------------------------------- */
174 IplImage * dst_contours = 0 ; // 定义轮廓图像指针
175 int contour_area_tmp = 0 ; // 定义目标对象面积临时寄存器
176 int contour_area_sum = 0 ; // 定义目标所有对象面积的和
177 int contour_area_ave = 0 ; // 定义目标对象面积平均值
178 int contour_area_max = 0 ; // 定义目标对象面积最大值
179 dst_contours = cvCreateImage( cvGetSize(src), src -> depth, src -> nChannels);
180 cvThreshold( dst_contours, dst_contours , 0 , 255 , CV_THRESH_BINARY_INV); // 在画轮廓前先把图像变成白色
181
182 for (; cont; cont = cont -> h_next)
183 {
184 cvDrawContours( dst_contours, cont, CV_RGB( 255 , 0 , 0 ), CV_RGB( 255 , 0 , 0 ), 0 , 1 , 8 , cvPoint( 0 , 0 ) ); // 绘制当前轮廓
185
186 contour_area_tmp = fabs(cvContourArea( cont, CV_WHOLE_SEQ )); // 获取当前轮廓面积
187
188 if ( contour_area_tmp > contour_area_max )
189 {
190 contour_area_max = contour_area_tmp; // 找到面积最大的轮廓
191
192 }
193 contour_area_sum += contour_area_tmp; // 求所有轮廓的面积和
194
195 }
196 contour_area_ave = contour_area_sum / Number_Object; // 求出所有轮廓的平均值
197
198 printf( " contour_area_ave: %d\n " , contour_area_ave );
199 printf( " contour_area_max: %d\n " , contour_area_max );
200 cvNamedWindow( " dst_contours " , CV_WINDOW_AUTOSIZE );
201 cvShowImage( " dst_contours " , dst_contours );
202
203 /* -------------------------------------------//
204 //功能:等待
205 //原型:int cvWaitKey( int delay=0 );
206 //参数:参数<=0表示不自动返回
207 //注意:需要周期地被调用,除非HighGUI被用在某些能够处理事件的环境中。如在MFC环境下,这个函数不起作用
208 //------------------------------------------- */
209 cvWaitKey( 0 );
210
211 /* -------------------------------------------//
212 //功能:销毁窗口、释放资源
213 //原型:void cvDestroyAllWindows(void);
214 //------------------------------------------- */
215 cvDestroyAllWindows();
216 cvReleaseImage( & src);
217 cvReleaseImage( & tmp);
218 cvReleaseImage( & src_back);
219 cvReleaseImage( & dst_gray);
220 cvReleaseImage( & dst_bw);
221 cvReleaseImage( & dst_contours);
222 cvReleaseMemStorage( & stor);
223 cvDestroyWindow( " src " );
224 cvDestroyWindow( " src_back " );
225 cvDestroyWindow( " dst_gray " );
226 cvDestroyWindow( " dst_bw " );
227 cvDestroyWindow( " dst_contours " );
228
229 return 0 ;
230
231 }

参考资料:

http://www.opencv.org.cn/forum/download/file.php?id=761 【源码】

Author:         SKySeraph

Email/GTalk: zgzhaobo@gmail.com    QQ:452728574

From:         http://www.cnblogs.com/skyseraph/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值