-
大小: 6KB文件类型: .rar金币: 1下载: 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实现指定目录下多幅图像读取与
- 车牌定位之字符分割
- 编译opencv3.1需要的ffmpeg_version.cmake文件
- LPT变换源码
- CameraHDR.rar
- number.zip
- 机器视觉霍夫圆检测识别木材死节O
- 图像的预处理灰度图、二值化、字符
- 批量处理图片大小
- OpenCV实现相位相关图像配准
- opencv彩色图转换为灰度图并保存
- vgg_generated_80.i
- opencv-图片相似度对比代码-感知哈希算
- opencv2.44附加依赖项
- rk3288平台深度学习框架caffe+opencv环境
-
cascadexm
l.rar - 图片上加文字或者数字opencv
- OpenCV切边案例-01
- 提取二值图像中的最大轮廓OpenCV版
- Opencv 目标检测和识别
- opencv实现特征点的检测与匹配
- Qt魔方还原lesson5-opencv识别颜色
- opencv 标定 带图片
- ippicv_2017u2_lnx_intel64_20170418.tgz
- cxcore.lib的生成工程
- Caffe安装支持文件
- opencv调用摄像头捕捉并进行人脸识别
- opencv+串口通讯
- 图像处理源码 opencv图像处理源码
- opencv2.4.9opencv_createsamples.exe和opencv_h
评论
共有 条评论