2012-03-16 45 views
0

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

#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; 
} 
+0

共享当前应用程序的输入和输出图像不仅可以提高问题的质量,而且还可以获得答案。并更好地标记你的问题。所有** C **家伙可能都会错过这个问题,因为它没有被标记为这样。 – karlphillip 2012-03-16 12:39:06

+0

[使用OpenCV和机器学习进行简单对象检测]的可能重复(http://stackoverflow.com/questions/6416117/simple-object-detection-using-opencv-and-machine-learning) – karlphillip 2012-03-16 12:40:52

+0

最有可能的重复: [用openCV检测特定颜色(或灰度级)的圆形](http://stackoverflow.com/questions/3198237/detecting-a-circle-of-a-specific-color-or-gray-level-with -opencv) – karlphillip 2012-03-16 12:42:24

回答

0

我宁愿用RANSAC算法来检测你的轮廓,集圈,但Hough变换也将做的工作。 查看here了解这两个过程的说明。给定的matlab解决方案。