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 );
        }
        ...

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

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

我的OpenCV学习笔记(七):绘图操作

OpenCV提供了一些基本的绘图操作,比如画圆,画椭圆,画线,画矩形,在图像里插入文字等功能。 画圆使用的是circle函数,必须提供的参数是:画在出的圆显示在哪里,圆心,半径,以及画线的颜色。 ...
  • thefutureisour
  • thefutureisour
  • 2012年04月30日 14:08
  • 86528

opencv2.4.7.2画圆,画十字,画矩形

本文采用的openCV C++版本的库,如果使用C版本的库,请参见另一位作者的博文http://blog.csdn.net/liqingsheng1234/article/details/900392...
  • fujilove
  • fujilove
  • 2014年01月07日 12:06
  • 5748

OpenCV之基本绘图

Point 该数据结构表示了由其图像坐标 和 指定的2D点。可定义为: Point pt; pt.x = 10; pt.y = 8; 或者 Point pt = Point(10, 8);...
  • ubunfans
  • ubunfans
  • 2014年04月24日 16:39
  • 45790

opencv画圆

  • 2014年06月02日 22:59
  • 1.51MB
  • 下载

Opencv用鼠标画圆

#include #include #define WINDOW_NAME "鼠标事件窗口" #define EVENT_WINDOW "滚动条窗口" #define PI 3.1415926 u...
  • qq_23880193
  • qq_23880193
  • 2015年08月25日 15:28
  • 847

Opencv用鼠标画圆

#include #include #define WINDOW_NAME "鼠标事件窗口" #define EVENT_WINDOW "滚动条窗口" #define PI 3.1415926 u...
  • qq_23880193
  • qq_23880193
  • 2015年08月25日 15:28
  • 847

OpenCV画轮廓的外界圆矩形椭圆等

#include #include #include #include using namespace std; #pragma comment(lib,"cv....
  • Augusdi
  • Augusdi
  • 2013年05月31日 15:51
  • 17089

opencv各种画图 直线 矩形 圆 椭圆

绘图函数 (1)直线cvLine函数 其结构 void cvLine(//画直线 CvArr* array,//画布图像 CvPoint pt1,//起始点 CvPoint pt2,/...
  • u012590688
  • u012590688
  • 2015年07月02日 11:38
  • 7088

opencv2.4.7.2画圆,画十字,画矩形

本文采用的openCV C++版本的库,如果使用C版本的库,请参见另一位作者的博文http://blog.csdn.net/liqingsheng1234/article/details/900392...
  • fujilove
  • fujilove
  • 2014年01月07日 12:06
  • 5748

opencv3_java 在已有的图像上画圆圈 CircleOnImg

在已有的图像上画圆圈 CircleOnImg package opencv_java_demo; import org.opencv.core.*; import org.opencv.i...
  • sileixinhua
  • sileixinhua
  • 2017年05月30日 17:35
  • 1046
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV的circle函数画圆的小技巧
举报原因:
原因补充:

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