欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Opencv】Opencv绘图函数及shift参数的解读

程序员文章站 2022-05-11 18:12:37
...

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/2^shift^

测试如下:

#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;
}

上面代码是只做了偏移,效果为
【Opencv】Opencv绘图函数及shift参数的解读
而后做了如下的对照代码,能够看出按照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;
}


【Opencv】Opencv绘图函数及shift参数的解读

相关标签: Opencv