La idea basica
La detección de paso de cebra utiliza el procesamiento de imágenes opencv para realizar la conversión del valor gris, la eliminación de ruido del filtro gaussiano, el procesamiento de umbrales, la corrosión y la expansión para realizar la detección de contornos en la imagen, al juzgar la posición del vehículo y el peatón, y la información de distancia entre ellos, cuando se alcanza la velocidad del automóvil. Cuando excede un cierto umbral y está cerca del peatón, el vehículo será juzgado como un peatón descortés.
Resultado de ejemplo
proceso de experimento
Primero, tome una foto del video para probar y, si el resultado es satisfactorio, anímela en el video para lograr el efecto deseado.
1. Preprocesamiento (conversión de valor de gris, eliminación de ruido del filtro gaussiano, procesamiento de umbral, corrosión y expansión)> modifique algunos valores según sus necesidades
# Conversión de valor gris imgGray = cv2.cvtColor (copy_img, cv2.COLOR_BGR2GRAY) # Eliminación de ruido del filtro gaussiano imgBlur = cv2.GaussianBlur (imgGray, (5,5), 0) # Procesamiento de umbral ret, thresh = cv2.threshold (imgBlur , 127,255, cv2.THRESH_BINARY) # corrosión imgEro = cv2.erode (Thresh, kernel1, Iterations = 2) # expansion imgDia = cv2.dilate (imgEro, kernel2, iterations = 4)
Después del preprocesamiento (como se muestra en la figura siguiente):
2. Detección de contornos
# 轮廓 检测 _, contouts, hie = cv2.findContours (imgDia, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) cnt = contouts cv2.drawContours (copy_img, cnt, -1, (0, 255, 0), 2)
Esquema completo (como se muestra a continuación)
Se puede ver que esto no es lo que queremos, por lo que debemos juzgar la ubicación y seleccionar el área que nos interesa.
3. Región de interés
Cambie el valor de la información de posición de x, y, w, h según sus propias necesidades de imagen o video.
para i en cnt: # Asignación de coordenadas x, y, w, h = cv2.boundingRect (i) #roi juicio de posición si y> 350 e y <450 y x <1200 y w> 50 y h> 10: # Dibujar Contour cv2.drawContours (copy_img, i, -1, (0, 255, 0), 2)
El resultado completo después de obtener el roi (como se muestra en la figura siguiente)
4. Código completo
import cv2 import numpy as np # defina dos núcleos (kernel_Ero se usa para la corrosión, kernel_Dia se usa para la expansión) kernel_Ero = np.ones ((3,1), np.uint8) kernel_Dia = np.ones ((3,5), np.uint8) img = cv2.imread ("../ images / bmx.png") copy_img = img.copy () # Imagen original copia modificar tamaño copy_img = cv2.resize (copy_img, (1600,800)) # 灰Conversión de valor de grado imgGray = cv2.cvtColor (copy_img, cv2.COLOR_BGR2GRAY) # Eliminación de ruido del filtro gaussiano imgBlur = cv2.GaussianBlur (imgGray, (5,5), 0) # Procesamiento de umbral ret, thresh = cv2.threshold (imgBlur, 127,255) , cv2.THRESH_BINARY) # corrosión imgEro = cv2.erode (Thresh, kernel_Ero, Iterations = 2) # expansión imgDia = cv2.dilate (imgEro, kernel_Dia, Iterations =. 4) # detección de contorno _, contouts, hie = cv2.findContours (imgDia, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) cnt = contouts para i en cnt: # 坐标 赋值 x, y, w, h = cv2.boundingRect (i) #roi 位置 判断 if y> 350 e y <450 y x <1200 y w> 50 y h> 10: # 画出 轮廓 cv2.drawContours (copy_img, i, -1, (0, 255, 0), 2) cv2.imshow (" img ", copy_img) cv2.waitKey (0) cv2.destroyAllWindows ()
para resumir
En los requisitos comerciales, el resultado de este proceso no es factible, es solo enmarcar lo que desea, pero si desea juzgar si el vehículo es cortés con los peatones en la escena del tráfico, debe juzgar las coordenadas. Dibuje un marco rectangular grande (área de roi) desde las coordenadas del primer paso de cebra hasta las coordenadas del último paso de cebra (horizontal), y luego actúe sobre las coordenadas del vehículo de motor (coordenadas existentes) de acuerdo con las coordenadas del marco rectangular Juez, para atender la demanda.
¡Al final! ! !
¡Primer contacto con opencv! ¡Así que por favor no me rocíen, los grandes del campo visual! (/ 狗头) La
cantidad de código es muy pequeña, no hay capacidad de generalización, un enfoque muy bajo. . . ¡Pero para mí, aprender opencv sigue siendo muy útil! ¡Eso es! Ollie dalo!
Obtén el código completo del proyecto⬅ Obténgalo aquí