【opencv学习笔记】008之绘制形状(直线、矩形、椭圆、圆)与文字

版权声明:本文由 水亦心 出品,转载请注明出处。 https://blog.csdn.net/shuiyixin/article/details/89406889

一、前言

今天要讲的是图像对比度与亮度的调整。

如果想看其他有关于OpenCV学习方法介绍、学习教程、代码实战、常见报错及解决方案等相关内容,可以直接看我的OpenCV分类:

【OpenCV系列】:https://blog.csdn.net/shuiyixin/article/category/7581855

如果你想了解更多有关于计算机视觉、OpenCV、机器学习、深度学习等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!

二、cv::Point与cv::Scalar

在讲绘制之前,我们要先说一下点和像素值,因为我们在后面会用到。

1、cv::Point

我们都知道,OpenCV处理的大多数是二维的图像,所以在OpenCV中,Point表示2D平面上一个点(x,y)。给点的横纵坐标赋值方法如下:

第一种方法是分别给横纵坐标赋值:

	Point p;
	p.x = 10;
	p.y = 8;

第二种方法是一次性赋值:

        Point p;

	p = Pont(10,8);

 

2、cv::Scalar

知道了点的位置,我们还要知道点的颜色,在OpenCV中,用cv::Scalar来设置颜色,以后有机会我会给大家详细讲解Scalar,这个时候大家主要就知道是设置颜色就可以啦。

Scalar的定义如下:

typedef struct Scalar
{
    double val[4];
}Scalar;

Scalar有四个元素,初始化的时候,如果没有赋值,默认为0。

对于前面三个元素,分别表示B,G,R,即blue,green,red。我们一般设置也是设置前面三个值。

例如我们这个博客中用到的例子:

	Scalar color = Scalar(0, 0, 255);

第四个参数没有赋值,默认为0,这个颜色表示纯红色。

三、绘制基本形状

1、绘制直线cv::line

首先我们说最简单的绘制直线。、

1.API

        void line(
                    InputOutputArray img, 
                    Point pt1, 
                    Point pt2, 
                    const Scalar& color,
                    int thickness = 1, 
                    int lineType = LINE_8, 
                    int shift = 0
                );

函数参数含义如下:

@param img :输入图像。

@param pt1 :直线的第一个端点。

@param pt2 :直线的第二个端点。

@param color :直线的颜色。

@param thickness :直线的粗细程度。

@param lineType :直线类型,一共有三个:LINE_4,LINE_8,LINE_AA.其中LINE_AA是无锯齿直线。

@param shift :点坐标中的小数位数,一般用默认值。

 

2.代码展示

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;
Mat src1 = imread("E:/image/hand.jpg");

void addLine();

void main()
{
	
	if (!src1.data) {
		printf("could not load image...\n");
		return ;
	}
	imshow("【input picture】", src1);
	addLine();

	waitKey(0);
}
void addLine()
{
	Point p1 = Point(src1.cols / 2, src1.rows / 2);
	Point p2;
	p2.x = 10;
	p2.y = 10;
	Scalar color = Scalar(0, 0, 255);
	line(src1, p1, p2, color, 1, LINE_4);
	imshow("【addLine】", src1);
}

 

3.执行结果

 

2、绘制矩形cv::rectangle

接下来是绘制矩形,矩形比较简单,需要知道位置和大小,我们用Rect结构来构造一个矩形。

1.API

void rectangle(
        Mat& img, 
        Rect rec,
        const Scalar& color, 
        int thickness = 1,
        int lineType = LINE_8, 
        int shift = 0
    );

函数参数含义如下:

@param img :输入图像。

@param rec :一个矩形,包含四个参数,横纵坐标以及长宽。

@param color :直线的颜色。

@param thickness :直线的粗细程度。

@param lineType :直线类型,一共有三个:LINE_4,LINE_8,LINE_AA.其中LINE_AA是无锯齿直线。

@param shift :点坐标中的小数位数,一般用默认值。

2.代码展示

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;
Mat src1 = imread("E:/image/hand.jpg");

void addRectangle();

void main()
{
	
	if (!src1.data) {
		printf("could not load image...\n");
		return ;
	}
	imshow("【input picture】", src1);
	addRectangle();
	imshow("【addRectangle】", src1);
	waitKey(0);
}
void addRectangle()
{
	Rect rect = Rect(20, 10, 150, 200);
	Scalar color = Scalar(0, 0, 255);
	rectangle(src1, rect, color, 1, 4);

}

3.执行结果

3、绘制椭圆cv::ellipse

接下来是绘制椭圆。椭圆需要的比较多:

一个是位置(中心);

一个是长轴短轴;

一个是方向,是横着还是竖着还是斜着?

一个是哪个角度开始;

一个是哪个角度结束;(一般这两个为0-360,表示完整的椭圆)

剩下的就是颜色啊,粗细啊,线的类型之类的。

1.API

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

函数参数含义如下:

@param img :输入图像。

@param center:椭圆中心。

@param axes:轴线。

@param angle:椭圆旋转角度,单位为度。

@param startAngle:椭圆弧的起始角,单位为度。

@param endAngle:椭圆弧的终止角,单位为度。

@param color:椭圆的颜色。

@param thickness:椭圆的粗细程度。

@param lineType :椭圆线类型,一共有三个:LINE_4,LINE_8,LINE_AA.其中LINE_AA是无锯齿直线。

@param shift :点坐标中的小数位数,一般用默认值。

2.代码展示

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;
Mat src1 = imread("E:/image/hand.jpg");

void addEllipse();

void main()
{
	
	if (!src1.data) {
		printf("could not load image...\n");
		return ;
	}
	imshow("【input picture】", src1);
	addEllipse();
	imshow("【addEllipse】", src1);
	waitKey(0);
}
void addEllipse()
{
	Point p1 = Point(src1.cols / 2, src1.rows / 2);
	Size s1 = Size(src1.cols / 4, src1.rows / 4);
	Scalar color = Scalar(242, 123, 215);
	ellipse(src1, p1, s1, 40, 0, 360, color, 1, LINE_AA);
}

3.执行结果

4、绘制圆cv::circle

接下来是绘制圆,圆就比较简单啦,只需要知道圆心和半径就好了。

1.API

void circle(
        InputOutputArray img, 
        Point center, 
        int radius,
        const Scalar& color, 
        int thickness = 1,
        int lineType = LINE_8, 
        int shift = 0
    );

函数参数含义如下:

@param img :输入图像。

@param center:圆心。

@param radius:半径。

@param color :圆的颜色。

@param thickness :圆的粗细程度。

@param lineType :圆线的类型,一共有三个:LINE_4,LINE_8,LINE_AA.其中LINE_AA是无锯齿直线。

@param shift :点坐标中的小数位数,一般用默认值。

2.代码展示

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;
Mat src1 = imread("E:/image/hand.jpg");

void addCircle();

void main()
{
	
	if (!src1.data) {
		printf("could not load image...\n");
		return ;
	}
	imshow("【input picture】", src1);
	addCircle();
	imshow("【addCircle】", src1);
	waitKey(0);
}
void addCircle()
{
	Point center = Point( src1.cols/2, src1.rows/2);
	Scalar color = Scalar(0, 255, 255);
	circle(src1, center, 50,color, 1, 4);
}

3.执行结果

5、设置填充cv::fillPoly

接下来是设置填充。

1.API

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

函数参数含义如下:

@param img :输入图像。

@param pts :多边形顶点。

@param npts:顶点个数。

@param ncontours:边的个数。

@param color :填充的颜色。

@param lineType :直线类型,一共有三个:LINE_4,LINE_8,LINE_AA.其中LINE_AA是无锯齿直线。

@param shift :点坐标中的小数位数,一般用默认值。

@param offset:轮廓所有点的可选偏移。

2.代码展示

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;
Mat src1 = imread("E:/image/hand.jpg");

void addPolygon();

void main()
{
	
	if (!src1.data) {
		printf("could not load image...\n");
		return ;
	}
	imshow("【input picture】", src1);
	addPolygon();
        imshow("【addPolygon】", src1);
	waitKey(0);
}
void addPolygon()
{
	Point pst[1][6];
	pst[0][0] = Point(100, 100);
	pst[0][1] = Point(60, 120);
	pst[0][2] = Point(80, 150);
	pst[0][3] = Point(120, 150);
	pst[0][4] = Point(140, 120);
	pst[0][5] = Point(100, 100);
	const Point* ppst[] = { pst[0] };
	int npt[] = { 6 };
	Scalar color = Scalar(100, 255, 255);
	fillPoly(src1, ppst, npt,1, color, 4);//图像填充

}

3.执行结果

 

6、绘制文字putText

接下来是绘制文字。

1.API

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

函数参数含义如下:

@param img :输入图像。

@param text:添加的文字。

@param org:图像中文本字符串的左下角。

@param fontFace:文字的字体。

@param color :文字的颜色。

@param thickness :文字的粗细程度。

@param lineType :文字的类型,一共有三个:LINE_4,LINE_8,LINE_AA.其中LINE_AA是无锯齿直线。

@param bottomLeftOrigin:如果为真,则图像数据原点位于左下角。否则,它在左上角。

2.代码展示

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;
Mat src1 = imread("E:/image/Girl.png");

void addRectangle();

void main()
{
	
	if (!src1.data) {
		printf("could not load image...\n");
		return ;
	}
	imshow("【input picture】", src1);
	addText();
        imshow("【addText】", src1);
	waitKey(0);
}

void addText() {
	Point location = Point(200, src1.rows -10);
	string text = "Yukee--ZhaoMin";
	putText(src1, text, location, CV_FONT_BLACK, 2, Scalar(12, 255, 255), 3, 8);

}

3.执行结果

好啦今天的内容就讲到这里啦,希望大家能够多多练习,才能真正学懂啊!

猜你喜欢

转载自blog.csdn.net/shuiyixin/article/details/89406889