文章目录
前言
本文将介绍一个基于OpenCV的课题项目,该项目的实现过程包括图像的读取与预处理、轮廓检测、形状识别、颜色分析以及距离计算。所涉及的技术和方法可以广泛应用于机器人视觉系统、自动化检测设备以及其他需要图像识别与处理的场景
功能概述
1. 三角形检测:从图像中检测出三角形
2. 颜色识别:分析每个三角形的颜色并转换为相应的英文名称
3. 距离估算:基于图像中三角形的像素高度,估算其实际距离
必要环境
安装OpenCV和NumPy库
- 安装opencv:
pip install opencv-python==4.4.0.42 -i https://pypi.tuna.tsinghua.edu.cn/simple
- 安装numpy:
pip install numpy==1.23.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
一、代码结构
1. 参数定义
parser = argparse.ArgumentParser(description="Process images to detect contours and classify colors.")
parser.add_argument("--folder_path", type=str, default='src', help="Path to the folder containing images.")
parser.add_argument("--min_area", type=int, default=5000, help="Minimum area of contours to be considered.")
args = parser.parse_args()
参数作用如下:
–folder_path:指定要处理的图片文件夹路径
–min_area:设置轮廓的最小面积,低于该面积的轮廓将被忽略
2. 距离估计
该函数接收物体在图像中的像素高度、物体的实际高度以及相机的焦距,最终返回相机到物体的距离
def compute_zc_real_height(pixel_height, real_height, fy):
zc = (real_height * fy) / pixel_height
return zc
3. 颜色转换
该函数用于将图像中计算出的颜色均值,转换为对应的英文颜色名称,并计算颜色均值与预定义颜色的距离,将其归类为最接近的颜色类别
def color_to_chinese_name(mean_val):
color_names = {
(10, 30, 90): "red",
(21, 62, 21): "green",
(75, 60, 12): "blue",
(5, 81, 121): "yellow",
}
mean_val = tuple(map(int, mean_val[:3]))
closest_color = min(color_names.keys(), key=lambda c: np.linalg.norm(np.array(c) - np.array(mean_val)))
return color_names[closest_color]
4. 图像处理函数
该函数作用是处理图像,检测三角形,并计算其颜色和距离
4.1 读取图像和预处理
img = cv2.imread(image_path)
if img is None:
print(f"无法读取图像: {image_path}")
return
# 转换图像为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用阈值过滤掉无用的信息
ret, thresh = cv2.threshold(gray, 100, 255, 0)
这一部分代码的作用是读取输入图像并进行预处理:
- cv2.imread(image_path):读取图像文件。如果图像无法读取,返回 None 并打印错误信息
- cv2.cvtColor(img, cv2.COLOR_BGR2GRAY):将读取的彩色图像转换为灰度图,以便于后续处理
- cv2.threshold(gray, 100, 255, 0):应用阈值操作,将图像二值化,使得图像中的前景(可能是形状)与背景分离。这一步能够简化轮廓检测
4.2 轮廓检测
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(f"检测到的轮廓数量: {len(contours)}")
这一部分代码检测图像中的轮廓:
- cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE):查找二值化图像中的轮廓。RETR_TREE 模式会检测所有轮廓并建立层次结构,CHAIN_APPROX_SIMPLE 方法会压缩水平、垂直和对角线方向的轮廓段,从而节省内存
4.3 过滤面积并检测三角形
for cnt in contours:
area = cv2.contourArea(cnt)
if area < min_area:
continue
# 多边形逼近轮廓
approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True)
这部分代码将遍历所有轮廓,过滤掉面积小于 min_area 的轮廓,并对剩余轮廓进行多边形近似处理。
- cv2.contourArea(cnt):计算轮廓的面积
- approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True):将轮廓 cnt 近似为一个精度为其周长1%的多边形
4.4 提取边框并计算距离
x, y, w, h = cv2.boundingRect(cnt)
# 使用颜色值为绘图设置颜色
color = (int(mean_val[0] + 50), int(mean_val[1] + 50), int(mean_val[2]) + 50)
xmin, ymin, xmax, ymax = x, y, x + w, y + h
# 计算距离
dist = compute_zc_real_height(abs(ymax - ymin), 0.147, 920) * 100
这一部分代码用于计算三角形边界框到摄像头的距离
- x, y, w, h = cv2.boundingRect(cnt):计算轮廓的边界框
- color = (int(mean_val[0] + 50), int(mean_val[1] + 50), int(mean_val[2]) + 50):调整颜色值以便于绘制
- compute_zc_real_height:用于计算相机到目标的实际距离
二、效果展示
红色三角形
绿色三角形
蓝色三角形
黄色三角形
三、完整代码获取
通过前面的教程,有一定基础的同学应该能够直接复现出结果,不过如果还有其他问题,可以参考以下链接获取完整代码
链接:使用OpenCV对图像进行三角形检测、颜色识别与距离估算
总结
本期博客就到这里啦,喜欢的小伙伴们可以点点关注,感谢!
最近经常在b站上更新一些有关目标检测的视频,大家感兴趣可以来看看 https://b23.tv/1upjbcG
学习交流群:995760755