Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
ImageProcess.cpp
Upload User: whhzxy
Upload Date: 2022-01-20
Package Size: 7k
Code Size: 6k
Category:
OpenCV
Development Platform:
C/C++
- #include <cv.h>
- #include <highgui.h>
- #include <math.h>
- //#include <stdlib.h>
- #include <stdio.h>
- int main(int argc, char* argv[])
- {
- IplImage *src = 0; //定义源图像指针
- IplImage *src_smooth = 0; // define the smooth image pointer;
- IplImage *tmp = 0; //定义临时图像指针
- IplImage *src_back = 0; //定义源图像背景指针
- IplImage *dst_gray = 0; //定义源文件去掉背景后的目标灰度图像指针
- IplImage *dst_bw = 0; //定义源文件去掉背景后的目标二值图像指针
- IplImage *dst_contours = 0; //定义轮廓图像指针
- IplConvKernel *element = 0; //定义形态学结构指针
- int Number_Object =0; //定义目标对象数量
- int contour_area_tmp = 0; //定义目标对象面积临时寄存器
- int contour_area_sum = 0; //定义目标所有对象面积的和
- int contour_area_ave = 0; //定义目标对象面积平均值
- int contour_area_max = 0; //定义目标对象面积最大值
- CvMemStorage *stor = 0;
- CvSeq * cont = 0;
- CvContourScanner contour_scanner;
- CvSeq * a_contour= 0;
- // 【读取和显示图像】
- // the first command line parameter must be image file name
- if ( argc == 2 && (src = cvLoadImage(argv[1], -1))!=0 )
- {
- }
- else
- {
- src = cvLoadImage("d:\rice.png", 0);
- }
- cvNamedWindow( "src", CV_WINDOW_AUTOSIZE );
- cvShowImage( "src", src );
- // 【平滑图像】
- src_smooth = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
- // 输入图像,输出图像,平滑方法,参数1234
- //cvSmooth(src, src_smooth, CV_BLUR, 3,3, 0, 0);
- //cvSmooth(src, src_smooth, CV_MEDIAN, 3, 3, 0, 0);
- //cvSmooth(src, src_smooth, CV_GAUSSIAN, 3, 3, 0, 0);
- cvSmooth(src, src_smooth, CV_BILATERAL, 10,10,30,30);//效果最好,保留轮廓滤除噪声;
- //display the smooth image;
- cvNamedWindow( "src_smooth", CV_WINDOW_AUTOSIZE );
- cvShowImage( "src_smooth", src_smooth );
- // 【估计图像背景】
- tmp = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
- src_back = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
- element = cvCreateStructuringElementEx( 4, 4, 1, 1, CV_SHAPE_ELLIPSE, 0);//创建结构元素
- //用该结构对源图象进行数学形态学的开操作后,估计背景亮度
- //事实上,先腐蚀再膨胀就是把图像去掉了,事实上,可以作同位操作,下面两种做法都可以,但似乎不对称操作效果更好;
- //cvErode( src_smooth, tmp, element, 12);//先腐蚀
- //cvDilate( tmp, src_back, element, 12);//再膨胀
- cvErode( src_smooth, src_back, element, 20);//先腐蚀
- cvDilate( src_back, src_back, element, 60);//再膨胀
- cvNamedWindow( "src_back", CV_WINDOW_AUTOSIZE );
- cvShowImage( "src_back", src_back );
- //【从源图象中减区背景图像】
- dst_gray = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
- cvSub( src_smooth, src_back, dst_gray, 0);//计算两个数组每个元素的差
- cvNamedWindow( "dst_gray", CV_WINDOW_AUTOSIZE );
- cvShowImage( "dst_gray", dst_gray );
- //【使用阀值操作将图像转换为二值图像】
- dst_bw = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
- cvThreshold( dst_gray, dst_bw ,50, 255, CV_THRESH_BINARY ); //取阀值为50把图像转为二值图像
- //cvAdaptiveThreshold( dst_gray, dst_bw, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5 );
- cvNamedWindow( "dst_bw", CV_WINDOW_AUTOSIZE );
- cvShowImage( "dst_bw", dst_bw );
- // 【检查图像中的目标对象数量】
- stor = cvCreateMemStorage(0);//创建内存块,默认值64K大小
- cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), stor); //创建序列
- //在二值图像中寻找轮廓
- //二值图像(cvThreshold二值化),内存,序列,
- Number_Object = cvFindContours( dst_bw, stor, &cont, sizeof(CvContour),
- //轮廓提取方法(提取所有轮廓),轮廓逼近方法(只保留末端像素点),像素偏移量
- CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );
- printf("Number_Object: %dn", Number_Object);
- //【计算图像中对象的统计属性】
- dst_contours = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
- cvThreshold( dst_contours, dst_contours ,0, 255, CV_THRESH_BINARY ); //在画轮廓前先把图像变成白色
- //两种写法,可以省略cont->first为;
- //for(;cont;cont=cont->h_next)
- for(cont->first;cont;cont=cont->h_next)
- {
- //绘制当前轮廓
- cvDrawContours( dst_contours, cont, CV_RGB(255, 255,255), CV_RGB(0, 0, 255), 0, 1, 8, cvPoint(0, 0) );
- //cvContourArea 计算整个轮廓或部分轮廓的面积
- //轮廓,感兴趣的轮廓(部分)的起始点(CvSlice为序列分割,默认为整个序列/轮廓)
- //cvContourArea( const CvArr* contour,CvSlice slice CV_DEFAULT(CV_WHOLE_SEQ))
- contour_area_tmp = fabs(cvContourArea( cont, CV_WHOLE_SEQ )); //获取当前轮廓面积
- if( contour_area_tmp > contour_area_max )
- {
- contour_area_max = contour_area_tmp; //找到面积最大的轮廓
- }
- contour_area_sum = contour_area_sum+contour_area_tmp; //求所有轮廓的面积和
- }
- contour_area_ave = contour_area_sum/ Number_Object; //求出所有轮廓的平均值
- printf("contour_area_ave: %dn", contour_area_ave );
- printf("contour_area_max: %dn", contour_area_max );
- printf("contour_area_total: %dn",contour_area_sum);
- cvNamedWindow( "dst_contours", CV_WINDOW_AUTOSIZE );
- cvShowImage( "dst_contours", dst_contours );
- //等待退出,如果是0或负数,随便用键盘按某个键,退出,执行下面的程序;
- //如果是某个正数,则等待 XXX毫秒退出,此处为等待1s。
- //cvWaitKey(1000);
- //下面则是特定按键 ESC才退出,注意要用到while{}
- while(1){
- int key = cvWaitKey(0);
- if(key==27){break;}
- }
- cvReleaseImage(&src);
- cvReleaseImage(&src_smooth);
- cvReleaseImage(&tmp);
- cvReleaseImage(&src_back);
- cvReleaseImage(&dst_gray);
- cvReleaseImage(&dst_bw);
- cvReleaseImage(&dst_contours);
- cvReleaseMemStorage(&stor);
- cvDestroyWindow( "src" );
- cvDestroyWindow("src_smooth");
- cvDestroyWindow( "src_back" );
- cvDestroyWindow( "dst_gray" );
- cvDestroyWindow( "dst_bw" );
- cvDestroyWindow( "dst_contours" );
- //void cvDestroyAllWindows(void);
- return 0;
- }