OpenCV 学习笔记-day14 图像几何形状绘制 (rect类 RotatedRect 类,rectangle绘制矩形 circle绘制圆形函数 line画线函数 ellipse画椭圆函数)

day14 图像几何形状绘制

用rectangle函数直接在图像上绘制一个矩形框或者先用rect函数先绘制一个矩形框再用rectangle标记在图像上,rectangle通常用在图片的标记上

数据类型

rect类

用来绘制矩形
Rect(int x, int y, int width, int height)
Rect(矩形左上角 x 坐标,矩形左上角 y 坐标,矩形的宽,矩形的高)
rect类详解–rect类详解
例1

Rect rect;
rect.x = 200;
rect.y = 180;
rect.width = 150;
rect.height = 150;
//Rect(int x, int y, int width, int height),
//Rect(左上角 x 坐标,左上角 y 坐标,矩形的宽,矩形的高)
RotatedRect 类

RotatedRect是一个存储旋转矩形的类
类型中的成员:
RotatedRect该类表示平面上的旋转矩形(外接矩阵)
包含以下三部分:

椭圆外接最小矩形中心点(质心)-center
边长(长和宽)-height,width
旋转角度-angle

//定义
class CV_EXPORTS RotatedRect
{
public:
    //构造函数
    RotatedRect();
    RotatedRect(const Point2f& center, const Size2f& size, float angle);
    RotatedRect(const CvBox2D& box);
    void points(Point2f pts[]) const;//!返回矩形的4个顶点
    Rect boundingRect() const; //返回包含旋转矩形的最小矩形
    operator CvBox2D() const;    //!转换到旧式的cvbox2d结构
    Point2f center; //矩形的质心
    Size2f size;   //矩形的边长
    float angle;  //旋转角度,当角度为0、90、180、270等时,矩形就成了一个直立的矩形
};

在这里插入图片描述
转自另一个博主的详解– RotatedRect类 详解

例2

//绘制椭圆
RotatedRect rrt;//绘制椭圆
rrt.center = Point(100, 100); //矩形中心点(质心)
rrt.size = Size(100,150);//边长(长和宽)
rrt.angle = 90.0; //旋转角度
ellipse(bg, rrt, Scalar(0, 0, 255), 2, LINE_AA);//将绘制的椭圆绘制在图像上

函数

  1. rectangle()绘制矩形

rectangle函数是用来绘制一个矩形框的,通常用在图片的标记上

//定义1
CV_EXPORTS void rectangle(CV_IN_OUT Mat& img, Rect rec,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0);
参数说明
imgMat类型 输入输出图像
recRect类型 绘制好的矩形框(左上角坐标和长宽已确定)
color用Scalar函数绘制颜色
thickness矩形框填充方式 thickness>0为矩形框, thickness<0为填充 默认为1
lineType矩形框的线条类型 默认为8
shift点坐标小数数位 默认为0

将绘制好的矩形框rec放置在输出图像img中

例3
将左上角坐标为(400,200),长宽为150*150的矩形框放置在图像image中

Rect rect;//Rect(int x, int y, int width, int height),Rect(左上角 x 坐标,左上角 y 坐标,矩形的宽,矩形的高)
rect.x = 400;
rect.y = 280;
rect.width = 150;
rect.height = 150;
rectangle(image,rect,Scalar(0,255,255),1,8,0);//在image上绘制一个左上坐标为(200,200),100*100的矩形框
//rectangle(输入输出图像,绘制矩形,颜色,填充方式(>0为矩形框,<0为填充),线条规格,点坐标小数数位

//定义2
CV_EXPORTS_W void rectangle(InputOutputArray img, Point pt1, Point pt2,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0);
参数说明
imgMat类型 输入输出图像
pt1左上顶点坐标
pt2右下点坐标 (左上角坐标和长宽要在ptr中决定)
color用Scalar函数绘制颜色
thickness矩形框填充方式 thickness>0为矩形框, thickness<0为填充 默认为1
lineType矩形框的线条类型 默认为8
shift点坐标小数数位 默认为0

例4

Point left,right;//左上和右下的坐标点
left.x = 200;
left.y = 200;
right.x = 350;
right.y = 350;
rectangle(image,left,right,Scalar(0,255,255),-1,8,0);
//thickness==-1 为填充
  1. circle() 绘制圆形函数
//定义
CV_EXPORTS_W void circle(InputOutputArray img, Point center, int radius,
                       const Scalar& color, int thickness = 1,
                       int lineType = LINE_8, int shift = 0);
参数说明
imgMat类型 输入输出图像
center画圆的圆心坐标
radius圆的半径
color用Scalar函数绘制圆颜色
thickness如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充
lineType线条类型 默认为8
shift圆心坐标点和半径值的小数点位数

例5

circle(image,Point(100,100),15,Scalar(0,0,255),2,8,0);
//圆心坐标为(100,100)
//半径为15
//颜色(0,0,255)
//线条粗细程度为2
  1. line()画线函数
//定义
CV_EXPORTS_W void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
                     int thickness = 1, int lineType = LINE_8, int shift = 0);
参数说明
imgMat类型 输入输出图像
ptr1point类型 线段起点
ptr2point类型 线段终点
color用Scalar函数绘制圆颜色
thickness如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充
lineType线条类型 默认为8
shift坐标点的小数点位数

例6

//绘制线条
line(bg,point(150,150),point(370,370),scalar(0,255,0),2,8,0);
  1. ellipse() 函数

定义1
用椭圆外接矩形参数绘制椭圆

CV_EXPORTS_W void ellipse(InputOutputArray img, const RotatedRect& box, const Scalar& color,
                        int thickness = 1, int lineType = LINE_8);
参数说明
imgMat类型 输入输出图像
boxRotatedRect类型 旋转好的外接矩阵内嵌椭圆(包括外接矩形的中心,变长和旋转角度)
color用Scalar函数绘制圆颜色
thickness如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充
lineType线条类型 默认为8

例7

	RotatedRect rrt;//绘制椭圆
	rrt.center = Point(100, 100); //矩形中心点(质心)
	rrt.size = Size(100,150);//边长(长和宽)
	rrt.angle = 90.0; //旋转角度
	ellipse(bg, rrt, Scalar(0, 0, 255), 2, LINE_AA);//将绘制的椭圆绘制在图像上

定义2 直接用函数带参数绘制椭圆

CV_EXPORTS_W void 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);
参数说明
imgMat类型 输入输出图像
centerpoint类型 椭圆中心坐标
axesSize类型 椭圆的边长(注意有两个参数)
angle椭圆旋转角度(短轴相当于x轴的角度,具体看以下画椭圆实例)
color用Scalar函数绘制圆颜色
thickness线条的粗细程度
lineType线条类型 默认为8
shift坐标点和边长的小数点位数

例8

ellipse(bg, Point(220, 220),Size(50,30),0,0,360,Scalar(0,0,255),2,8,0);

代码

quickopencv.h

#pragma once

#include <opencv2\highgui.hpp>

#include <opencv2\imgproc.hpp>

using namespace cv;
//定义类
class QuickDemo{
public:
	void colorSpace_Demo(Mat &image);//色彩空间转换函数2021-12-24
	void mat_creation_demo(Mat &image);//Mat对象与创建2021-12-27
	void pixel_vist_Demo(Mat &image);//图像像素的读写操作2022-1-3
	void operators_demo(Mat &image);//图像像素的算数操作2022-1-4
	void tracking_bar_demo(Mat &image);//滚动条操作演示2022-1-7
	void key_demo(Mat &image);//键盘响应操作2022-1-12
	void color_style_demo(Mat &image);//OpenCV自带颜色表操作2022-1-12
	void bitwise_demo(Mat &image);//位操作(逻辑操作)2022-1-17
	void channels_demo(Mat &image);//通道分离与合并2022-1-17
	void inrange_demo(Mat &image);//roi区域提取 2022-1-20
	void pixel_statistic_demo(Mat &image);//像素值统计2022-1-21
	void drawing_demo(Mat &image);//图像几何形状绘制 2022-2-8

};

QuickDemo.cpp

#include <opencv2\highgui.hpp>

#include <opencv2\imgproc.hpp>

#include<quickopencv.h>

#include <iostream>
void QuickDemo::drawing_demo(Mat &image)
{
	Rect rect;//Rect(int x, int y, int width, int height),Rect(左上角 x 坐标,左上角 y 坐标,矩形的宽,矩形的高)
	rect.x = 200;
	rect.y = 180;
	rect.width = 150;
	rect.height = 150;
	Point left,right;
	left.x = 150;
	left.y = 150;
	right.x = 370;
	right.y = 370;
	//rectangle(image,rect,Scalar(0,255,255),1,8,0);//在image上绘制一个左上坐标为(200,200),100*100的矩形框
	//rectangle(输入输出图像,绘制矩形,颜色,填充方式(>0为矩形框,<0为填充),线条规格,点坐标小数数位)--显示效果1
	//rectangle(image,left,right,Scalar(0,255,255),-1,8,0);//填充-显示效果2
	//imshow("绘制演示", image);

	//画圆
	Mat bg = Mat::zeros(image.size(), image.type());
	//circle(bg,Point(100,100),15,Scalar(0,0,255),2,8,0);//LINE_AA反锯齿 ---显示效果3
	//imshow("画圆", bg);

	//填充的矩形框框选人脸

	//rectangle(bg, left, right, Scalar(0, 0, 255), -1, 8, 0);
	//Mat dst;
	//addWeighted(image,0.7, bg, 1, 0, dst); 
	/*void addWeighted(InputArray src1, double alpha, InputArray src2,
		double beta, double gamma, OutputArray dst, int dtype = -1); dst = src1*alpha + src2*beta + gamma; */
	//---显示效果4
	//imshow("填充的矩形框框选人脸",dst);

	//绘制线条
	//line(bg,point(150,150),point(370,370),scalar(0,255,0),2,8,0);
	//addweighted(image,0.7,bg,1,0,dst);//将绘制的线条绘制在图像上
	//imshow("线条",dst);//---显示效果5

	//绘制椭圆
	RotatedRect rrt;//绘制椭圆
	rrt.center = Point(100, 100); //矩形中心点(质心)
	rrt.size = Size(100,150);//边长(长和宽)
	rrt.angle = 90.0; //旋转角度
	ellipse(bg, rrt, Scalar(0, 0, 255), 2, LINE_AA);//将绘制的椭圆绘制在图像上
	//imshow("绘制椭圆",bg);//---显示效果6

	ellipse(bg, Point(220, 220),Size(50,30),0,0,360,Scalar(0,0,255),2,8,0);
	imshow("绘制椭圆2", bg);
}
#include <iostream>
//#include "opencv2\core.hpp"
//#include <opencv2\opencv.hpp>
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include<quickopencv.h>

using namespace cv;
using namespace std;


int main()
{
	Mat scr = imread("D:\\学习\\OpenCV学习\\pictures\\image\\2.webp");//打开一张图
	if (!scr.data == 1)//判空
		return -1;
	namedWindow("窗口1", WINDOW_NORMAL);//创建 WINDOW_FREERATIO窗口
	imshow("窗口1",scr);//在创建的窗口显示
	QuickDemo qd;
	qd.drawing_demo(scr);
	waitKey(0);
	return 0;
}

显示效果1 矩形框显示
在这里插入图片描述

显示效果2 填充
在这里插入图片描述
显示效果3 画圆
在这里插入图片描述

画圆 去锯齿
在这里插入图片描述

显示效果4 填充的矩形框框选人脸
在这里插入图片描述
显示效果5 画线条 将绘制的线条绘制在图像上
在这里插入图片描述
显示效果6 画椭圆
旋转角度为0.0
在这里插入图片描述
旋转角度为10.0
在这里插入图片描述
旋转角度为45.0
在这里插入图片描述

旋转角度为 90.0
在这里插入图片描述

显示效果7 绘制圆弧
中心坐标(220,220),
轴长50,30 ,
偏转角度为0,
起始角角度为0,
终止角度为360
ellipse(bg,Point(220,220),Size(50,30),0,0,360,Scalar(0,0,255),2,8,0);
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一份简单的C++代码,使用OpenCV库实现了红色和蓝色区域的识别,并在原始图像中用圆形框和矩形框标出: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main() { // 读入原始图像 Mat image = imread("image.jpg"); // 转换颜色空间为HSV Mat hsv_image; cvtColor(image, hsv_image, COLOR_BGR2HSV); // 设定红色和蓝色的颜色范围 Scalar lower_red = Scalar(0, 70, 50); Scalar upper_red = Scalar(10, 255, 255); Scalar lower_blue = Scalar(100, 70, 50); Scalar upper_blue = Scalar(130, 255, 255); // 根据颜色范围进行颜色提取 Mat red_mask, blue_mask; inRange(hsv_image, lower_red, upper_red, red_mask); inRange(hsv_image, lower_blue, upper_blue, blue_mask); // 使用形态学操作去除噪声 Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5)); morphologyEx(red_mask, red_mask, MORPH_OPEN, kernel); morphologyEx(blue_mask, blue_mask, MORPH_OPEN, kernel); // 寻找红色和蓝色区域的轮廓 std::vector<std::vector<Point>> red_contours, blue_contours; findContours(red_mask, red_contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); findContours(blue_mask, blue_contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 在原始图像中标出红色和蓝色区域 for (auto contour : red_contours) { Rect rect = boundingRect(contour); Point center = Point(rect.x + rect.width / 2, rect.y + rect.height / 2); circle(image, center, rect.width / 2, Scalar(0, 0, 255), 2); } for (auto contour : blue_contours) { Rect rect = boundingRect(contour); rectangle(image, rect, Scalar(255, 0, 0), 2); } // 显示结果图像 imshow("Result", image); waitKey(0); return 0; } ``` 其中,我们首先读入原始图像,并将其转换到HSV颜色空间。然后,我们设定红色和蓝色的颜色范围,并根据颜色范围进行颜色提取。接着,我们使用形态学操作去除噪声,并寻找红色和蓝色区域的轮廓。最后,我们在原始图像中标出红色和蓝色区域,并展示结果图像

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值