OpenCV中cvHoughLines2和cvHoughCircles使用范例

cvHoughLines2和cvHoughCircles使用范例。有图,有程序。

cvHoughLines2需要的是Binary image。 cvHoughCircles 需要的是灰度图,而且它会自动调用cvSobel函数。

关于cvHoughCircles多说一句,之前最好用cvSmooth一下,否则会有很多错误的圆被识别出来。

cvHoughLines2
pattern512.JPG
orginal

lines.jpg
lines.jpg (99.05 KiB) 被浏览 4777 次


cvHoughCircles 
cccc1.jpg
cccc1.jpg (12.69 KiB) 被浏览 4777 次
circles.jpg

(VS2008+open1.1,注意图片路径)

#include "stdafx.h"
#include <iostream>

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <math.h>
using namespace std;
/*
coded and updated by Huang, Haiqiao 2010-01-13
Examples of using cvHoughLines2 and cvHoughCircles
*/

int main(int argc, char** argv)
{
   int i;
   cout << "Lines and Circles OpenCV!"<<endl;  //\\cameraman.jpg
   char* filename="D:\\OpenCV_stuff\\SampleImages\\pattern512.bmp";
   IplImage* imgRGB = cvLoadImage(filename); 
   IplImage* imgGrey = cvLoadImage(filename,0); //grey image
   char* filename1="D:\\OpenCV_stuff\\SampleImages\\circle3.jpg";
   IplImage* imgcircle = cvLoadImage(filename1,1); //color image
   if (imgGrey==NULL){
      cout << "No valid image input."<<endl; 
      char c=getchar();
      return 1;
   } 
   
   IplImage* cannyImg  = cvCreateImage(cvSize(imgGrey->width,imgGrey->height),IPL_DEPTH_8U,1);
   cvCanny(imgGrey,cannyImg,170,200,3);

   //************hough lines**probabilistic********//
   CvMemStorage* storage = cvCreateMemStorage(0);
        CvSeq* lines = 0; 
   double rho=1;
   double theta=CV_PI/180;
   double threshold=30;
   double min_length=40;//CV_HOUGH_PROBABILISTIC
   double sepration_connection=20;//CV_HOUGH_PROBABILISTIC

   //binary image is needed.
    lines = cvHoughLines2(
      cannyImg, 
      storage, 
      CV_HOUGH_PROBABILISTIC, 
      rho,
      theta, 
      threshold,
      min_length, 
      sepration_connection);

   //draw lines found by cvHoughLines2
    for( i = 0; i < lines->total; i++ )
    {
       CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
       cvLine(imgRGB, line[0], line[1], CV_RGB(255,0,0),1, 8 );//cannyImgColor
    } 
   


   /*
      Circle identification
   */  
   IplImage* grayimgcircle = cvCreateImage( cvGetSize(imgcircle), 8, 1 );
   CvMemStorage* storagecircle = cvCreateMemStorage(0);
    cvCvtColor( imgcircle, grayimgcircle, CV_BGR2GRAY );
   // smooth it, otherwise a lot of false circles may be detected
    cvSmooth( grayimgcircle, grayimgcircle, CV_GAUSSIAN, 9, 9 ); 
    
   double dp=2;
   double min_dist=10;
   int min_radius=5;
   int max_radius=150; 
   //only greyimage is needed. cvHoughCircles would call cvSobel() internally.
   CvSeq* circles = cvHoughCircles( 
         grayimgcircle, 
         storagecircle, 
         CV_HOUGH_GRADIENT, 
         dp, 
         min_dist, 
         min_radius, 
         max_radius );

    //draw found curves
    for( i = 0; i < circles->total; i++ )
    {
         float* p = (float*)cvGetSeqElem( circles, i );
         cvCircle( imgcircle, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
    }
   


    cvNamedWindow( "Circles", CV_WINDOW_AUTOSIZE );
    cvShowImage( "Circles", imgcircle );
   cvNamedWindow("Original", CV_WINDOW_AUTOSIZE );
   cvShowImage( "Original", imgRGB );

   cvWaitKey(0);

   cvDestroyWindow("HoughLines");
   cvReleaseImage(&imgGrey);
   cvDestroyWindow("Original");
   cvReleaseImage(&imgcircle);
   cvDestroyWindow("Circles");
   
   //char c=getchar();
   return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值