// // 例 5-1 cvPyrSegmentation() #include "stdafx.h" #include <cv.h> #include <highgui.h> void f(IplImage* src,IplImage* dst) { CvMemStorage* storage=cvCreateMemStorage(0); CvSeq* comp=NULL; cvPyrSegmentation(src,dst,storage,&comp,4,200,50); int n_comp=comp->total; printf("comp->total:%d/n",comp->total); for (int i=0;i<n_comp;i++) { CvConnectedComp* cc=(CvConnectedComp*) cvGetSeqElem(comp,i); //........... printf("/n/ncc->area:%f/n",cc->area);//从运行结果里看,cc->area是越来越缩小的 //printf("cc->contour->total: %f/n",cc->contour->total);//不能输出,程序出现错误,未知原因 printf(" cc->rect.height: %f/n",cc->rect.height); printf(" cc->rect.width: %f/n", cc->rect.width); printf(" cc->rect.x: %f/n",cc->rect.x); printf(" cc->rect.y: %f/n",cc->rect.y); printf("cc->value.val: %f/n",cc->value.val); } cvReleaseMemStorage(&storage); } int main(int argc,char** argv) { IplImage* src=cvLoadImage(argv[1],1); IplImage* dst=cvLoadImage(argv[2],1); f(src,dst); cvReleaseImage(&src); cvReleaseImage(&dst); return 0; } //例 5-2 cvThreshold()函数的用法 #include "stdafx.h" #include <cv.h> #include <highgui.h> void sum_rgb(IplImage* src,IplImage* dst) { //逐步跟踪图像 // cvNamedWindow("跟踪器",1); //Allocate individual image planes分配独立的图像平面 IplImage* r=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); IplImage* g=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); IplImage* b=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); // cvShowImage("r",r);//生成的是三个灰色的图像,截图保存为1 // cvShowImage("g",g); // cvShowImage("b",b); //split image onto the color planes截断 cvSplit(src,r,g,b,NULL); // cvShowImage("r",r);//很黑 // cvShowImage("g",g);//亮度比r好点 // cvShowImage("b",b);//很黑的部分变白了,好像是截断了 //temporary storage IplImage* s=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); cvShowImage("s",s);//和之前创建的r,g,b一样,灰色的 //add equally weighted rgb values cvAddWeighted(r,1/3,g,1/3,0,s); // cvShowImage("r",r); // cvShowImage("g",g); // cvShowImage("b",b);//和截断之前的效果一样,没看出来变化 // cvShowImage("s",s);//s是黑压压一片 cvAddWeighted(s,2/3,b,1/3,0,s); // cvShowImage("r",r); // cvShowImage("g",g); // cvShowImage("b",b); //truncate values above 100 截断 cvThreshold(s,dst,100,100,CV_THRESH_TRUNC); // cvShowImage("r",r); // cvShowImage("g",g); // cvShowImage("b",b); cvReleaseImage(&r); cvReleaseImage(&g); cvReleaseImage(&b); cvReleaseImage(&s); // cvDestroyWindow("跟踪器"); } int main(int argc,char** argv) { cvNamedWindow(argv[1],1); IplImage* src=cvLoadImage(argv[1]); IplImage* dst=cvCreateImage(cvGetSize(src),src->depth,1); sum_rgb(src,dst); cvShowImage(argv[1],dst);//灰乎乎一片,还不如在中间跟踪查看呢 while (1) { //if ((cvWaitKey(10)&0x7f)==27)//这样做,按了esc只是关闭了能看见的画面,不能返回到dos下,应该是还有东西在运行 if(cvWaitKey(10)==27) { break; } } cvDestroyWindow(argv[1]); cvReleaseImage(&src); cvReleaseImage(&dst); } //例5-3 另一种组合不同通道,并域值化图像的方法 #include "stdafx.h" #include <cv.h> #include <highgui.h> void sum_rgb(IplImage* src,IplImage* dst) { IplImage* s=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1); IplImage* r=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); IplImage* g=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); IplImage* b=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); cvZero(s); // cvShowImage("cvZero(s)",s);//黑压压一片 cvAcc(b,s); // cvShowImage("cvAcc(b,s)的s",s);//白的 // cvShowImage("cvAcc(b,s)的b",b);//灰的 cvAcc(g,s); // cvShowImage("cvAcc(g,s)的s",s);//白的 // cvShowImage("cvAcc(g,s)的g",g);//灰的 cvAcc(r,s); // cvShowImage("cvAcc(r,s)的s",s);//白的 // cvShowImage("cvAcc(r,s)的r",r);//灰的 cvThreshold(s,s,100,100,CV_THRESH_TRUNC); // cvShowImage("cvThreshold(s,s,100,100,CV_THRESH_TRUNC)之后的s",s);//白的 cvConvertScale(s,dst,1,0); // cvShowImage("cvConvertScale(s,dst,1,0)之后的s",s);//白的 // cvShowImage("cvConvertScale(s,dst,1,0)之后的dst",dst);//灰的 cvReleaseImage(&s); cvReleaseImage(&r); cvReleaseImage(&g); cvReleaseImage(&b); } int main(int argc,char** argv) { cvNamedWindow("lala",1); IplImage* src=cvLoadImage(argv[1],1); IplImage* dst=cvCreateImage(cvGetSize(src),src->depth,1); sum_rgb(src,dst); cvShowImage("src原图像",src); cvShowImage("dst目标图像",dst);//没有观察到结果 while (1) { if(cvWaitKey(10)==27) { break; } } cvReleaseImage(&src); cvReleaseImage(&dst); cvDestroyWindow("lala"); return 0; } //例5-4 单一阈值和自适应阈值 #include "stdafx.h" #include <highgui.h> #include <cv.h> IplImage* Igray=0,*It=0,*Iat; int main(int argc,char** argv) { if (argc!=7) { return -1; } double threshold=(double)atof(argv[1]); int threshold_type=atoi(argv[2])?CV_THRESH_BINARY:CV_THRESH_BINARY_INV; int adaptive_method=atoi(argv[3])?CV_ADAPTIVE_THRESH_MEAN_C:CV_ADAPTIVE_THRESH_GAUSSIAN_C; int block_size=atoi(argv[4]); double offset=(double)atof(argv[5]); if ((Igray=cvLoadImage(argv[6],CV_LOAD_IMAGE_GRAYSCALE))==0) { return -1; } It=cvCreateImage(cvSize(Igray->width,Igray->height),IPL_DEPTH_8U,1); Iat=cvCreateImage(cvSize(Igray->width,Igray->height),IPL_DEPTH_8U,1); cvThreshold(Igray,It,threshold,255,threshold_type); cvAdaptiveThreshold(Igray,Iat,255,adaptive_method,threshold_type,block_size,offset); cvNamedWindow("raw",1); cvNamedWindow("Threshold",1); cvNamedWindow("Adaptive Threshold",1); cvShowImage("Raw",Igray); cvShowImage("Threshold",It); cvShowImage("Adaptive Threshold ",Iat); cvWaitKey(0); cvReleaseImage(&Iat); cvReleaseImage(&Igray); cvReleaseImage(&It); cvDestroyWindow("Raw"); cvDestroyWindow("Threshold"); cvDestroyWindow("Adaptive Threshold"); return 0; }