OpenCV图像处理-形状及文字绘制

OpenCV图像变化-形状及文字绘制

    • 前言
    • 向量
    • 线
    • 矩形
    • 椭圆
    • 填充
    • 文字
    • 画图示例

前言

本文使用的环境为:Qt5.11 + OpenCV3.4.6
环境安装参考文档:https://blog.csdn.net/z634863434/article/details/89950961

函数原型:

cv::Point cv::Point(x,y)

作用:根据坐标(x,y)创建一个点

输入参数 参数定义
x 横坐标
y 纵坐标

用法:

//创建(1,1)点
Point p;
p.x = 1;
p.y = 1;
//创建(1,1)点
Point p;
p = Point(1,1);

向量

函数原型:

 template cv::Scalar_< _Tp >::Scalar_ ( 
 		_Tp  	v0,
		_Tp  	v1,
		_Tp  	v2 = 0,
		_Tp  	v3 = 0 
	) 	

作用:标记通道的值,一般与CvType一起使用,通道数和CvType指定通道数一致

输入参数 参数定义
v0 蓝色通道(B)
v1 绿色通道(G)
v2 红色通道(R)
v3 透明度通道(alpha)

用法:

//创建一个3*3的图像,每个通道8个字节长度 uchar类型,通道数量为3的Mat对象,并将初始颜色设为(127,0,255)
Mat img= Mat(3,3,CV_8UC3,Scalar(127,0,255))

线

函数原型:

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

作用:绘制线条

输入参数 参数定义
img 原始图像
pt1 起始点
pt2 结束点
color 线条颜色向量
thickness 线条粗细
lineType 线条类型 LINE_4(4链路线) \ LINE_8 (8链路线)\ LINEAA(抗锯齿线)
shift 点坐标中的小数位数

用法:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建图像500*500
    Mat src = Mat::zeros(500,500,CV_8UC3);
    if(src.empty()){
        qDebug()<<"can not create image...\n";
        return ;
    }
    //创建点(20,30)(300,300)
    Point p1 = Point(20,30);
    Point p2;
    p2.x = 300;
    p2.y = 300;
    //设置颜色为红色
    Scalar color = Scalar(0,0,255);
    //画线
    line(src,p1,p2,color,1,LINE_AA);
    //显示图像
    namedWindow("input1",WINDOW_AUTOSIZE);
    imshow("input1",src);
    waitKey(0);
 }

输出结果:
OpenCV图像处理-形状及文字绘制_第1张图片

矩形

函数原型1:

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

作用:绘制矩形

输入参数 参数定义
img 原始图像
pt1 起始点
pt2 结束点
color 线条颜色向量
thickness 线条粗细
lineType 线条类型 LINE_4(4链路线) \ LINE_8 (8链路线)\ LINEAA(抗锯齿线)
shift 点坐标中的小数位数

用法:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建图像500*500
    Mat src = Mat::zeros(500,500,CV_8UC3);
    if(src.empty()){
        qDebug()<<"can not create image...\n";
        return ;
    }
    //创建点(20,30)(300,300)
    Point p1 = Point(20,30);
    Point p2;
    p2.x = 300;
    p2.y = 300;
    //设置颜色为红色
    Scalar color = Scalar(0,0,255);
    //画线
    rectangle(src,p1,p2,color,1,LINE_AA);
    //显示图像
    namedWindow("input1",WINDOW_AUTOSIZE);
    imshow("input1",src);
    waitKey(0);

函数原型2:

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

作用:绘制矩形

输入参数 参数定义
img 原始图像
rec 矩形
color 线条颜色向量
thickness 线条粗细
lineType 线条类型 LINE_4(4链路线) \ LINE_8 (8链路线)\ LINEAA(抗锯齿线)
shift 点坐标中的小数位数

用法:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建图像500*500
    Mat src = Mat::zeros(500,500,CV_8UC3);
    if(src.empty()){
        qDebug()<<"can not create image...\n";
        return ;
    }
    //创建矩形对象 起始点(20,30)长280 宽270
    Rect rect = Rect(20,30,280,270);
    //设置颜色为红色
    Scalar color = Scalar(0,0,255);
    //画矩阵
    rectangle(src,rect,color,1,LINE_AA);
    //显示图像
    namedWindow("input1",WINDOW_AUTOSIZE);
    imshow("input1",src);
    waitKey(0);
}

输出结果:
OpenCV图像处理-形状及文字绘制_第2张图片

椭圆

函数原型:

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 
	) 	

作用:绘制椭圆(当Size两边半径相等时为圆)

输入参数 参数定义
img 原始图像
Point 中心点
Size 椭圆轴半径
angle 椭圆旋转角
startAngle 开始角度
endAngle 结束角度
color 线条颜色向量
thickness 线条粗细
lineType 线条类型 LINE_4(4链路线) \ LINE_8 (8链路线)\ LINEAA(抗锯齿线)
shift 点坐标中的小数位数

用法:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建图像500*500
    Mat src = Mat::zeros(500,500,CV_8UC3);
    if(src.empty()){
        qDebug()<<"can not create image...\n";
        return ;
    }
    Point p1(250,250);
    //设置颜色为红色
    Scalar color = Scalar(0,0,255);
    //画椭圆
    ellipse(src,p1,Size(100,200),90,0,360,color,1,LINE_AA);
    //显示图像
    namedWindow("input1",WINDOW_AUTOSIZE);
    imshow("input1",src);
    waitKey(0);
}

输出结果:
OpenCV图像处理-形状及文字绘制_第3张图片

函数原型:

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

作用:绘制圆

输入参数 参数定义
img 原始图像
Point 中心点
radius 圆半径
color 线条颜色向量
thickness 线条粗细
lineType 线条类型 LINE_4(4链路线) \ LINE_8 (8链路线)\ LINEAA(抗锯齿线)
shift 点坐标中的小数位数

用法:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建图像500*500
    Mat src = Mat::zeros(500,500,CV_8UC3);
    if(src.empty()){
        qDebug()<<"can not create image...\n";
        return ;
    }
    Point p1(250,250);
    //设置颜色为红色
    Scalar color = Scalar(0,0,255);
    //画圆
    circle (src,p1,100,color,1,LINE_AA);
    //显示图像
    namedWindow("input1",WINDOW_AUTOSIZE);
    imshow("input1",src);
    waitKey(0);
 }

输出结果:
OpenCV图像处理-形状及文字绘制_第4张图片

填充

函数原型:

void cv::fillPoly(  Mat &  	img,
					const Point **  	pts,
					const int *  	npts,
					int  	ncontours,
					const Scalar &  	color,
					int  	lineType = LINE_8,
					int  	shift = 0,
					Point  	offset = Point() 
	) 	

作用:对多边形填充颜色

输入参数 参数定义
img 原始图像
pts 围成多边形的点
npts 点的个数
ncontours 轮廓数
color 颜色
lineType 线条类型 LINE_4(4链路线) \ LINE_8 (8链路线)\ LINEAA(抗锯齿线)
offset 补偿

用法:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建图像500*500
    Mat src = Mat::zeros(500,500,CV_8UC3);
    if(src.empty()){
        qDebug()<<"can not create image...\n";
        return ;
    }
    //创建围成多边形的点
    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]};
    //根据函数调用要求,将数量转化成指针
    const int npt[] = {5};
    //设置颜色为红色
    Scalar color = Scalar(0,0,255);
    //进行填充
    fillPoly(src,ppts,npt,1,color);
    //显示图像
    namedWindow("input1",WINDOW_AUTOSIZE);
    imshow("input1",src);
    waitKey(0);

输出结果:
OpenCV图像处理-形状及文字绘制_第5张图片

文字

函数原型:

void cv::putText ( 	InputOutputArray  	img,
					const String &  	text,
					Point  	org,
					int  	fontFace,
					double  	fontScale,
					Scalar  	color,
					int  	thickness = 1,
					int  	lineType = LINE_8,
					bool  	bottomLeftOrigin = false 
	) 		

作用:绘制字体

输入参数 参数定义
img 原始图像
String 需要绘制的字符串
org 绘制的起点,左下角开始算
fontFace 字体类型
fontScale 字体缩放因数
color 颜色
thickness 线条粗细
lineType 线条类型 LINE_4(4链路线) \ LINE_8 (8链路线)\ LINEAA(抗锯齿线)
offset 补偿

用法:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建图像500*500
    Mat src = Mat::zeros(500,500,CV_8UC3);
    if(src.empty()){
        qDebug()<<"can not create image...\n";
        return ;
    }
    //绘制字体
    putText(src,"OpenCV",Point(100,100),CV_FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255));
    //显示图像
    namedWindow("input1",WINDOW_AUTOSIZE);
    imshow("input1",src);
    waitKey(0);
}

输出结果:
OpenCV图像处理-形状及文字绘制_第6张图片

画图示例

随机生成线条

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建图像500*500
    Mat src = Mat::zeros(500,500,CV_8UC3);
    if(src.empty()){
        qDebug()<<"can not create image...\n";
        return ;
    }
    //创建随机数种子
    RNG rng(123456);
    //创建线条的两个端点
    Point pt1;
    Point pt2;
    while(1){
        //随机生成端点位置 但必须在画布内
        pt1.x = rng.uniform(0,src.cols);
        pt1.y = rng.uniform(0,src.rows);
        pt2.x = rng.uniform(0,src.cols);
        pt2.y = rng.uniform(0,src.rows);
        //随机生成颜色,0~255
        Scalar color = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
        //用户操作中断
        if(waitKey(50)>0){

        }
        //画线
        line(src,pt1,pt2,color);
        imshow("input1",src);
    }
}

OpenCV图像处理-形状及文字绘制_第7张图片

你可能感兴趣的:(OpenCV,Qt,OpenCV,Qt,画图,形状,文字)