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/

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

转载于:https://www.cnblogs.com/skyseraph/archive/2011/03/19/1988685.html

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

  1. OpenCV学习笔记(6)基于 VC+OpenCV+DirectShow 的多个摄像头同步工作

    因项目需要采集2个摄像头的数据进行双目检测,一开始采用以下代码来测试: #include "stdafx.h" #include <cv.h> #include < ...

  2. OpenCV学习笔记(三十四)——OpenCV路在何方

    之前做了haartraining的东西,感觉到OpenCV里面实现的东西还不是很好,这个老版本的haartraining的东西在新版本仍然是用老版本的函数来实现的,让我很不爽.于是好期待下一版本的到来 ...

  3. Opencv学习笔记_计算机视觉是什么?Opencv的起源

    从0开始学习"OPENCV"第一天-概述 在学习任何一门新的语言或者框架时都应该了解这个行业的背景知识,正所谓工欲善其事,必先利其器! 一.Opencv概述 1.      什么是 ...

  4. 【openCV学习笔记】在Mac上配置openCV步骤详解

    (1)安装Homebrew:(需要Ruby) 注:因为snow leopard 以后已经自带Ruby了,所有可以不用自己安装Ruby. 看一下Homebrew的官网: http://mxcl.gith ...

  5. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  6. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  7. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  8. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  9. OpenCV学习笔记(一):Win10(x64)+Qt5.8(MSVC2013)+OpenCV3.1.0配置过程

    OpenCV学习笔记(一):Win10(x64)+Qt5.8(MSVC2013)+OpenCV3.1.0配置过程 Win10(x64)+Qt5.8(MSVC2013)+OpenCV3.1.0配置过程 ...

  10. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

最新文章

  1. php mysql 无法查询中文名字_PHP连接MySQL查询中文时显示Notice: Trying to get property of non-object...
  2. Spring集成Mybatis配置映射文件方法详解
  3. ECMAScript 函数--修改对象
  4. python123测验答案第二周温度转换二_python123练习题
  5. FPGA 闪烁LED
  6. 鸟哥linux命令行总结之——文件的压缩打包和备份
  7. 黑马程序员--多线程
  8. 中国社科中外合作办学双证博士创新与领导力管理学博士
  9. [python][转载]opencv-python横向纵向拼接图片
  10. 一卡难求,什么时候才能买到原价显卡?
  11. cdb.exe的利用
  12. 一分钟看懂深度学习中的准确率(Accuracy)、精度(Precision)、召回率(Recall)和 mAP
  13. 用JS去掉IE窗口的标题栏,工具栏,地址栏
  14. ubuntu从零到一跑通ORB_SLAM2及其ORBSLAM2_with_pointcloud稠密建图
  15. donald knuth --图灵奖获奖者
  16. 【GPU加速】安装pycuda异常:Failed to build pycuda ERROR: Could not build wheels for pycuda, which is requir
  17. MT6260与MT6261mt6261设计资料汇总
  18. 2023软件测试面试全方位话术,你想要的全都有
  19. 南阳农运会于2012年9月16日开幕
  20. Android对话框(普通对话框、单选对话框、多选对话框、进度条对话框)

热门文章

  1. DataGridView 判断新增行:
  2. 在LINUX环境中,哪种文件系统存储更安全?
  3. 软件开发的比喻:园艺
  4. 【Android架构师java原理详解】二;反射原理及动态代理模式
  5. 吴恩达后,其钦点的百度研究院院长林元庆也离职筹备AI创业
  6. 【Python】Python 过滤列表
  7. JAX-RS 方式的 RESTful Web Service 开发
  8. 架构无小事:QQ碰微信 贴吧遇微博
  9. 学习Unix/Linux编程要学些什么
  10. javascript模块化之CommonJS、AMD、CMD、UMD、ES6