• 大小: 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


评论

共有 条评论