【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,则具体公式是:
测试如下:
#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;
}
上一篇: 数据库存储
下一篇: 物联网成IC半导体行业最热议题