前言
在上一章中描述了图像亮度与对比度的调整,详细描述可点击查看(https://www.jianshu.com/writer#/notebooks/47386368/notes/76843898)
目标
本章中,将学习如何:
- cv::Point与cv::Scalar的使用
- 绘制线、矩形、圆、椭圆等基本几何形状
- 随机生成与绘制文本
重要绘图元素介绍
- cv::Point
Point表示平面上一个点(x,y);其中x,y都是整数,OpenCV关于Point的定义如下:
typedef Point_<int> Point2i;
typedef Point_<int64> Point2l;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
typedef Point2i Point;
其中Point_是一个模板类(如果需要多个函数具有相同的解决问题的逻辑,只是它们所使用的形参的类型不同,则可以使用函数模板。同样,如果需要得多个类仅在其某些数据成员的类型方面有所不同,或者仅在其成员函数的形参类型方面有所不同,则都可以使用类模板)。常用的类型还有Point2f、Point3f;2f-二位坐标,坐标的类型为float。3f同理。
- cv::Scalar
Scalar表示一个四元向量,在OpenCV中通常使用其前三个向量表示颜色。Scalar在OpenCV中定义如下:
Scalar(a,b,c); // a = blue,b = green, c = red表示RGB三个通道
typedef Scalar_<double> Scalar;
图像绘制
- 画线cv::line(LINE_4\LINE_8\LINE_AA)
函数原型: void line(InputOutArray img, Point pt1, Pint pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);
Mat src, dst;
void myLines();
int main()
{
src = imread("../lena512color.tiff");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
char input_win[] = "input image";
//cvtColor(src, src, COLOR_BGR2GRAY);
namedWindow(input_win, WINDOW_AUTOSIZE);
imshow(input_win, src);
dst = src.clone();
myLines();
char output_title[] = "demo";
namedWindow(output_title, WINDOW_AUTOSIZE);
imshow(output_title, dst);
waitKey(0);
return 0;
}
void myLines()
{
Point p1 = Point(20, 30);
Point p2;
p2.x = 300;
p2.y = 300;
Scalar color = Scalar(0, 0, 255);
line(dst, p1, p2, color, 1, LINE_8);
}
函数说明:
1.在图像上绘制一条pt1到pt2的直线,img一般是Mat类型。
2.thickness-表示绘制的线的宽度。
3.lineType-表示线形。OpenCV中有三种可以选择LINE_4、LINE_8、lINE_AA。其中LINE_4表示采用4邻接的方式绘制,LINE_8表示采用8邻接的方式绘制,LINE_AA表示高斯滤波抗锯齿。
4.-表示坐标中的小数点位数。
- 画矩形cv::rectangle
函数原型: void rectangle(InputOutputArray img, Rect rec,const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);
void myRectangle()
{
Rect rect = Rect(20, 30, 200, 200);
Scalar color = Scalar(255,0,0);
rectangle(dst, rect, color, 8, LINE_8);
}
- 画椭圆cv::elipseh
函数原型: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);
void myEllipse()
{
Scalar color = Scalar(0, 255, 0);
ellipse(dst, Point(dst.cols / 2, dst.rows / 2), Size(dst.cols / 4, dst.rows / 8), 90, 0, 180, color, 8, LINE_8);
}
函数说明:
1.axes-表示椭圆长轴和短轴长度的一半。
2.angle、startAngle、endAngle-分别表示椭圆旋转的角度,圆弧开始的角度和圆弧结束的角度
3.thickness-表示线宽,如果取-1表示绘制填充图形
- 画圆cv::circle
函数原型:void circle(InputOutputArray img, Point center, int radius,const Scalar& color, int thickness = 1,int lineType = LINE_8,int shift = 0);
void myCircle()
{
Scalar color = Scalar(0, 255, 255);
circle(dst, Point(dst.cols / 2, dst.rows / 2), 100, color, 8);
}
函数说明:center-表示圆心。radius-表示半径。
- 画填充cv::fillPoly
函数原型: void fillPoly(InputOutputArray img, const Point** pts,const int* npts, int ncontours, const Scalar& color, int lineType =LINE_8, int shift = 0,Point offset = Point() );
void muPolygon()
{
Point pts[1][5];
pts[0][0] = Point(100, 100);
pts[0][1] = Point(100, 200);
pts[0][2] = Point(200, 200);
pts[0][3] = Point(200, 100);
pts[0][4] = Point(100, 100);
const Point* ppts[] = { pts[0] };
int npt[] = { 5 };
Scalar color = Scalar(255, 12, 255);
fillPoly(dst, ppts, npt, 1, color, LINE_8);
}
函数说明:
1.pts-绘制多边形的各个点。
2.npts-绘制多边形点的数目。
3.ncontour-绘制的多边形的数量。
4.offset-轮廓所有点的可选偏移量。
- 文字绘制cv::putText
函数原型:void putText( InputOutputArray img, const String& text, Point org, int fontFace, double fontScale, Scalar color, int thickness = 1, int lineType = LINE_8,bool bottomLeftOrigin = false );
putText(dst, "Hello OpenCV", Point(dst.cols / 2, dst.rows / 2), FONT_HERSHEY_COMPLEX, 1, Scalar(18, 26, 189), 5);
函数说明:
1.org-字体所在矩形的起始点,左下角。
2.fontFace-字体类型。
3.fontScale-字体比例因子。比例因子*字体类型基本大小=字体大小
4.bottomLeftOrigin-如果为true,则图像数据原点位于左下角。 否则,它位于左上角。
- 随机线绘制
//绘制随机直线
void myrng() {
RNG rng(12345);//生成高斯随机函数
Point p1;
Point p2;
Mat RNGimage(500, 500, CV_8UC3, Scalar(0, 0, 0));
for (int i = 0; i<10; i++) {
p1.x = rng.uniform(0, RNGimage.cols);//生成任意x坐标
p2.x = rng.uniform(0, RNGimage.cols);
p1.y = rng.uniform(0, RNGimage.rows);//生成任意y坐标
p2.y = rng.uniform(0, RNGimage.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//随机生成颜色
line(RNGimage, p1, p2, color, 1, LINE_8);//画直线
}
namedWindow("绘制随机直线");
imshow("绘制随机直线", RNGimage);
waitKey(0);
}