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