【OpenCV学习笔记4】OpenCV GUI 之VCWin32+OpenCV 实现细胞计数
生活随笔
收集整理的這篇文章主要介紹了
【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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,請尊重作者的
轉載于:https://www.cnblogs.com/skyseraph/archive/2011/03/19/1988685.html
總結
以上是生活随笔為你收集整理的【OpenCV学习笔记4】OpenCV GUI 之VCWin32+OpenCV 实现细胞计数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c/c++对象模型大总结:第5-8章、数
- 下一篇: Win32 窗口篇(1)