Opencv中绘图函数及shift参数的解读

Opencv绘图函数及shift参数的解读
Opencv中有很多绘图参数,他们的函数定义如下:

  1. 基本绘图函数
    1.1 画直线
void line
(
	InputOutputArray img, 
	Point pt1, Point pt2,
 	const Scalar& color,
 	int thickness = 1,
	 int lineType = LINE_8,
	 int shift = 0
	 );

第一参数:直线绘制在哪
第二个参数:直线起点
第三个参数:直线终点
第四个参数:颜色
第五个参数:线宽,当线宽为-1的时候表示是填充图案
第六个参数:线型
第七个参数:放缩参数(后面介绍)

1.2 椭圆


```cpp
void ellipse(
	InputOutputArray img,
 	Point center, 
	Size axes,
 	double angle, 
	double startAngle,
 	double endAngle,
 	const Scalar& color, 
	int thickness = 1,
	int lineType = LINE_8,
 	int shift = 0
);

第二个参数:椭圆的绘图中心
第三个参数:以椭圆长轴和短轴长度为边界的矩形区域,椭圆就绘制在这个矩形区域
第四个参数:椭圆旋转的角度
第五个参数:绘制椭圆起始角度
第六个参数:绘制椭圆终止角度
当第五和第六个参数设置为0和360的时候,椭圆是完整的一周,否则就是一部分椭圆线。

1.3 圆

void circle(
	InputOutputArray img,
 	Point center,
 	int radius,
 	const Scalar& color, 
	int thickness = 1,
	int lineType = LINE_8,
 	int shift = 0);

比较简单,不解释了

1.4 矩形

void rectangle(
	CV_IN_OUT Mat& img,
 	Rect rec,
 	const Scalar& color, 
	int thickness = 1,
	int lineType = LINE_8, 
	int shift = 0
);

比较简单,不解释了

1.5 多边形

void fillPoly(
	Mat& img,
	 const Point** pts,
 	 const int* npts,
 	int ncontours,
 	const Scalar& color, 
	int lineType = LINE_8, 
	int shift = 0,
	Point offset = Point() );

第二个参数:注意是一个二维的指针。表示绘制多边形的边界点。
第三个参数:一个一维指针,表示多边形的边界点数量
第四个参数:要绘制的多边形数量
第八个参数:所有点轮廓的可选偏移

具体使用的例子

Point p[1][5];  
p[0][0] = Point(100, 100);
p[0][1] = Point(100, 200);
p[0][2] = Point(200, 300);
p[0][3] = Point(300, 200);
p[0][4] = Point(300, 100);
const Point* ppt[1] = { p[0] };//多边形点集

int npt[] = { 5 };//多边形点集的数量
fillPoly(m, ppt, npt,1,Scalar(255, 0, 0), 8);
  1. shift参数
    几乎每个绘图函数后面都有一个int类型的shift参数,这个参数到底是干什么的呢?经过我的测试,我发现shift是用来做图像缩小的,会把中心点坐标以及线的长度按比例缩小,假设原来的数字为D,变换后的数字为d,则具体公式是:

d = D/2shift

测试如下:

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;

int main()
{

	Mat m = imread("1.png");
	circle(m, Point(300, 300), 100, Scalar(0, 0, 255), 0, 8, 0);
	circle(m, Point(300, 300), 100, Scalar(0, 0, 255), 1, 8, 1);
	circle(m, Point(300, 300), 100, Scalar(0, 0, 255), 1, 8, 3);
	
	imshow("a", m);
	waitKey(0);
	return 0;
}

上面代码是只做了偏移,效果为
在这里插入图片描述

而后做了如下的对照代码,能够看出按照2shift倍数缩小的黑色圆圈刚好与红色圈重合了

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;

int main()
{

	Mat m = imread("1.png");

	circle(m, Point(300, 300), 100, Scalar(0, 0, 255), 0, 8, 0);
	
	circle(m, Point(300, 300), 100, Scalar(0, 0, 255), 1, 8, 1);
	circle(m, Point(300/2, 300/2), 100/2, Scalar(0, 0, 0), 1, 8, 0); //与上一个红色圈重合
	
	circle(m, Point(300, 300), 100, Scalar(0, 0, 255), 1, 8, 3);
	circle(m, Point(300 / 8, 300 / 8), 100 / 8, Scalar(0, 0, 0), 1, 8, 0);//与上一个红色圈重合
	
	imshow("a", m);
	waitKey(0);
	return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值