项目功能实现:对多边形进行轮廓绘制和填充
按照之前的博文结构来,这里就不在赘述了
一、头文件
mult-drawing.h
#pragma once
#include<opencv2/opencv.hpp>
using namespace cv;
class Mult_Drawing {
public:
void mult_drawing();
};
#pragma once
二、函数实现
mult-drawing.cpp
Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
定义一个画布,大小为512*512的全0黑色图片
Point p1(100, 100), p2(350, 100), p3(450, 280), p4(320, 450), p5(80, 400);
得到五个点的位置
pts.push_back(p1); pts.push_back(p2); pts.push_back(p3); pts.push_back(p4); pts.push_back(p5);
对这五个点进行绘制到pts上
方法一:
fillPoly(canvas, pts, Scalar(255, 0, 0), LINE_8, 0);
有了五个点的坐标位置,然后进行填充
polylines(canvas, pts, true, Scalar(0, 255, 0), 2, LINE_AA, 0);
类似,根据五个点的坐标位置进行轮廓绘制
具体的参数定义,可参考博文:十四、图像几何形状绘制
参数一:要处理的图片对象
参数二:各个多边形点的坐标
参数三:线条颜色
参数四:锯齿优化方法
参数五:微调偏置优化
方法二:
drawContours(canvas, contours, -1, Scalar(255, 0, 0), -1);
直接绘制,但需要轮廓的特征contours
也就是把pts这些已知的五个点的位置给扔到contours中即可
contours.push_back(pts);
像这样
参数一:处理的图片对象
参数二:轮廓数据信息
参数三:-1表示填充,其他正整数表示线条粗细
参数四:线条颜色
参数五:-1表示所有轮廓都绘制填充,其他正整数表示对哪个轮廓进行操作
#include"mult-drawing.h"
#include<iostream>
#include<opencv2/opencv.hpp>
void Mult_Drawing::mult_drawing() {
Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
Point p1(100, 100), p2(350, 100), p3(450, 280), p4(320, 450), p5(80, 400);
std::vector<Point>pts;
pts.push_back(p1); pts.push_back(p2); pts.push_back(p3); pts.push_back(p4); pts.push_back(p5);
//方法一:得到五个点之后,先填充再绘制
fillPoly(canvas, pts, Scalar(255, 0, 0), LINE_8, 0);
polylines(canvas, pts, true, Scalar(0, 255, 0), 2, LINE_AA, 0);
imshow("mult-drawing", canvas);
//方法二:直接填充绘制
std::vector<std::vector<Point>>contours;
contours.push_back(pts);
drawContours(canvas, contours, -1, Scalar(255, 0, 0), -1);
imshow("other method", canvas);
}
三、主函数
yy_main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
#include "mult-drawing.h"
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mult_Drawing yy;
yy.mult_drawing();
waitKey(0);
destroyAllWindows();
return 0;
}
项目结构如下:
效果图如下: