前言

本文将介绍一个基于OpenCV的课题项目,该项目的实现过程包括图像的读取与预处理、轮廓检测、形状识别、颜色分析以及距离计算。所涉及的技术和方法可以广泛应用于机器人视觉系统、自动化检测设备以及其他需要图像识别与处理的场景


功能概述

1. 三角形检测:从图像中检测出三角形
2. 颜色识别:分析每个三角形的颜色并转换为相应的英文名称
3. 距离估算:基于图像中三角形的像素高度,估算其实际距离


必要环境

安装OpenCV和NumPy库

  1. 安装opencv:
    pip install opencv-python==4.4.0.42 -i https://pypi.tuna.tsinghua.edu.cn/simple
    
  2. 安装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对图像进行三角形检测、颜色识别与距离估算【附代码】-LMLPHP

绿色三角形

使用OpenCV对图像进行三角形检测、颜色识别与距离估算【附代码】-LMLPHP

蓝色三角形

使用OpenCV对图像进行三角形检测、颜色识别与距离估算【附代码】-LMLPHP

黄色三角形

使用OpenCV对图像进行三角形检测、颜色识别与距离估算【附代码】-LMLPHP

三、完整代码获取

通过前面的教程,有一定基础的同学应该能够直接复现出结果,不过如果还有其他问题,可以参考以下链接获取完整代码
链接:使用OpenCV对图像进行三角形检测、颜色识别与距离估算


总结

本期博客就到这里啦,喜欢的小伙伴们可以点点关注,感谢!

最近经常在b站上更新一些有关目标检测的视频,大家感兴趣可以来看看 https://b23.tv/1upjbcG

学习交流群:995760755

07-05 21:14