【OpenCV学习笔记】【编程实例】六 (霍夫圆检测续)

      前面的有一节中介绍了霍夫圆检测的实例,实际的项目中不可能单纯只含有霍夫圆检测的内容,所以需要将霍夫圆检测的程序融合到工程中来,霍夫圆的约束条件也更加严格,以找到我们所需要的圆,剔除所有不需要的圆。本文主要是将之前的霍夫圆检测的程序融合到MFC编写的工程代码中,首先要考虑的问题是霍夫圆检测放到哪里比较合适。最后决定放到MFC自动生成的cpp文件(OcrRecDlg.cpp)中,之前本打算声明部分放到对应的头文件(OcrRecDlg.h),但是头文件中没有包含OpenCV的头文件,所以就只好放到cpp文件中。主要代码如下:

/********************************
//     霍夫圆检测定义变量
CvMemStorage* storage_point =NULL;
//********************************
//霍夫圆检测函数
void  HoughCircle(IplImage* img,int y0,int y1,int y2,int height)
//void  HoughCircle(IplImage* img)
{
	 CvSeq * circles=NULL;
	 CvMemStorage* storage_point= cvCreateMemStorage(0);
	 //最好先cvSmooth一下,再调用cvHoughCircles
	 cvSmooth(img,img,CV_GAUSSIAN,3,3);
	 circles=cvHoughCircles(img,storage_point,CV_HOUGH_GRADIENT,     
	  2,   //最小分辨率,应当>=1
	  img->height/4,   //该参数是让算法能明显区分的两个不同圆之间的最小距离
	  100,   //用于Canny的边缘阀值上限,下限被置为上限的一半
	  40,    //累加器 的阀值
	  2,  //最小圆半径 
	  27  //最大圆半径
	  );
	 int k;
	 for (k=0;k<circles->total;k++)
	 {
	  float *p=(float*)cvGetSeqElem(circles,k);
	  if(cvRound(p[2])>9&&cvRound(p[2])<14 &&(((cvRound(p[1])>(y0-height/4))&&(cvRound(p[1])<(y0+height/8)))||(((cvRound(p[1])>(y1-height/4))&&(cvRound(p[1])<(y1+height/8)))||(((cvRound(p[1])>(y2-height/4))&&(cvRound(p[1])<(y2+height/8)))))))
		  //并且【(cvRound(p[1])>(y0-height/4))&&(cvRound(p[1])<(y0+height/8))】,【(cvRound(p[1])>(y1-height/4))&&(cvRound(p[1])<(y1+height/8))】
		  //【(cvRound(p[1])>(y2-height/4))&&(cvRound(p[1])<(y2+height/8))】三个中至少要满足一个
	   {
		  cvCircle(img,cvPoint(cvRound(p[0]),cvRound(p[1])),cvRound(p[2]),CV_RGB(0,255,0),3,CV_AA,0); 
		 //cout<<"圆心坐标"<<"("<<cvRound(p[0])<<","<<cvRound(p[1])<<")"<<endl;   //输出圆心的X,Y坐标
		 // cout<<"圆心半径"<<cvRound(p[2])<<endl;     //输出圆的半径
		}
	  }
	  cvNamedWindow( wndname, 1 );
      cvShowImage(wndname,img);
	  cvClearMemStorage(storage_point);
}
函数调用:

void COcrRecDlg::OnBnClickedButtonRec()
{
	int i, c;
	IplImage *image_clone=NULL;
	Mat imageresize;
	Mat img=imread("C:\\Users\\Desktop\\GetCircle\\GetCircle\\1.bmp",0);
	IplImage *Image;
	Image=&(IplImage(img));
	image_clone=cvCloneImage(Image);
	
	resize(img,imageresize,Size(200,240),0,0,CV_INTER_LINEAR);
	OCR ocr("OCRxin.xml");
	
	Plate plate;
        Rect rect_crop = Rect(0, 0,imageresize.cols,imageresize.rows); 
        plate= Plate(imageresize,rect_crop);
        CharSegment plateNumber=ocr.run(&plate);
       
	CString CSstr=_T("");
	CSstr.Format(_T("%s"),plateNumber.Char_str.c_str());
	ResultBox->SetWindowText(CSstr);

	int y0=(plateNumber.y0_pos)*4.44;
	int y1=(plateNumber.y1_pos)*4.44;
	int y2=(plateNumber.y2_pos)*4.44;
	int height=(plateNumber.Char_height)*4.44;

	HoughCircle(Image,y0,y1,y2,height);
      
	CvvImage m_CvvImage;
	img_result= &(IplImage(plate.plateImg));
	m_CvvImage.CopyOf(img_result,1);
	if(true)
    {
	   m_CvvImage.DrawToHDC(hDC_result,&rect_result);
     }
}

      通过对原来的霍夫圆检测函数增加参数,增加圆心位置的筛选条件,进一步剔除了不符合条件的点,运行结果图下:







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌三角猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值