C++、Opencv相关图形绘制讲解、通道分离、ROI使用

一、创建矩阵:

Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
namedWindow("canvas", WINDOW_AUTOSIZE);
line(canvas, Point(10, 10), Point(400, 400), Scalar(0, 0, 255), 1, LINE_8);
  • 这段代码创建了一个黑色背景的图像,并在上面画了一条从左上角到右下角的红色直线。
  • 1.Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
  • 创建一个名为canvas的Mat对象(矩阵)
  • Mat::zeros创建一个所有元素都为0的矩阵(黑色背景)
  • Size(512, 512)指定矩阵大小为512x512像素
  • CV_8UC3表示8位无符号整数,3通道(用于BGR颜色)
  • namedWindow("canvas", WINDOW_AUTOSIZE);
  • 创建一个名为"canvas"的窗口
  • WINDOW_AUTOSIZE表示窗口大小将自动调整以适应图像
  • line(canvas, Point(10, 10), Point(400, 400), Scalar(0, 0, 255), 1, LINE_8);
  • 在canvas上绘制一条直线
  • Point(10, 10)是起点坐标
  • Point(400, 400)是终点坐标
  • Scalar(0, 0, 255)指定颜色为红色(BGR格式)
  • 1是线条粗细(像素)
  • LINE_8是线型(8连接线)

二、绘制矩形、圆形、文字、椭圆:

// 定义一个矩形,左上角坐标(100,100),宽200,高200
Rect rect(100, 100, 200, 200);

// 在canvas上绘制矩形,蓝色(BGR:255,0,0),线宽1,8连接线
rectangle(canvas, rect, Scalar(255, 0, 0), 1, 8);

// 绘制圆形,中心(256,256),半径100,绿色(BGR:0,255,0),填充(-1),8连接线
circle(canvas, Point(256, 256), 100, Scalar(0, 255, 0), -1, 8);

// 添加文字"hello, opencv",起点(100,50),字体FONT_HERSHEY_SIMPLEX,大小1.0,绿色,线宽2,8连接线
putText(canvas, "hello, opencv", Point(100, 50), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(0, 255, 0), 2, 8);

// 定义旋转矩形
RotatedRect rrt;
// 设置旋转矩形中心点(256,256)
rrt.center = Point2f(256, 256);
// 设置旋转角度45度
rrt.angle = 45.0;
// 设置矩形大小,宽100,高200
rrt.size = Size(100, 200);

// 绘制椭圆(旋转矩形),黄色(BGR:0,255,255),填充(-1),8连接线
ellipse(canvas, rrt, Scalar(0, 255, 255), -1, 8);

// 在名为"canvas"的窗口中显示图像
imshow("canvas", canvas);

三、通道分离用于颜色通道的单独处理和分析,以及创建特殊的颜色效果:

// 创建一个Mat类型的向量,用于存储分离后的通道
vector<Mat> mv;

// 将源图像src分离成单独的颜色通道
split(src, mv);

// 获取通道数量
int size = mv.size();

// 打印通道数量
printf("number of channels : %d \n", size);

// 显示蓝色通道
imshow("blue channel", mv[0]);

// 显示绿色通道
imshow("green channel", mv[1]);

// 显示红色通道
imshow("red channel", mv[2]);

// 对蓝色通道进行反转操作
bitwise_not(mv[0], mv[0]);

// 创建目标图像Mat对象
Mat dst;

// 将处理后的通道合并回一个图像
merge(mv, dst);

// 显示结果图像
imshow("result", dst);
  • 将输入图像分离成单独的颜色通道(蓝、绿、红)
  • 显示每个颜色通道
  • 对蓝色通道进行反转操作
  • 将处理后的通道重新合并成一个图像
  • 显示最终结果

四、ROI (Region of Interest) 感兴趣区域操作:

// ROI (Region of Interest) 感兴趣区域操作
// 定义ROI矩形
Rect roi;
roi.x = 100;      // ROI左上角x坐标
roi.y = 100;      // ROI左上角y坐标
roi.width = 250;  // ROI宽度
roi.height = 200; // ROI高度

// 从源图像中提取ROI区域并克隆,确保不影响原图
Mat sub = src(roi).clone();

// 对ROI区域进行反转操作
bitwise_not(sub, sub);

// 在源图像上绘制ROI矩形框,颜色为黄色(BGR:255,255,0),线宽1,8连接线
rectangle(src, roi, Scalar(255, 255, 0), 1, 8);

// 显示ROI区域
imshow("roi", sub);

// 显示带有ROI矩形框的原图
imshow("input", src);

// 等待按键
waitKey(0);

// 关闭所有窗口
destroyAllWindows();

// 函数返回
return 0;

这段代码演示了OpenCV中ROI(感兴趣区域)的使用:

  • 定义了一个矩形ROI
  • 从原图中提取ROI区域并克隆
  • 对ROI区域进行反转操作
  • 在原图上绘制ROI的边界框
  • 分别显示处理后的ROI和带有ROI边界框的原图

ROI操作在图像处理中非常有用,可以用于:

  • 提高处理效率(只处理图像的一部分)
  • 图像局部分析
  • 图像拼接
  • 模板匹配等任务

这个例子展示了如何提取、修改ROI,以及如何在原图上标记ROI位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值