Reconocimiento visual de líneas de automóviles basado en Python OpenCV y utilizando la transformada de Hough

        Recientemente, estoy trabajando en un proyecto de seguimiento visual de automóviles. El automóvil conducirá a lo largo de una línea y usará su cámara integrada para tomar fotografías de la carretera frente a la carretera. Durante el proceso de conducción, encontrará elementos especiales como esquinas obtusas, esquinas en arco y esquinas en ángulo recto. El automóvil debe realizar un giro razonable después de identificar los elementos.

        La mayoría de los métodos de seguimiento de línea que se ven en Internet son principalmente para atravesar todos los píxeles de la imagen después de la binarización y luego encontrar el valor promedio de la abscisa de los píxeles blancos brillantes y calcular la compensación del automóvil al hacer una diferencia entre el valor promedio y el valor central de la cantidad de imagen, y luego controlar el movimiento del automóvil. Tal método necesita usar un bucle for doble para recorrer todos los píxeles de la imagen capturada, lo cual es ineficiente. Después de recibir instrucciones de uno de mis superiores, decidí utilizar el método de transformación de Hough para el reconocimiento de líneas.

                                                                                                                   (La foto viene de Internet, invadida y borrada)

Ideas:

1. Primero, seleccione el área de reconocimiento correcta. Un área en frente del automóvil es donde el automóvil está a punto de llegar, y la mayoría de las otras áreas no tienen efecto sobre el reconocimiento. Por lo tanto, debemos seleccionar el área apropiada para el ROI para mejorar la eficiencia del reconocimiento.

2. Posteriormente, la imagen se procesa inicialmente. Aquí, primero convierto el resaltado en una imagen en escala de grises, luego realizo la binarización mediante el método Otsu y finalmente uso el filtrado gaussiano. La binarización del método Otsu puede determinar el umbral de acuerdo con la distribución de brillo específica de la imagen y puede separar bien las líneas blancas que deben identificarse y eliminar los elementos que interfieren; el filtrado gaussiano puede suavizar la imagen, haciendo que la siguiente transformada de Hough más exacto preciso

3. El siguiente paso es la transformada de Hough. Primero realice la detección de bordes Canny en la imagen obtenida en el paso anterior y luego use la función de transformación de Hough para leer los segmentos de línea en la imagen. Tenga en cuenta que aquí se usa la transformada de Hough de probabilidad; de lo contrario, los resultados son líneas rectas en lugar de segmentos de línea, y no se puede obtener el valor de desviación. Después de eso, obtendremos las coordenadas horizontales y verticales de los puntos inicial y final de todos los segmentos de línea.

4. Después de leer estas coordenadas, necesitamos dos cantidades: el desplazamiento promedio del segmento de línea y el número de segmentos de línea cuya pendiente es cercana a 0. El primero se usa para detectar la desviación del automóvil, de lo contrario, se usa para detectar si hay una curva en ángulo recto. Podemos usar el bucle for para recorrer las coordenadas de los dos puntos al principio y al final de todos los segmentos de línea, dividir el valor acumulado de la abscisa por el número total de puntos calculados y luego restar la abscisa del centro de la imagen. para obtener el desplazamiento promedio.Utilice la fórmula de cálculo de la pendiente [(y1-y2)/(x1-x2)] para detectar si el segmento de línea es horizontal o está cerca del nivel, y cuente el número de dichos segmentos de línea.

5. Haga un juicio final: si el número de segmentos de línea horizontal es mayor que 0, significa que el automóvil ha encontrado una curva en ángulo recto, de lo contrario, el automóvil debe girar en una esquina de acuerdo con el desplazamiento

 Adjunto aquí hay un fragmento de código para detectar un marco de imagen.

import cv2
import numpy as np
import matplotlib.pyplot as plt
import pylab

def midsearch():
    img = cv2.imread("pic", -1)                                                   #导入图片,参数请自行修改
    h,w,c= img.shape

    mid=img[int(h*0.7):int(h),int(0.25*w):int(0.75*w)]                            #ROI选区,选择图像前面的一块区域
    hm, wm, cm = mid.shape  
    gray = cv2.cvtColor(mid, cv2.COLOR_BGR2GRAY)                                  #设置图像为灰度图
    ret, gray = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)  #大津法二值化
    gray = cv2.medianBlur(gray, 11)                                                #高斯滤波
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    orgb = cv2.cvtColor(mid, cv2.COLOR_BGR2RGB)
    oShow = orgb.copy()
    lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 1, minLineLength=100, maxLineGap=60)#边缘检测之后霍夫变换得出直线
    fn=0
    n=0
    tan=1.0
    T=0.0
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(orgb, (x1, y1), (x2, y2), (255, 0, 0), 5)
        n+=2;
        fn+=x1
        fn+=x2
        if x1!=x2:
            tan=(y1-y2)/(x1-x2)
            if abs(tan)<0.1 and abs(x1-x2)>0.1*wm:
                    T+=1
        else:
            tan=1                                       #通过检测直线斜率检测是否遇到直角
    average=fn/n
    delta=average-wm/2
    # print(T)
    # print(delta)
    # print(average)
    # plt.subplot(121)
    # plt.imshow(oShow)
    # plt.axis('off')
    # plt.subplot(122)
    # plt.imshow(orgb)
    # plt.axis('off')
    # pylab.show()
    return delta,T

def midjudge(delta,T):
    #直角判断
    if delta>0 and T>=1:#右直角
        print("右直角")
    elif delta<0 and T>=1:#左直角
        print("左直角")
    else:
    #正常行驶,包括钝角以及圆弧的转弯
        if abs(delta)<=10:
            print("直行")
        elif delta>10:
            print("右转弯")
        elif delta<-10:
            print("左转弯")


delta,T=midsearch()
midjudge(delta,T)
cv2.waitKey(0)
cv2.destroyAllWindows()

Supongo que te gusta

Origin blog.csdn.net/m0_73232812/article/details/130117113
Recomendado
Clasificación