前面的有一节中介绍了霍夫圆检测的实例,实际的项目中不可能单纯只含有霍夫圆检测的内容,所以需要将霍夫圆检测的程序融合到工程中来,霍夫圆的约束条件也更加严格,以找到我们所需要的圆,剔除所有不需要的圆。本文主要是将之前的霍夫圆检测的程序融合到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一下,再调用cvHoughCirclescvSmooth(img,img,CV_GAUSSIAN,3,3);circles=cvHoughCircles(img,storage_point,CV_HOUGH_GRADIENT,     2,   //最小分辨率,应当>=1img->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);}
}

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

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

  1. QT+opencv学习笔记(5)——霍夫直线检测、圆检测及椭圆检测

    开发环境为:win10+QT5.8+opencv3.2 Hough变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛.最基本的Hough变换是从黑白图像中检测直线,还可以经过改进检测圆.椭 ...

  2. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  3. OpenCV学习笔记(十六):直方图均衡化:equalizeHist()

    OpenCV学习笔记(十六):直方图均匀化:equalizeHist() 参考博客: 直方图均衡化的数学原理 直方图匹配的数学原理 直方图均衡化广泛应用于图像增强中: 直方图均衡化处理的"中 ...

  4. Opencv 霍夫变换 霍夫圆检测

    霍夫变换是一种特征提取术,在了解霍夫变换 霍夫检测之前 需要首先明白什么是霍夫空间:以圆形举例子,弄明白形状的原理,直线的变换与检测也就不难理解 霍夫空间,是一种三维空间,三个坐标分别为圆的横纵坐标, ...

  5. OpenCV 霍夫圆检测

    圆的表示式是: 其中aa和bb表示圆心坐标,rr表示圆半径,因此标准的霍夫圆检测就是在这三个参数组成的三维空间累加器上进行圆形检测,此时效率就会很低,所以OpenCV中使用霍夫梯度法进行圆形的检测. ...

  6. OpenCV中霍夫圆检测

    OpenCV中霍夫圆检测 在直线检测中,变换后在r−θr-\thetar−θ空间内曲线交点,然后根据阈值来得到直线.在圆中需要有三个变量圆心坐标和半径,因此变换后的空间在三维空间,根据三维空间中的曲线 ...

  7. OpenCV基于Python霍夫圆检测—基于梯度的霍夫圆检测

    基于梯度的霍夫圆检测 1. 回顾与目标 2. 基于梯度的霍夫圆检测 2.1 问题分析 2.2 基于梯度的霍夫圆检测步骤 3. 基于梯度的霍夫圆检测函数HoughCircles 3.1 函数HoughC ...

  8. OpenCV基于Python霍夫圆检测—标准霍夫圆检测

    标准霍夫圆检测 1. 简介 2. 标准霍夫圆检测 2.1 情形一 2.2 情形二 2.3 情形三 3. 程序演示 4. 结尾 参考资料 1. 简介 1972年,R. D. Duda和P. E. Har ...

  9. 9月10日OpenCV学习笔记——Mask、彩色直方图、人脸检测

    文章目录 前言 一.Mask 二.彩色直方图 三.画出基本图形 四.图片上显示文本 五.人脸检测 前言 本文为9月10日OpenCV学习笔记--Mask.彩色直方图.人脸检测,分为五个章节: Mask ...

  10. opencv c++ 霍夫圆检测

    1.原理 a)对某点,以其为圆心的圆为无数(一圈圈的圆),将其从x-y平面坐标系上转换到r-θ极坐标系上后,则变成了以r.θ为自变量,为固定值,x.y为因变量的式子: b)其余点作同样操作,可以得到, ...

最新文章

  1. Touch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标
  2. java中不同包中怎么实例化,Java 笔试题 (01)
  3. 1.7 Appium依赖添加
  4. mysql读写分离实现_脱离开发:Mysql读写分离方案之一
  5. 高仿真的类-AbstractApplicationContext
  6. [css] 你知道CSS中的字母“C“代表什么吗?
  7. java学习(123):treeset排序集合
  8. 微信小程序 地图组件使用
  9. 【Docker】安装tomcat并部署应用
  10. 【Flink】FLink SQL TableException: Table sink doesn‘t support consuming update changes which is
  11. python module错误_python 解决方法:ImportError: No module
  12. vue使用a标签下载文件_Vue a标签实现点击下载,下载图片、txt文件,不是直接打开的方式...
  13. 如何使用Clonezilla克隆Windows硬盘
  14. android 重力模拟,android的模拟器怎样仿真重力感应器
  15. 中国科学报:吴文俊的数字之舞
  16. Introduce Parameter Object (引入参数对象)
  17. Ubuntu如何发音
  18. rpm包安装linux系统,包管理 ----- Linux操作系统rpm包安装方式步骤
  19. 匿名内部类以及Lambda表达式(Java和C#)
  20. 初学者囫囵吞枣急速编写简单Makefile

热门文章

  1. oracle用哪个用户创建表空间,Oracle用定名创建表空间和用户
  2. mysql 语句 简书_MySQL基本语句
  3. php 扩展jpeg,php重新编译,gd扩展支持jpeg文件-Go语言中文社区
  4. 计算机组装内部线的整理,计算机组装与维护笔记整理.doc
  5. oracle删sequ_Oracle序列(Sequence)创建、使用、修改、删除
  6. python setup.py_python setup.py 构建
  7. Cesium:本地node运行cesium报错Must use import to load ES Module
  8. linux 命令行字符缩放,用Linux命令行修图——缩放、编辑、转换格式
  9. 看我如何解决tomcat控制台内容输出乱码的问题?
  10. 内存问题分析工具_valgrind之memcheck基本使用