OpenCV的circle函数画圆的小技巧

原创 2015年11月21日 11:46:13

前言

在特征点检测的时候,通常需要画圆来表示特征点的强度,OpenCV很方便的提供了circle函数来画圆,函数签名

CV_EXPORTS_W void circle(CV_IN_OUT Mat& img, Point center, int radius,const Scalar& color, 
int thickness=1,int lineType=8, int shift=0);

一般来说,我们只关心前面4个参数,给定图像,中心点,半径和颜色就可以画一个圆,最近在研究OpenCV源码的时候,发现了一个很好玩的结果,先看两张图像
这里写图片描述

分析

这是我在做尺度不变性Harris角点检测得到的结果,可以看到右边图中的圆更加饱满更加好看,左边图中的圆锯齿状非常明显,下面是对应的代码

//(a)图
circle(imgSrc, Point(c, r),3*round(dvecSigma[i])*,Scalar(0, 255, 0);

//(b)circle(imgSrc, Point(c*(1<<4), r*(1<<4)),
3*round(dvecSigma[i])*(1<<4), Scalar(0, 255, 0), 1,CV_AA,4);

和(a)相比,(b)将中心点坐标和半径同时乘以1<<4(即16),再将linetype设为CV_AA,同时将shift设置为4,就可以将圆画的更加好看,下面是OpenCV画sift特征点的源码,我的灵感就是从这里面来的,文件位置OpencvDir/sources/modules/features2d/src\draw.cpp

//就是这个变量
const int draw_shift_bits = 4;
const int draw_multiplier = 1 << draw_shift_bits;

namespace cv
{

/*
 * Functions to draw keypoints and matches.
 */
static inline void _drawKeypoint( Mat& img, const KeyPoint& p, 
const Scalar& color, int flags )
{
    CV_Assert( !img.empty() );
    //中心点*(1<<4)
    Point center( cvRound(p.pt.x * draw_multiplier), cvRound(p.pt.y * draw_multiplier) );

    if( flags & DrawMatchesFlags::DRAW_RICH_KEYPOINTS )
    {
        //半径*(1<<4)
        int radius = cvRound(p.size/2 * draw_multiplier); // KeyPoint::size is a diameter

        // 画圆
        circle( img, center, radius, color, 1, CV_AA, draw_shift_bits );

        // draw orientation of the keypoint, if it is applicable
        if( p.angle != -1 )
        {
            float srcAngleRad = p.angle*(float)CV_PI/180.f;
            Point orient( cvRound(cos(srcAngleRad)*radius ),
                          cvRound(sin(srcAngleRad)*radius )
                        );
            line( img, center, center+orient, color, 1, CV_AA, draw_shift_bits );
        }
        ...

有哪位大神知道原理的,希望不吝赐教

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[Unity&特效]怎么画圆范围circle range技能指示器skill indicator

技能指示器skill indicator,攻击范围圆圈attack range circle 最基础的花园 感谢 参考资料 1 的 资料。 设置如下所示 ...

OpenCV实践之路——circle函数实现出下落的小球动画

今天本来想到如何自己实现下SIFT呢,就像先学会如何在图像检测出最大值然后再最大值上画圆吧。就是这么简单的不要不要的。慢慢来嘛。于是开始先画圆,然后就停不下来了。。。画个圆之后想着怎么让圆实现下落的效...

1.1.2-学习Opencv与MFC混合编程之---画图工具 画直线 画圆 画矩形

源代码地址:http://download.csdn.net/detail/nuptboyzhb/3961685 画图工具 1.     画直线 Ø  增加‘直线’菜单项,建立类向导; ...

OpenCV中访问Mat图像像素的一个小技巧

OpenCV中访问Mat图像像素的一个小技巧

使用OpenCV时的小技巧

1、  图像的遍历 OpenCV图像遍历最高效的方法是指针遍历方法。因为图像在OpenCV里的存储机制问题,行与行之间可能有空白单元(一般是补够4的倍数或8的倍数,有些地方也称作“位对齐”,目前我用到...

opencv使用小技巧

opencv使用小技巧1.OpenCV把一个图像的一小块区域拷贝到另一个图像的指定区域:IplImage* img 从图里面截取矩形的操作一般是这个样子的:(1)CvSize size= cvSiz...

Ellipse函数画圆

Ellipse函数的用法   函数功能:该函数用于画一个椭圆,椭圆的中心是限定矩形的中心,使用当前画笔画椭圆,用当前的画刷填充椭圆。     函数原型:BOOL Ellipse(H...

C++编写的画圆函数

  • 2010-10-05 09:32
  • 2.40MB
  • 下载

c++画圆函数

  • 2014-05-27 10:53
  • 765B
  • 下载

【OpenCV笔记 06】OpenCV中绘制基本几何图形【矩形rectangle()、椭圆ellipse() 、圆circle() 】

本文主要内容: 一、介绍OpenCV中三个绘图函数:circle() 、ellipse()  、rectangle() 二、函数的应用实例,利用这些函数分别绘制了丰田车标、奥迪车标以及红十字,并附...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)