找到形状和颜色圈

时间:2012-03-16 10:21:25

标签: opencv

我已经检测到了所有的红色轮廓,并且正在努力寻找在这些轮廓上运行形状检测算法的方法,以获得红色圆圈,但不知道如何提取红色圆圈并消除不需要的轮廓的其余部分?源代码:

#include "stdafx.h"
#include"math.h"
#include"conio.h"
#include"cv.h"
#include"highgui.h"
#include"stdio.h"
#include <math.h>

int main()
{
    int i,j,k;
    int h,w,seuill,channels;
    int seuilr, channelsr;
    int temp=0;
    uchar *data,*datar;
    i=j=k=0;
    IplImage *frame=cvLoadImage("Mon_image.jpg",1);
    IplImage *result=cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 1 );
    IplImage *gray=cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 1 );
    cvCvtColor(frame, result, CV_BGR2GRAY );

    //IplImage* gray;
    cvNamedWindow("original",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Result",CV_WINDOW_AUTOSIZE);

    h = frame->height;
    w = frame->width;
    seuill =frame->widthStep;
    channels = frame->nChannels;
    data = (uchar *)frame->imageData;


    seuilr=result->widthStep;
    channelsr=result->nChannels;
    datar = (uchar *)result->imageData;

   for(i=0;i < (h);i++) 
    for(j=0;j <(w);j++)
{     
if(((data[i*seuill+j*channels+2]) >(19+data[i*seuill+j*channels]))&& ((data[i*seuill+j*channels+2]) > (19+data[i*seuill+j*channels+1])))

            datar[i*seuilr+j*channelsr]=255;

else
    datar[i*seuilr+j*channelsr]=0;
}       

         cvCanny(result,result, 50, 100, 3);
          CvMemStorage* storage = cvCreateMemStorage(0);
         CvSeq* circles = cvHoughCircles(result, storage, CV_HOUGH_GRADIENT, 1, 40.0, 100, 100,0,0);

    cvShowImage("original",frame);
    cvShowImage("Result",result);
    cvSaveImage("result.jpg",result);
    cvWaitKey(0);
    cvDestroyWindow("original");
    cvDestroyWindow("Result");
return 0;
}

1 个答案:

答案 0 :(得分:0)

我宁愿使用RANSAC算法来检测轮廓集中的圆,但是Hough变换也可以完成这项工作。 有关这两个过程的说明,请参阅here。 matlab中给出的解决方案。