笔者目前在校本科大二,有志于进行计算机视觉、计算机图形学方向的研究,准备系统性地、扎实的学习一遍OpenCV的内容,故记录学习笔记,同时,由于笔者同时学习数据结构、机器学习等知识,会尽量根据自己的理解,指出OpenCV的应用,并在加上自己理解的前提下进行叙述。
若有不当之处,希望各位批评、指正。
1.基本绘图函数
用line()函数来绘制线。
void cv::line (
InputOutputArray img, //作为输出的图片
Point pt1, //点1
Point pt2, //点2
const Scalar & color, //线的颜色
int thickness = 1, //线条宽度
int lineType = LINE_8, //线型。线型和算法有关
int shift = 0 //缩放倍率
)
有两点需要说明:
1.这个线是画在图上面的,而不是单独创建一个什么Mat矩阵。举例说明:
Mat M = Mat::zeros(600,600,CV_8UC3);
Mat M1 = imread("E:/program/x.jpg");
resize(M1, M1, Size(600, 600));
Point p1(100, 100);
Point p2(200, 200);
line(M, p1, p2, Scalar(255, 129, 0), 2,8,0);
line(M1, p1, p2, Scalar(255, 129, 0), 2,8,0);
imshow("line1", M);
imshow("line2", M1);
waitKey();
2.函数中的shift参数。shift参数会出现在多个绘图函数中。我注意到很多篇博客都说错了,且官方文档的英文解释我也没看懂。这个参数实际上代表了缩放倍率。会将图案的大小和坐标都缩小到相应的倍率。同样以代码形式来展示:
Mat M = Mat::zeros(600,600,CV_8UC3);
Point p1(100, 100);
Point p2(200, 200);
line(M, p1, p2, Scalar(255, 129, 0), 10, 8, 0);
line(M, p1, p2, Scalar(255, 129, 0), 10, 8, 2);
line(M, p1, p2, Scalar(255, 129, 0), 10, 8, 4);
imshow("line", M);
waitKey();
这里坐标和线的长度都进行了缩短。但是:把shift改为小数并不会让线条变长;线条的宽度不会有变化;线条的颜色也不会有变化。
圆和椭圆没什么区别,椭圆的参数更多一些,所以我这里只是把圆的函数放上来展示一下。
使用circle()函数绘制圆。
void cv::circle (
InputOutputArray img,
Point center,
int radius,
const Scalar & color,
int thickness = 1,
int lineType = LINE_8,
int shift = 0
)
使用ellipse()函数绘制椭圆。
void cv::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 //缩放倍率
)
关于axes:先以axes的第一个值和圆心center画一个圆。axes的第一个值生成了一个轴(称其为第一轴)。第一轴在angle=0时是水平的。旋转时以顺时针旋转。再以axes的第二个值为椭圆的另一个轴(称其为第二轴)。椭圆角度为0的地方是第一轴的右半部分。
注:可以理解为第一轴初始指向x轴的正向,angle代表顺时针旋转第一轴的角度。但是角度和通常计算角度是相反的(即终边以顺时针旋转)。(参考一下上面的椭圆示意图)
以下是一个例子:
Mat M = Mat::zeros(600,600,CV_8UC3);
resize(M1, M1, Size(600, 600));
ellipse(
M,
Point(250, 250),
Size(100, 200),//第一轴长度100,第二轴长度200
60,//第一轴旋转60度
0,
60,//从起始角0到终止角60画椭圆
Scalar(255, 129, 0),
-1,//<0,代表填充椭圆
8
);
imshow("ellipse", M);
waitKey();
这里,所谓的第一轴就是扇形右边的边。第二轴就是扇形左边的边。
还有其他的一些绘图函数,如rectangle()用于绘制矩形,还有fillPoly()等用于绘制多边形的函数,这里便不再赘述。