【Opencv】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 椭圆

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

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


在这里插入图片描述

发布了14 篇原创文章 · 获赞 1 · 访问量 502

猜你喜欢

转载自blog.csdn.net/qq_41741344/article/details/104347443