【OpenCV学习笔记】【编程实例】六 (霍夫圆检测续)
来源:互联网 发布:mac chm阅读器 编辑:程序博客网 时间:2024/05/22 03:28
前面的有一节中介绍了霍夫圆检测的实例,实际的项目中不可能单纯只含有霍夫圆检测的内容,所以需要将霍夫圆检测的程序融合到工程中来,霍夫圆的约束条件也更加严格,以找到我们所需要的圆,剔除所有不需要的圆。本文主要是将之前的霍夫圆检测的程序融合到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
- 【OpenCV学习笔记】【编程实例】六 (霍夫圆检测续)
- 【OpenCV学习笔记】【编程实例】五 (霍夫圆检测)
- opencv学习笔记(六)二值化以及边缘检测
- OpenCV学习笔记(六)
- Opencv Python版学习笔记(六)Haar人脸检测
- OpenCV学习笔记系列(六)
- OpenCV学习笔记(六):绘制几何图形
- OpenCV学习笔记(六)离散傅里叶变换
- OpenCV学习笔记(六):imread介绍
- OpenCV学习笔记六:直方图(2)
- openCV目标检测学习笔记(一)
- OpenCV学习笔记(十一):边缘检测
- OpenCV学习笔记(十三)边缘检测
- OpenCV学习笔记(十五)形状检测
- OpenCV学习笔记(一) 轮廓检测
- opencv学习笔记(三) 边缘检测
- openCV学习笔记(3):opencv轮廓检测应用例子
- 目标分割和检测笔记(OpenCV实例精解)
- 谷歌官方文档之如何高效展示Bitmap (Google Displaying Bitmaps Efficiently)
- 使用MyEclipse反向编程工具
- Linux socket 测试
- struts2中Convention中的basePackage与locators配置种种
- 简明解释器模式-2
- 【OpenCV学习笔记】【编程实例】六 (霍夫圆检测续)
- 【BZOJ】2243 [SDOI2011]染色 树链剖分
- 做SEO时内容更新和网站排名之间的关系
- 学习笔记:函数默认抛例外吗
- mysql 共享表空间和独享表空间及他们之间的转化
- string检测非法字符
- 用两个栈实现队列
- 第四周上机实践项目——java之猜随机数
- Windows下PostgreSQL安装installer问题