一、创建矩阵:
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位置。