opencv在图片指定区域内填充矩形,并在图片中显示矩形的轮廓

该博客介绍了如何在指定区域内利用OpenCV进行矩形填充,并展示矩形的轮廓。通过在图片上应用setTo方法填充矩形,然后绘制轮廓,实现了在图片中呈现矩形的效果。

需求:
在图片中画出指定区域的轮廓
解决方法:
先在图片中填充一块矩形,然后画出矩形的轮廓在图片中显示

//画出指定区域的轮廓;

#include "stdafx.h"
#include <highgui.h>
#include <cv.h>
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
    Mat img= imread("图片.JPG");
    Mat mask = Mat::zeros(img.size(),CV_8UC1);
    Rect rect;
    rect.x = 100;
    rect.y = 100;
    rect.width = 100;
    rect.height = 100;
    mask(rect).setTo(255);

    
<think>我们使用OpenCV在图像上绘制图形。对于矩形OpenCV提供了直接绘制矩形的函数,包括轴对齐矩形和旋转矩形。对于三角形,由于没有直接绘制三角形的函数,我们可以通过绘制三条线段来形成三角形,或者使用多边形填充来绘制实心三角形。 ### 一、绘制矩形 #### 1. 轴对齐矩形(水平/垂直) 使用`cv2.rectangle()`函数,指定左上角和右下角坐标: ```python import cv2 import numpy as np # 创建一个黑色背景图像 image = np.zeros((500, 500, 3), dtype=np.uint8) # 绘制矩形: 左上角(50,50),右下角(200,200),颜色(0,255,0)绿色,线宽2 cv2.rectangle(image, (50, 50), (200, 200), (0, 255, 0), 2) ``` #### 2. 旋转矩形 使用`cv2.boxPoints()`获取旋转矩形的四个顶点,然后用`cv2.drawContours()`绘制: ```python # 定义旋转矩形的中心点(300,300),宽度200,高度100,旋转角度30度 center = (300, 300) size = (200, 100) # 宽度和高度 angle = 30 # 计算旋转矩形的四个顶点 rect = ((center), (size), angle) box = cv2.boxPoints(rect) box = np.int0(box) # 转换为整数 # 绘制旋转矩形 cv2.drawContours(image, [box], 0, (0, 0, 255), 2) ``` ### 二、绘制三角形 #### 方法1:绘制空心三角形(三条线段) 通过连接三个顶点绘制: ```python # 定义三个顶点 pt1 = (400, 50) pt2 = (350, 150) pt3 = (450, 150) # 绘制三条边 cv2.line(image, pt1, pt2, (255, 0, 0), 2) cv2.line(image, pt2, pt3, (255, 0, 0), 2) cv2.line(image, pt3, pt1, (255, 0, 0), 2) ``` #### 方法2:绘制实心三角形(多边形填充使用`cv2.fillPoly()`或`cv2.drawContours()`填充多边形: ```python # 定义三个顶点 pts = np.array([[400, 250], [350, 350], [450, 350]], dtype=np.int32) # 将顶点数组变形为三维数组(因为fillPoly要求三维数组) pts = pts.reshape((-1, 1, 2)) # 绘制实心三角形 cv2.fillPoly(image, [pts], (255, 0, 0)) # 或者使用drawContours # cv2.drawContours(image, [pts], 0, (255,0,0), -1) # -1表示填充 ``` ### 三、显示图像 ```python cv2.imshow('Shapes', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 四、完整示例代码 ```python import cv2 import numpy as np # 创建黑色背景图像 image = np.zeros((500, 500, 3), dtype=np.uint8) # 1. 绘制轴对齐矩形(绿色) cv2.rectangle(image, (50, 50), (200, 200), (0, 255, 0), 2) # 2. 绘制旋转矩形(红色) center = (300, 300) size = (200, 100) # 宽度和高度 angle = 30 rect = (center, size, angle) box = cv2.boxPoints(rect) box = np.int0(box) cv2.drawContours(image, [box], 0, (0, 0, 255), 2) # 3. 绘制空心三角形(蓝色,用三条线) pt1 = (50, 300) pt2 = (100, 400) pt3 = (150, 300) cv2.line(image, pt1, pt2, (255, 0, 0), 2) cv2.line(image, pt2, pt3, (255, 0, 0), 2) cv2.line(image, pt3, pt1, (255, 0, 0), 2) # 4. 绘制实心三角形(蓝色,用多边形填充) pts = np.array([[400, 250], [350, 350], [450, 350]], dtype=np.int32) pts = pts.reshape((-1, 1, 2)) cv2.fillPoly(image, [pts], (255, 0, 0)) # 显示图像 cv2.imshow('Shapes', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 五、注意事项 1. 坐标系统:OpenCV图像坐标原点在左上角,x轴向右,y轴向下。 2. 颜色顺序:OpenCV默认使用BGR顺序,即(蓝, 绿, 红)。 3. 线宽:如果线宽设置为负数(如-1)则表示填充图形。 4. 旋转矩形的角度:`cv2.boxPoints`中角度以度为单位,且顺时针为正(与Halcon不同)[^3]。 --- §§相关问题§§ 1. OpenCV中如何绘制圆形和椭圆? 2. 如何通过鼠标交互在图像上绘制矩形和三角形? 3. OpenCV中如何计算绘制图形的面积和周长? 4. 如何将绘制的图形作为掩模(mask)应用于图像处理? [^1]: OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域。 [^2]: [C++] opencv - 绘制基本图形(比如三角形,矩形,圆,椭圆等)。 [^3]: 使用openCV python绘制实心旋转的矩形。 [^4]: 绘多边形:如三角形。 [^5]: 使用OpenCV对图像进行三角形检测、颜色识别与距离估算。</think>### 使用OpenCV在图像上绘制三角形和矩形 OpenCV提供了多种绘制基本图形的方法,以下是绘制三角形和矩形的详细步骤: --- #### 一、绘制矩形 OpenCV支持两种矩形绘制方式: 1. **轴对齐矩形(水平/垂直)** ```python import cv2 import numpy as np # 创建黑色背景 image = np.zeros((500, 500, 3), dtype=np.uint8) # 绘制矩形:左上角(50,50),右下角(200,200) # 参数:图像,起点,终点,颜色(BGR),线宽 cv2.rectangle(image, (50, 50), (200, 200), (0, 255, 0), 2) # 绿色矩形 ``` 2. **旋转矩形** ```python # 定义旋转矩形:中心(300,300),宽200,高100,旋转角度30° center = (300, 300) size = (200, 100) # (宽, 高) angle = 30 # 获取旋转矩形的四个顶点 rect = (center, size, angle) box = cv2.boxPoints(rect) box = np.int0(box) # 转换为整数坐标 # 绘制旋转矩形 cv2.drawContours(image, [box], 0, (0, 0, 255), 2) # 红色旋转矩形 ``` --- #### 二、绘制三角形 OpenCV没有直接的三角形绘制函数,可通过以下两种方式实现: 1. **空心三角形(三条线段)** ```python # 定义三个顶点 pt1 = (400, 50) pt2 = (350, 150) pt3 = (450, 150) # 绘制三条边 cv2.line(image, pt1, pt2, (255, 0, 0), 2) # 蓝色线 cv2.line(image, pt2, pt3, (255, 0, 0), 2) cv2.line(image, pt3, pt1, (255, 0, 0), 2) ``` 2. **实心三角形(多边形填充)** ```python # 定义顶点坐标 pts = np.array([[100, 300], [50, 400], [150, 400]], dtype=np.int32) # 绘制实心三角形 cv2.fillPoly(image, [pts], (255, 255, 0)) # 黄色实心三角形 ``` --- #### 三、显示和保存结果 ```python # 显示图像 cv2.imshow("Shapes", image) cv2.waitKey(0) # 保存结果 cv2.imwrite("output.png", image) ``` --- #### 四、完整示例代码 ```python import cv2 import numpy as np # 创建黑色背景 image = np.zeros((500, 500, 3), dtype=np.uint8) # 1. 绘制轴对齐矩形 cv2.rectangle(image, (50, 50), (200, 200), (0, 255, 0), 2) # 2. 绘制旋转矩形 center = (300, 300) size = (200, 100) rect = (center, size, 30) box = cv2.boxPoints(rect) cv2.drawContours(image, [np.int0(box)], 0, (0, 0, 255), 2) # 3. 绘制空心三角形 cv2.line(image, (400, 50), (350, 150), (255, 0, 0), 2) cv2.line(image, (350, 150), (450, 150), (255, 0, 0), 2) cv2.line(image, (450, 150), (400, 50), (255, 0, 0), 2) # 4. 绘制实心三角形 pts = np.array([[100, 300], [50, 400], [150, 400]]) cv2.fillPoly(image, [pts], (255, 255, 0)) # 显示结果 cv2.imshow("Result", image) cv2.waitKey(0) cv2.destroyAllWindows() ``` --- #### 关键参数说明: 1. **颜色格式**:BGR顺序,如`(0, 255, 0)`表示绿色 2. **线宽**: - 正值:边框厚度 - `-1`:填充图形(仅适用于`cv2.rectangle`) 3. **坐标系统**:原点在左上角,X轴向右,Y轴向下 4. **旋转角度**:顺时针为正方向(与数学坐标系相反) --- ### 效果对比图 | 图形类型 | 示意图 | |----------|--------| | 轴对齐矩形 | ![轴对齐矩形](https://via.placeholder.com/150x150/00FF00?text=Rect) | | 旋转矩形 | ![旋转矩形](https://via.placeholder.com/150x150/FF0000?text=Rotated) | | 空心三角形 | ![空心三角形](https://via.placeholder.com/150x150/0000FF?text=Triangle) | | 实心三角形 | ![实心三角形](https://via.placeholder.com/150x150/FFFF00?text=Filled) | > **注意**:实际应用中可通过`cv2.imread()`加载现有图像,在原始图像上绘制图形[^1][^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值