计算机视觉OpenCV红绿灯检测

红绿灯检测

本设计中红绿灯检测程序主要有detectColor.py文件和TLState.py两个文件。

在detectColor.py文件中主要是检测被TLState.py分割出来的灯的颜色,首先利用OpenCV中的cv2.cvtColor(image,cv2.COLOR_ BGR2HSV)函数,将图片从BGR格式转换为HSV格式。之后利用cv2.inRange()函数设阈值去除背景部分,再进行中值滤波,最后计算非零像素点数,取其像素点最多的那个对应的结果作为最终结果。

在TLState.py文件中,进行灰度处理,之后利用cv2.HoughCircles()函数进行霍夫圆环检测。将检测到的圆环送入detectColor.py文件中的detectColor()函数中进行颜色检测。

补充知识点
1、cv2.cvtColor函数将图片从BGR格式转换为HSV格式
具体用法
hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)

RGB颜色空间以R(Red:红)、G(Green:绿色)、 B(Blue:蓝)

HSV颜色空间,用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;

2、**cv2.inRange()**函数设阈值,去除背景部分

本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分

用法
mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,

lower_red = np.array([20, 20, 20])
upper_red = np.array([200, 200, 200])
mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,lower~upper==>255

第一个参数:hsv指的是原图

第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0

第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0

而在lower_red~upper_red之间的值变成255
就是将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255
计算机视觉OpenCV红绿灯检测_第1张图片

3、中值滤波

中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点

4、 OpenCV霍夫圆变换HoughCircles()

用法

cv2.HoughCircles(image,method,dp,minDist[, circles[,param1, param2[,minRadius[,maxRadius]]]]])

参数
image 不用多说,输入矩阵
method cv2.HOUGH_GRADIENT 也就是霍夫圆检测,梯度法
dp 计数器的分辨率图像像素分辨率与参数空间分辨率的比值(官方文档上写的是图像分辨率与累加器分辨率的比值,它把参数空间认为是一个累加器,毕竟里面存储的都是经过的像素点的数量),dp=1,则参数空间与图像像素空间(分辨率)一样大,dp=2,参数空间的分辨率只有像素空间的一半大
minDist 圆心之间最小距离,如果距离太小,会产生很多相交的圆,如果距离太大,则会漏掉正确的圆
param1 canny检测的双阈值中的高阈值,低阈值是它的一半
param2 最小投票数(基于圆心的投票数)
minRadius 需要检测院的最小半径
maxRadius 需要检测院的最大半径

例子
encoding:utf-8
import cv2
import numpy as np
from collections import Counter

检测棋子的颜色
def detect_weiqi(img):
txt = ‘black’
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, threshold = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
c = Counter(list(threshold.flatten()))
print(c.most_common())
if c.most_common()[0][0] != 0:
txt = ‘white’
return txt, threshold

img = cv2.imread(’…/data/weiqi.png’)
img = cv2.medianBlur(img, 5)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.imshow(‘gray’, gray)

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=100, param2=30, minRadius=10, maxRadius=50)

if circles is None:
exit(-1)

circles = np.uint16(np.around(circles))
print(circles)

cv2.waitKey(0)
font = cv2.FONT_HERSHEY_SIMPLEX
for i in circles[0, :]:
cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)
cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3)
x, y, r = i
crop_img = img[y - r: y + r, x - r: x + r]
# 检测围棋
txt, threshold = detect_weiqi(crop_img)
print(‘颜色’, ‘黑色’ if txt == ‘black’ else ‘白色’)

cv2.putText(threshold, text=txt, org=(0, 0), fontFace=font, fontScale=0.5, color=(0, 255, 0), thickness=2)
cv2.imshow('threshold', threshold)

cv2.imshow('crop_img', crop_img)
cv2.moveWindow('crop_img', x=0, y=img.shape[0])

cv2.imshow('detected chess', img)
cv2.moveWindow('detected chess', y=0, x=img.shape[1])

cv2.waitKey(1500)

cv2.waitKey(0)
cv2.destroyAllWindows()

计算机视觉OpenCV红绿灯检测_第2张图片

红绿灯识别
链接 https://pan.baidu.com/s/1DbYJii-jnUOTY49prFn-vg
提取码 xg9h

你可能感兴趣的:(计算机视觉)