opencv-python的简单练习

文章目录

识别信号灯

需要识别交通信号灯的颜色(红、黄、绿)。请设计一个简化的流程,说明如何使用OpenCV来识别交通信号灯的颜色。

思路分析‌:

1.读取包含交通信号灯的图像。

2.转换图像到HSV颜色空间。

3.分别为红、黄、绿三种颜色定义HSV范围,并创建三个掩膜。

4.对每个掩膜进行轮廓检测,识别出可能的信号灯区域。

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

lamp = cv2.imread("deng.png")
lamp_hsv = cv2.cvtColor(lamp, cv2.COLOR_BGR2HSV)

g_min = np.array([35,43,46])
g_max = np.array([77,255,255])
lamp_gmask = cv2.inRange(lamp_hsv, g_min, g_max)
lamp_gmask = cv2.erode(lamp_gmask, None, iterations=1)
lamp_gmask = cv2.dilate(lamp_gmask, None, iterations=10)

y_min = np.array([8,43,46])
y_max = np.array([20,255,255])
lamp_ymask = cv2.inRange(lamp_hsv, y_min, y_max)
lamp_ymask = cv2.erode(lamp_ymask, None, iterations=1)
lamp_ymask = cv2.dilate(lamp_ymask, None, iterations=10)

r_min = np.array([155,0,0])
r_max = np.array([170,255,255])
lamp_rmask = cv2.inRange(lamp_hsv, r_min, r_max)
lamp_rmask = cv2.erode(lamp_rmask, None, iterations=1)
lamp_rmask = cv2.dilate(lamp_rmask, None, iterations=10)

result = cv2.bitwise_and(lamp, lamp, mask=lamp_rmask)

cv2.imshow("result", result)
cv2.waitKey(0)


识别图案并且标记面积和周长

1.将图像转换为灰度图

2.对灰度图进行二值化处理

3.使用形态学变换去除噪声【开运算】

4.检测图像中的边缘

5.查找并绘制图像中的轮廓

6.逐一遍历轮廓,输出所有四边形的周长 和 面积。

python 复制代码
import cv2
# 读取图像
image = cv2.imread('02.png')
# 转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用阈值化方法进行二值化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
# 定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# 开运算
opening = cv2.morphologyEx(binary_image, cv2.MORPH_OPEN, kernel)
# 使用Canny边缘检测
edges = cv2.Canny(opening, 100, 200)
# 查找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)

for contour in contours:
    # 近似轮廓为多边形
    epsilon = 0.02 * cv2.arcLength(contour, True)
    approx = cv2.approxPolyDP(contour, epsilon, True)
    
    # 如果近似的多边形有四个顶点,则认为是四边形
    if len(approx) == 4:
        # 计算周长
        perimeter = cv2.arcLength(contour, True)
        # 计算面积
        area = cv2.contourArea(contour)
        # 在图像上显示周长和面积
        x, y, w, h = cv2.boundingRect(contour)
        cv2.putText(image, f': {perimeter:.2f}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

cv2.imshow('Contours', image)   
cv2.waitKey(0)
相关推荐
Web3_Daisy3 分钟前
从流动性到执行:如何降低 MEV 对 Web3 市场
大数据·人工智能·web3·区块链
日常通勤穿搭8 分钟前
电商 AI 作图用哪个最方便?新手商家 AI 出图工具对比
大数据·人工智能
Csvn8 分钟前
🐍 Day 4: Python 控制流 — 条件、循环与推导式的艺术
后端·python
爱学堂IT分享15 分钟前
DeepSeek+SpringAI实战AI家庭医生应用(10章) 完整版
人工智能
QXWZ_IA19 分钟前
千寻位置支持哪些卫星系统?北斗GPS多星座解析
人工智能·科技·智能硬件·rtk
小淮AI37 分钟前
一个国际家庭在武汉的择校笔记:两份外籍人员子女学校的课程方案比较
大数据·人工智能
deepdata_cn1 小时前
如何从0到1学习AI向量基础
人工智能·向量
H0311169851 小时前
择校参考:枫叶教育 vs 大连美国国际学校,外籍子女学校怎么选
人工智能
刘海东刘海东2 小时前
一条新的人工智能道路(刘海东)一、二、三章
人工智能
xyz_CDragon2 小时前
从 RTL 到 GDSII:人与 AI 协作,用开源 EDA 工具链完成 SHA-256 芯片的 SoC 集成与签核全流程(附完整流程+代码)
人工智能·开源·芯片设计·开源 eda·caravel