项目功能实现:矩形、圆形、椭圆等几何形状绘制,并与原图进行相应比例融合
按照之前的博文结构来,这里就不在赘述了
一、头文件
drawing.h
#pragma once
#include<opencv2/opencv.hpp>
using namespace cv;
class DRAWING {
public:
void drawing(Mat& image);
};
#pragma once
二、函数实现
drawing.cpp
Mat backgrand, result;
定义一个画布背景backgrand和进行融合之后的结果result
backgrand = Mat::zeros(image.size(), image.type());
背景图片的大小和原图一致,不过是全0的黑色背景
矩形绘制
Rect rect;
rect.x = 100;rect.y = 150;rect.width = 200;rect.height = 100;
rectangle(backgrand, rect, Scalar(255, 0, 0), -1, 8, 0);
参数一:处理的图片对象为backgrand
参数二:矩形的相关起始点以及宽高参数信息
参数三:颜色设置
参数四:-1表示填充,其余的正整数表示线条的宽度,数越大线条越宽
参数五:8这里代表LINE_8,其他参数还有LINE_4(可用4表示)、LINE_AA((可用16表示))
每个像素点都是浮点数,连线的时候会产生锯齿,通过相邻8个像素点进行消除锯齿
定义矩形的起始位置(x,y),以及矩形的高(y)和宽(x)
参数六:表示偏移量类似微调的效果,默认0即可
圆形绘制
circle(backgrand, Point(150, 150), 15, Scalar(0, 255, 0 ), 1);
参数一:处理的图片对象为backgrand
参数二:圆心位置
参数三:半径
参数四:颜色设置
参数五:线条宽度,-1表示填充,其他正整数表示线条粗细
线条绘制
line(backgrand, Point(100, 100), Point(200, 200), Scalar(255, 255, 255), 4, LINE_8, 0);
参数一:处理的图片对象为backgrand
参数二:起始位置
参数三:结束位置
参数四:颜色设置
参数五:线条宽度
参数六:和上面类似,LINE_8也可通过数字8进行替代
参数七:微调,偏移量,默认0即可
椭圆绘制
RotatedRect rrt;
rrt.center = Point(200, 200);rrt.size = Size(120, 90);rrt.angle = 90.0;
ellipse(backgrand, rrt, Scalar(0, 255, 255), 2, LINE_AA);
参数一:处理的图片对象为backgrand
参数二:椭圆绘制的相关参数信息,包括椭圆中心位置、角度等
参数三:颜色设置
参数四:线条宽度
参数五:和上面类似,LINE_AA也可通过数字16进行替代
特征融合
addWeighted(image, 0.7, backgrand, 0.3, 0, result);
原图image和背景图片backgrand按7:3进行融合,最终输出结果对象为result
这里的0表示beta也是一个偏移量微调的作用
#include"drawing.h"
#include<iostream>
#include<opencv2/opencv.hpp>
void DRAWING::drawing(Mat& image) {
Mat backgrand, result;
backgrand = Mat::zeros(image.size(), image.type());
Rect rect;
rect.x = 100;
rect.y = 150;
rect.width = 200;
rect.height = 100;
rectangle(backgrand, rect, Scalar(255, 0, 0), -1, 8, 0);
circle(backgrand, Point(150, 150), 15, Scalar(0, 255, 0 ), 1);
line(backgrand, Point(100, 100), Point(200, 200), Scalar(255, 255, 255), 4, LINE_AA, 0);
RotatedRect rrt;
rrt.center = Point(200, 200);
rrt.size = Size(120, 90);
rrt.angle = 90.0;
ellipse(backgrand, rrt, Scalar(0, 255, 255), 2, LINE_AA);
imshow("Drawing", backgrand);
addWeighted(image, 0.7, backgrand, 0.3, 0, result);
imshow("result", result);
}
三、主函数
yy_main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
#include "drawing.h"
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = cv::imread("E:/C++_workspace/beyond.jpg", IMREAD_COLOR);
if (src.empty()) {
printf("load image is false...\n");
return -1;
}
namedWindow("yanyu", WINDOW_FREERATIO);
imshow("yanyu", src);
DRAWING yy;
yy.drawing(src);
waitKey(0);
destroyAllWindows();
return 0;
}
项目结构如下:
效果图如下: