-
大小: 6KB文件类型: .rar金币: 2下载: 0 次发布日期: 2021-06-15
- 语言: 其他
- 标签: OpenCV HoughCircles
资源简介
Opencv内部提供了一个基于Hough变换理论的找圆算法,HoughCircle与一般的拟合圆算法比起来,各有优势:优势:HoughCircle对噪声点不怎么敏感,并且可以在同一个图中找出多个圆;反观拟合圆算法,单纯的拟合结果容易受噪声点的影响,且不支持一个输入中找多个圆。
因此通过优化排序方法提高其精度。

代码片段和文件信息
//----------------------------------------------------------------------------
// 20014.11.26 by Charles
/* circle_found为找圆结果的结构
FindCircles为最终对外的接口,其他都是内部函数
//优化处理后打包好的HoughCircles接口,cv核心算法的优化补充在该函数中添加如下:
//1、添加cvCanny的低阈值low_threshold,参数控制可以更灵活
//2、可选择性的手动输入轮廓图代替cv核心算法内自动调用的canny,可以更有效的进行预处理
//3、添加分数过滤,将找出的圆与实际轮廓对比重合率(如果输入了轮廓图则与轮廓图比,否则用算法内部自动生成的轮廓图对比),
// 按照分数高低排序并过滤掉分数过低的圆
*/
//----------------------------------------------------------------------------
#include “ExtendHoughCircle.h“
bool SortCircleFound( const circle_found &v1 const circle_found &v2)//注意:本函数的参数的类型一定要与vector中元素的类型一致
{
return v1.score > v2.score;//降序排列
}
const int STORAGE_SIZE = 1 << 12;
#define hough_cmp_gt(l1l2) (aux[l1] > aux[l2])
#define cvSobel_Core 5
#define overlap_check_brush 2
enum { XY_SHIFT = 16 XY_ONE = 1 << XY_SHIFT DRAWING_STORAGE_BLOCK = (1<<12) - 256 };
static CV_IMPLEMENT_QSORT_EX( icvHoughSortDescent32s int hough_cmp_gt const int* )
static void seqToMat(const CvSeq* seq cv::OutputArray _arr)
{
if( seq && seq->total > 0 )
{
_arr.create(1 seq->total seq->flags -1 true);
cv::Mat arr = _arr.getMat();
cvCvtSeqToArray(seq arr.data);
}
else
_arr.release();
}
static void icvFindCirclesGradient( CvMat* img cv::Mat &contour_img float dp float min_distint min_radius int max_radius
int low_threshold int high_thresholdint acc_thresholdCvSeq* circles int circles_max )
{
const int SHIFT = 10 ONE = 1 << SHIFT;
cv::Ptr dx dy;
cv::Ptr edges accum dist_buf;
std::vector sort_buf;
cv::Ptr storage;
int x y i j k center_count nz_count;
float min_radius2 = (float)min_radius*min_radius;
float max_radius2 = (float)max_radius*max_radius;
int rows cols arows acols;
int astep *adata;
float* ddata;
CvSeq *nz *centers;
float idp dr;
CvSeqReader reader;
//如果输入的轮廓图尺寸与输入的源图完全相同,则使用输入的轮廓图,否则cvCanny提取轮廓图,可以更灵活的预处理图像
if ( contour_img.cols==img->cols && contour_img.rows==img->rows )
{
edges = cvCloneMat(&CvMat(contour_img));
}else
{
edges = cvCreateMat( img->rows img->cols CV_8UC1 );
cvCanny( img edges low_threshold high_threshold 3 ); //添加cvCanny的低阈值low_threshold,参数控制可以更灵活
contour_img=cv::Mat(edges)+0;
}
dx = cvCreateMat( img->rows img->cols CV_16SC1 );
dy = cvCreateMat( img->rows img->cols CV_16SC1 );
///////////////////////////////////计算方向导数的Sobel核大小,重要参数////////////////////////////////////////
cvSobel( img dx 1 0 cvSobel_Core );
cvSobel( img dy 0 1 cvSobel_Core );
if( dp < 1.f )
dp = 1.f;
idp = 1.f/dp;
accum = cvCreateMat( cvCeil(img->rows*idp)+2 cvCeil(img->cols*idp)+2 CV_32SC1 );
cvZero(accum);
storage = cvCreateMemStorage();
nz = cvCreateSeq( CV_32SC2 sizeof(CvSeq) sizeof(CvPoint) storage );
centers = cvCreateSeq( CV_32SC1 sizeof(CvSeq) sizeof(int) storage );
rows = img->rows;
cols = img->cols;
arows = accum->rows
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 547 2017-01-12 16:33 Main.cpp
文件 965 2017-01-12 16:33 ExtendHoughCircle.h
文件 14129 2017-01-12 16:33 ExtendHoughCircle.cpp
----------- --------- ---------- ----- ----
15641 3
- 上一篇:邮箱关键字提取
- 下一篇:上海师范大学计算机网络与通讯研究生15
相关资源
- 基于OpenCV的数字识别468815
- 使用opencv去掉二值化图像中黑色面积
- opencv环境配置
- win10 64位下编译的opencv4.5.5库,opencv
- NVIDIAOpticalFlowSDK-79c6cee80a2df9a196f20afd6
- opencv_contrib-3.4.0.zip
- opencv2.4.9源码分析——SIFT
- 用两个摄像头实现,双目标定,双目
- opencv_traincascade训练分类器,手势识别
- opencv3.0交叉编译用parallel.cpp
- 基于opencv的图像识别识别图像中的色
- 基于openCV的识别特定颜色区域
- 基于OpenCV的分水岭算法实现
- QT+opencv+OCR 身份证号码,银行卡号识别
- opencv视频特定颜色区域识别
- 把RGB转换为HSV和HSI然后根据黄色和蓝
- opencv视觉测距
- 基于Qt和opencv的身份证号码识别系统
- opencv_ffmpeg249.dll
- SfM稀疏三维点云重建--完整工程文件
- 基于opencv的数人头程序源代码
- 利用OpenCV中的Stitcher类实现全景图像拼
- opencv实现的sift算法源码,包含了图像
- openCV 上的小波变换
- 基于OPENCV的车牌识别系统设计
- 617张国内车牌60-17bmp图片用于OpenCV正样
- hog特征提取,c版本代码
- 基于Qt5.8+OpenCV3.2的Basler多相机触发开
- 基于Opencv实现的图像纠偏
- ImageWatch2019.vsix
评论
共有 条评论