opencv常用函数备忘

 //显示图片

1 IplImage * src = cvLoadImage("xx.JPG");
2 cvNamedWindow("show_image",1);
3 cvShowImage("show_image",src);
4 cvWaitKey(0);
5 cvReleaseImage(&str);
6 cvDestroyWindow("show_image");

 

 //色彩空间转换,转换类型为CV_BGR2GRAY

1 IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,1);
2 cvCvtColor(src,dst,CV_BGR2GRAY);
3  

 //开、闭、膨胀、腐蚀操作

1 IplConvKernel* element = cvCreateStructuringElementEx(3,3,0,0, CV_SHAPE_ELLIPSE,0);//创建3*3椭圆结构元素 
2 IplImage * temp=cvCreateImage(cvGetSize(pGrayImg), IPL_DEPTH_8U, 1 );
3 cvMorphologyEx(pGrayImg,pGrayImg, temp, element,CV_MOP_CLOSE,1);//闭操作 先膨胀再腐蚀
4 cvMorphologyEx(pGrayImg,pGrayImg, temp, element,CV_MOP_OPEN,1);//开操作 先腐蚀再膨胀
5 cvReleaseStructuringElement(&element);
6 cvReleaseImage(&temp);
7 cvDilate(  pGrayImg, pGrayImg, NULL, 1);//膨胀
8 cvErode( pGrayImg, pGrayImg, NULL, 1);//腐蚀

 

//边缘检测

cvCanny(pGrayImg,pGrayImg, 200, 220, 3 );//边缘检测  

 

 

 

//二值图像中检索轮廓

1 int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,int header_size=sizeof(CvContour),int mode=CV_RETR_LIST,int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) ); 

http://blog.csdn.net/augusdi/article/details/9000893

 

//二值图像中找圆、椭圆拟合

 1 //椭圆拟合
 2 void my_FitEllipse(CvSeq *pContour, CvBox2D *box_rect)
 3 {
 4     CvMat*p=cvCreateMat(1,pContour->total,CV_32FC2);
 5     CvPoint2D32f *p_temp=(CvPoint2D32f*)(p->data.fl);
 6 
 7     for(int i=0;i<pContour->total;i++)
 8     {
 9         CvPoint*p0=(CvPoint*)cvGetSeqElem(pContour,i);
10         *p_temp=cvPointTo32f(*p0);
11         p_temp++; 
12     }
13     *box_rect  = cvFitEllipse2(p);
14     cvReleaseMat(&p);
15 }
16 
17 /*
18 *功能描述:
19 *   二值图像中找圆形
20 *输入:
21 *    pStrimg - 原图
22 *    vCircle - 圆集合
23 */
24 void findCircle(IplImage *pStrImg, vector<Ccircle> &vCircle)
25 {
26     CvSeq *pContour = NULL;   
27     CvSeq *pConInner = NULL;   
28     CvMemStorage *pStorage = NULL;  
29     IplImage *pTmpImg = cvCreateImage(cvGetSize(pStrImg), pStrImg->depth, pStrImg->nChannels);
30     cvCopy(pStrImg, pTmpImg);
31 
32     // 查找所有轮廓   
33     pStorage = cvCreateMemStorage(0);   
34     cvFindContours(pTmpImg, pStorage, &pContour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
35     
36     int wai = 0;  
37     int nei = 0;  
38     for (; pContour != NULL; pContour = pContour->h_next)   
39     {   
40         wai++;  
41         // 内轮廓循环   
42         for (pConInner = pContour->v_next; pConInner != NULL; pConInner = pConInner->h_next)   
43         {   
44             nei++;  
45         }  
46         if(pContour->total < 5)
47         {
48             //TRACE("Number of points should be >= 5\n");
49             continue;
50         }
51         CvBox2D box_rect;
52         my_FitEllipse(pContour, &box_rect);
53         if(fabs(box_rect.size.width - box_rect.size.height) < 1){//椭圆长轴,短轴长度相近时判断为圆
54             Ccircle circle;
55             circle.center.x = box_rect.center.x;
56             circle.center.y = box_rect.center.y;
57             circle.r = (box_rect.size.height + box_rect.size.width) / 4;
58             vCircle.push_back(circle);
59         }
60         //cvEllipseBox(pBinary, box_rect, CV_RGB(255, 255, 255));
61         TRACE("center:%f,%f, w:%f, h:%f\n", box_rect.center.x, box_rect.center.y, box_rect.size.width, box_rect.size.height);
62         
63         //CvRect rect = cvBoundingRect(pContour,0);
64         //cvRectangle(pBinary, cvPoint(rect.x, rect.y), cvPoint(rect.x + rect.width, rect.y + rect.height),CV_RGB(255,255, 255), 1, 8, 0);
65     }   
66     
67     printf("wai = %d, nei = %d", wai, nei);  
68     cvReleaseImage(&pTmpImg);
69     cvReleaseMemStorage(&pStorage);   
70     pStorage = NULL;   
71 
72 }

 

 

//图像上点的访问

 1     uchar*data ;
 2     uchar*ivs_data ;
 3     //IplImage*ivs_image = cvCreateImage(cvGetSize(gray_image),IPL_DEPTH_8U, 1);
 4 
 5     ivs_height    = dst->height;
 6     ivs_width     = dst->width;
 7     ivs_step      = dst->widthStep/sizeof(uchar);
 8     ivs_channel = dst->nChannels;
 9     data   = (uchar*)str->imageData;
10     //printf("Processing a %d X %d image with %d channel!\n",ivs_height,ivs_width,ivs_channel);
11 
12 
13     ivs_data = (uchar*)dst->imageData;
14 
15 
16     // 反色图像
17     for(ivs_i=0;ivs_i<ivs_height;ivs_i++)
18     {
19         for(ivs_j=0;ivs_j<ivs_width;ivs_j++)
20         {
21             for(ivs_k=0;ivs_k<ivs_channel;ivs_k++)
22             {
23                 ivs_data[ivs_i*ivs_step+ivs_j*ivs_channel+ivs_k]=255-data[ivs_i*ivs_step+ivs_j*ivs_channel+ivs_k];
24 
25 
26             }//k
27         }//j
28     }//i

 

posted @ 2014-09-27 22:45  CoderZhuang  阅读(229)  评论(0编辑  收藏  举报