11.OpenCV C++ 绘图入门:矩形、圆、线、椭圆、多边形
OpenCV 提供了丰富的绘图函数,可以轻松实现矩形、圆、线、椭圆、多边形等基本图形的绘制,同时还支持形状的填充。通过掌握这些绘图函数,开发者可以在图像标注、图形生成、数据可视化等多种场景中得心应手
OpenCV C++ 绘图入门:矩形、圆、线、椭圆、多边形
在图像处理和计算机视觉项目中,往往需要在图像上绘制各种形状进行标注或调试。OpenCV 提供了丰富的绘图函数,可以轻松实现矩形、圆、线、椭圆、多边形等基本图形的绘制,同时还支持形状的填充以及随机绘图操作。本文将详细介绍这些绘图函数的使用方法,并附上示例代码,帮助大家快速上手 OpenCV 的绘图操作。
1. 矩形绘制 —— cv::rectangle
绘制矩形是最常见的标注操作。使用 cv::rectangle 函数可以在图像上绘制一个矩形框,并支持设置颜色、线宽以及是否填充。
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 创建一幅空白图像
Mat image = Mat::zeros(400, 600, CV_8UC3);
// 定义矩形左上角和右下角坐标
Point pt1(50, 50);
Point pt2(250, 200);
// 绘制矩形,颜色为蓝色,线宽为2,不填充 (-1 表示填充)
rectangle(image, pt1, pt2, Scalar(255, 0, 0), 2);
// 绘制填充的矩形
rectangle(image, Point(300, 50), Point(550, 200), Scalar(0, 255, 0), -1);
imshow("Rectangle", image);
waitKey(0);
return 0;
}
在上面的代码中,第一个 rectangle 绘制的是蓝色边框矩形,第二个则是填充的绿色矩形。
也可以使用下面重载函数。通过Rect参数绘制
rectangle(image, Rect(100, 100, 200, 200), Scalar(0, 255, 0), -1);
2. 圆形绘制 —— cv::circle
利用 cv::circle 函数,可以在图像上绘制一个圆形。除了指定圆心和半径外,还可以设置边框厚度或使用 -1 表示填充整个圆。
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = Mat::zeros(400, 600, CV_8UC3);
// 绘制空心圆,圆心在 (150,200),半径 50,颜色为红色,线宽 2
circle(image, Point(150, 200), 50, Scalar(0, 0, 255), 2);
// 绘制填充圆,圆心在 (450,200),半径 50,颜色为黄色
circle(image, Point(450, 200), 50, Scalar(0, 255, 255), -1);
imshow("Circle", image);
waitKey(0);
return 0;
}
上例中演示了如何绘制空心圆和填充圆,可以根据需要调整圆心、半径以及颜色等参数
3. 线条绘制 —— cv::line
cv::line 用于在图像上绘制直线。只需指定起点和终点,线条颜色以及线宽即可实现简单的直线绘制。
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = Mat::zeros(400, 600, CV_8UC3);
// 绘制一条白色直线,从 (50,350) 到 (550,350),线宽为3
line(image, Point(50, 350), Point(550, 350), Scalar(255, 255, 255), 3);
//第二条
line(image, Point(50, 100), Point(550, 100), Scalar(0, 0, 255), 3);
imshow("Line", image);
waitKey(0);
return 0;
}
直线绘制在很多场景中都非常常用,例如标注目标运动轨迹等。
4. 椭圆绘制 —— cv::ellipse
使用 cv::ellipse 函数可以绘制各种椭圆形,包括圆形(椭圆的特殊情况)。该函数不仅支持绘制旋转的椭圆,还可以指定起始角度和终止角度,从而绘制弧线。
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = Mat::zeros(400, 600, CV_8UC3);
// 绘制一个椭圆,中心点 (300,200),长轴 150,短轴 80,旋转角度 30 度,起始角 0,终止角 360
ellipse(image, Point(300, 200), Size(150, 80), 30, 0, 360, Scalar(255, 0, 255), 2);
// 绘制一个弧线
ellipse(image, Point(300, 200), Size(100, 50), 0, 0, 180, Scalar(0, 255, 255), 2);
imshow("Ellipse", image);
waitKey(0);
return 0;
}
在上述代码中,第一个 ellipse 绘制的是一个完整的椭圆,而第二个只绘制了从 0 到 180 度的弧线。也可以把线宽参数2改为-1进行填充。
5. 多边形绘制 —— cv::polylines 与填充 —— cv::fillPoly
有时我们需要绘制任意形状的多边形,这时可以使用 cv::polylines。若需要填充多边形内部,则可以使用 cv::fillPoly 或 cv::fillConvexPoly(当多边形为凸多边形时)。
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main() {
Mat image = Mat::zeros(400, 600, CV_8UC3);
// 定义一个多边形的顶点数组(例如一个五边形)
vector<Point> polyPoints;
polyPoints.push_back(Point(100, 50));
polyPoints.push_back(Point(200, 30));
polyPoints.push_back(Point(250, 100));
polyPoints.push_back(Point(150, 150));
polyPoints.push_back(Point(50, 100));
// 绘制多边形边界,颜色为绿色,线宽 2
const Point* pts = &polyPoints[0];
int npts = (int)polyPoints.size();
polylines(image, &pts, &npts, 1, true, Scalar(0, 255, 0), 2);
// 填充多边形内部,颜色为蓝色
fillPoly(image, vector<vector<Point> >{polyPoints}, Scalar(255, 0, 0));
imshow("Polygon", image);
waitKey(0);
return 0;
}
上例中,我们首先使用 polylines 绘制了一个五边形的边界,然后利用 fillPoly 将内部填充为蓝色。需要注意的是,polylines 中参数 true 表示多边形闭合。
6. 随机绘图演示
#include "stdio.h"
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
int main()
{
Mat srcImage = Mat::zeros(480, 640, CV_8UC3);
//画矩形
rectangle(srcImage, Rect(100, 100, 200, 200), Scalar(0, 255, 0), -1);
//画圆形
circle(srcImage, Point(300, 300), 100, Scalar(0, 0, 255), 2);
//画线
line(srcImage, Point(100, 100), Point(300, 300), Scalar(255, 0, 0), 2);
//画椭圆
ellipse(srcImage, Point(320, 240), Size(100, 50), 360, 0, 360, Scalar(255, 255, 255), 2);
//多边形
Point p1(100, 100);
Point p2(200, 100);
Point p3(300, 200);
Point p4(200, 400);
Point p5(80, 300);
std::vector<Point> points;
points.push_back(p1);
points.push_back(p2);
points.push_back(p3);
points.push_back(p4);
points.push_back(p5);
const Point* pts = (const cv::Point*)Mat(points).data;
int npt[] = { 5 };
//polylines(srcImage, points, true, Scalar(0, 0, 255), 2);
//填充多边形
//fillPoly(srcImage, points, Scalar(255, 0, 255), 8,0);
std::vector<std::vector<Point>> contours;
contours.push_back(points);
drawContours(srcImage, contours, -1, Scalar(255, 255, 0), -1);
//随机数
RNG rng(12345);
while (true)
{
int x1 = rng.uniform(0, srcImage.cols);
int y1 = rng.uniform(0, srcImage.rows);
int x2 = rng.uniform(0, srcImage.cols);
int y2 = rng.uniform(0, srcImage.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
line(srcImage, Point(x1, y1), Point(x2, y2), color, 1);
int keyValue = waitKey(20);
//ESC或Q退出
if ((keyValue == 27) || (keyValue == 'q'))
break;
imshow("src", srcImage);
}
cv::destroyAllWindows();
return 0;
}

drawContours 函数在轮廓查找和绘制中常用到,也可以用于绘制多边形。
7. 小结
本文详细介绍了 OpenCV C++ 中常用的绘图函数及其应用:
- 矩形:
cv::rectangle实现边框绘制和填充效果; - 圆形:
cv::circle轻松绘制空心和填充圆; - 直线:
cv::line用于绘制基本直线; - 椭圆与弧线:
cv::ellipse支持旋转与部分椭圆绘制; - 多边形:
cv::polylines与cv::fillPoly实现多边形边界绘制与填充; - 随机绘图:利用
cv::RNG生成随机参数,实现多样化的随机图形绘制。
通过掌握这些绘图函数,开发者可以在图像标注、图形生成、数据可视化等多种场景中得心应手。希望本文能帮助大家更深入地理解 OpenCV 的绘图能力,并在实际项目中发挥作用!
更多推荐
所有评论(0)