用vscode编写python代码,请写出利用opencv实现对单张图片traffic.jpg进行交通灯颜色(红,绿,蓝)的颜色轮廓识别的完整代码,并显示被识别出来的交通灯黑白轮廓的结果图
时间: 2024-11-22 16:36:56 浏览: 36
在VSCode中使用Python和OpenCV进行交通灯颜色识别并显示轮廓,首先需要安装必要的库,如`numpy`, `opencv-python`, 和 `matplotlib`。下面是一个简单的示例代码,它加载图像、分割颜色区域、查找轮廓并绘制结果:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 加载图片
img = cv2.imread('traffic.jpg', cv2.IMREAD_COLOR)
# 将图像转换为HSV色彩空间,方便区分颜色
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 定义红、绿、蓝三种颜色的HSV范围
red_lower = (0, 50, 50)
red_upper = (10, 255, 255)
green_lower = (40, 50, 50)
green_upper = (80, 255, 255)
blue_lower = (110, 50, 50)
blue_upper = (130, 255, 255)
# 对每个颜色分别创建掩码
mask_red = cv2.inRange(hsv, red_lower, red_upper)
mask_green = cv2.inRange(hsv, green_lower, green_upper)
mask_blue = cv2.inRange(hsv, blue_lower, blue_upper)
# 将所有掩码组合在一起,获取颜色区域的位置
combined_mask = mask_red | mask_green | mask_blue
# 找到轮廓
contours, _ = cv2.findContours(combined_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓,对每个可能的交通灯提取边界并画出轮廓
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
# 只保留较大的交通灯,过滤小碎片
if w > 50 and h > 50:
roi = img[y:y+h, x:x+w]
# 将ROI转为灰度并二值化
gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray_roi, 127, 255, cv2.THRESH_BINARY_INV)
# 显示轮廓
cv2.drawContours(img, [contour], -1, (0, 0, 255), 2) # 黑色轮廓
cv2.imshow("Original", img)
cv2.waitKey(0)
# 显示最终结果
plt.figure(figsize=(10,10))
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Color Contours')
plt.subplot(122), plt.imshow(thresh, cmap='gray'), plt.title('Black & White Contours')
plt.show()
```
运行这个代码后,会先显示原始彩色图像以及经过颜色分离后的黑白轮廓图。
阅读全文