// 绘制图形.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
using namespace std;
void drawLine(Mat &img); //函数声明
void drawRect(Mat &img); //矩形
void drawEllipse(Mat &img); //画椭圆
void drawCircle(Mat &img); //画圆
void drawPloy(Mat &img); //绘制填充
void drawText(Mat &img); //绘制文字
void drawRadomLine(Mat &img);
int main()
{
Mat src, dest;
src = imread("test.jpg");
dest = Mat::zeros(src.size(), src.type());
if (src.empty()) {
return -1;
}
drawLine(src);
drawRect(src);
drawEllipse(src);
drawCircle(src);
drawPloy(src);
drawText(src);
drawRadomLine(src);
namedWindow("src", CV_WINDOW_AUTOSIZE);
imshow("src", src);
waitKey();
return 0;
}
//画线
void drawLine(Mat &img) {
if (img.empty()) {
return;
}
Point p1 = Point(20, 30); //创建点的坐标
Point p2(30, 50); //另一个点的坐标
Scalar color = Scalar(0, 0, 255); // bgr 红色
//参数1:输入图像
//参数2:起始点坐标
//参数3:结束点坐标
//参数4:线的颜色
//参数5:表示线宽
//参数6:LINE_AA表示抗锯齿
line(img, p1, p2, color, 1, LINE_AA);
}
//画矩形
void drawRect(Mat &img) {
if (img.empty()) {
return;
}
Point p1 = Point(40, 60);
Point p2 = Point(100, 150);
Rect rect = Rect(p1, p2);
Scalar color = Scalar(255, 0, 0);
//参数1:输入图像
//参数2:矩形
//参数3:线的颜色
//参数4:线宽
//参数5:LINE_AA表示抗锯齿
rectangle(img, rect, color, 3, LINE_8);
}
//绘制椭圆
void drawEllipse(Mat &img) {
if (!img.data) {
return;
}
Scalar color = Scalar(0, 255, 0);
//参数1:输入图像
//参数2:椭圆的中心点
//参数3:椭圆的长轴和短轴,其中第一个为x轴,第二个参数为y轴
//参数4:椭圆的旋转角度
//参数5:椭圆的开始绘制的角度(开始点为右边垂直方向上的中心点,然后逆时针方向绘制)
//参数6:椭圆的结束角度
//参数7:椭圆的颜色 Scalar
//参数8:线宽
//参数9:线的类型,LINE_AA为抗锯齿
ellipse(img, Point(img.cols / 2, img.rows / 2), Size(img.cols / 4, img.rows / 8), 0, 30, 360, color, 2, LINE_8);
}
//绘制圆
void drawCircle(Mat &img) {
Point o = Point(120, 200);
Scalar color = Scalar(0, 255, 255); //bgr
//参数1:输入图像
//参数2:圆心
//参数3:圆半径
//参数4:线色
//参数5:线宽
//参数6:抗锯齿
circle(img, o, 100, color, 2, LINE_AA);
}
//绘制多变形并填充颜色
void drawPloy(Mat &img) {
Point pts[1][5]; //多边形的点
pts[0][0] = { 100,100 };
pts[0][1] = { 100,200 };
pts[0][2] = { 200,200 };
pts[0][3] = { 200,100 };
pts[0][4] = { 100,100 };
const Point *ppts[] = { pts[0] }; //指向数组的指针
int npts[] = { 5 };
Scalar color = Scalar(255, 11, 255);
fillPoly(img, ppts, npts, 1, color, LINE_8);
}
void drawText(Mat &img) {
//参数1:输入图像
//参数2:文字的起始点(第一个文字的左边基准线位值点,四线三格的三条线为)
//参数3:字体
//参数4:字体缩放 1.0表示不缩放
//参数5:字体颜色
//参数6:字体的粗细 1表示字体原始粗细
//参数6:表示字体是否抗锯齿
putText(img, "hello openCV", Point(100, 200), CV_FONT_HERSHEY_COMPLEX_SMALL, 1.0, Scalar(250, 30, 100), 1, LINE_AA);
}
//画随机线
void drawRadomLine(Mat &img) {
RNG rng(1122); //创建随机数对象,1122为种子数,最好以时间为种子
Point p1, p2;
Mat dest = Mat::zeros(img.size(), img.type());
for (int i = 0; i < 100; i++) { //随机画100条线
p1.x = rng.uniform(0, img.cols); //使随机数产生的范围为0和img.cols之间;
p1.y = rng.uniform(0, img.rows);
//p2.x = p1.x;
//p2.y = p1.y;
p2.x = rng.uniform(0, img.cols);
p2.y = rng.uniform(0, img.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
if (waitKey(50) > 0) {
break;
}
line(dest, p1, p2, color, 1, LINE_8);
namedWindow("test", CV_WINDOW_AUTOSIZE);
imshow("test", dest);
}
}
预览效果图: