【OpenCV】轮廓处理

来源:互联网 发布:在线文字识别软件 编辑:程序博客网 时间:2024/05/19 14:51

    在Qt中使用OpenCV库,下面是轮廓处理的程序

void SecondWindow::on_pushButton_4_clicked(){    Mat showMat(frame);                        //frame是视频取到一帧的图像    Mat imgHSV;                                           IplImage  *gray;                                 //申请IplImage类型指针    gray = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U, 1);     cvtColor(showMat, imgHSV, COLOR_BGR2HSV);                       //BGR->HSV    GaussianBlur( imgHSV, imgHSV, Size( 5, 5 ), 0, 0 );                   //图像进行高斯滤波    for(int i=0;i<imgHSV.rows;i++)                                                    //提取需要的颜色    {        for(int j=0;j<imgHSV.cols;j++)        {            int H = imgHSV.at<Vec3b>(i,j)[0] ;            int S = imgHSV.at<Vec3b>(i,j)[1];            int V = imgHSV.at<Vec3b>(i,j)[2];            if((H>15&&H<40)&&S>50&&V>50)                                                 //黄色范围            {                imgHSV.at<Vec3b>(i,j)[0] =0;                imgHSV.at<Vec3b>(i,j)[1] =0;                imgHSV.at<Vec3b>(i,j)[2] =0;                ((uchar *)(gray->imageData + i*gray->widthStep))[j]=255;    //单通道字节型图像赋值            }            else            {                ((uchar *)(gray->imageData + i*gray->widthStep))[j]=0;                imgHSV.at<Vec3b>(i,j)[0] =180;                imgHSV.at<Vec3b>(i,j)[1] =255;                imgHSV.at<Vec3b>(i,j)[2] =255;            }        }    }    cvSmooth(gray, gray,CV_GAUSSIAN,3,3,0,0);                                       //cvSmooth函数平滑滤波    CvSeq*      contour = 0;       //CvSeq类型 存放检测到的图像轮廓边缘所有的像素序列,坐标值特征的结构体以链表形式    CvMemStorage* storage = cvCreateMemStorage(0);                        //开辟内存空间    cvFindContours( gray, storage, &contour, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);//检测图像轮廓    CvRect rect = cvBoundingRect(contour, 0);  //cvBoundingRect 计算得出外接矩形的顶点坐标rect.x, rect.y ,和矩形的高 rect.height,宽rect.width。    ui->label_4->setText(QString::number(rect.y,10));                             //打印坐标到QT的label上    ui->label_3->setText(QString::number(rect.x,10));    ui->label_5->setText(QString::number(rect.width,10));    ui->label_6->setText(QString::number(rect.height,10));}
说明

1.cvtColor函数用来转换图像,转换的格式可以是

         CV_RGB2GRAY            //彩色图像---灰度图像

         CV_BGR2HSV,CV_RGB2HSV,CV_HSV2BGR, CV_HSV2RGB    //BGR与HSV相互转化

       CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR,CV_YCrCb2RGB      

2.程序中使用到单通道的图像赋值多通道可以是

          IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

          ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=0; // B

          ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=0; // G

          ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=0; // R

3.cvFindContours函数用来提取轮廓

        检查的模式可以分为:

          CV_RETR_EXTERNAL:只检索最外面的轮廓;
          CV_RETR_LIST:检索所有的轮廓,并将其放入list中;
          CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
          CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
          边缘处理方式可以分为:    
       CV_CHAIN_CODE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
       CV_CHAIN_APPROX_NONE:将所有的连码点,转换成点。
       CV_CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
       CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法的一种。
       CV_LINK_RUNS:通过连接水平段的1,使用完全不同的边缘提取算法。使用CV_RETR_LIST检索模式能使用此方法。



 

         

0 1
原创粉丝点击