with real raspberry optimize learning and python opencv raspberry-pi object-detection

python - real - raspberry pi opencv



Detectando una lata o botella en opencv (1)

¡Se me ocurrió un enfoque que puede ayudar! Si sabes más cosas sobre la lata, es decir, la relación ancho / alto, ¡puede ser más robusta ajustando el tamaño del rectángulo!

Enfoque

  • Convierte la imagen al espacio de color HSV . Aumenta V en un factor de 2 para tener más cosas visibles.
  • Encuentra derivados de Sobel en la dirección y . Calcule la magnitud con el mismo peso para ambas direcciones.
  • Umbral su imagen usando el método Otsu .
  • Aplicar Closing a tu imagen.
  • Aplicar el detector de bordes Canny .
  • Encuentra Hough Line Transform .
  • Encuentra el rectángulo delimitador de tu imagen de línea.
  • Superponlo a tu imagen. (Finalmente hecho: P)

Código

image = cv2.imread(''image3.jpg'', cv2.IMREAD_COLOR) original = np.copy(image) if image is None: print ''Can not read/find the image.'' exit(-1) hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) H,S,V = hsv_image[:,:,0], hsv_image[:,:,1], hsv_image[:,:,2] V = V * 2 hsv_image = cv2.merge([H,S,V]) image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2RGB) image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) # plt.figure(), plt.imshow(image) Dx = cv2.Sobel(image,cv2.CV_8UC1,1,0) Dy = cv2.Sobel(image,cv2.CV_8UC1,0,1) M = cv2.addWeighted(Dx, 1, Dy,1,0) # plt.subplot(1,3,1), plt.imshow(Dx, ''gray''), plt.title(''Dx'') # plt.subplot(1,3,2), plt.imshow(Dy, ''gray''), plt.title(''Dy'') # plt.subplot(1,3,3), plt.imshow(M, ''gray''), plt.title(''Magnitude'') ret, binary = cv2.threshold(M,10,255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # plt.figure(), plt.imshow(binary, ''gray'') binary = binary.astype(np.uint8) binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (20, 20))) edges = cv2.Canny(binary, 50, 100) # plt.figure(), plt.imshow(edges, ''gray'') lines = cv2.HoughLinesP(edges,1,3.14/180,50,20,10)[0] output = np.zeros_like(M, dtype=np.uint8) for line in lines: cv2.line(output,(line[0],line[1]), (line[2], line[3]), (100,200,50), thickness=2) # plt.figure(), plt.imshow(output, ''gray'') points = np.array([np.transpose(np.where(output != 0))], dtype=np.float32) rect = cv2.boundingRect(points) cv2.rectangle(original,(rect[1],rect[0]), (rect[1]+rect[3], rect[0]+rect[2]),(255,255,255),thickness=2) original = cv2.cvtColor(original,cv2.COLOR_BGR2RGB) plt.figure(), plt.imshow(original,''gray'') plt.show()

NOTA: ¡puede descomentar las líneas para mostrar el resultado de cada paso! Solo los comento por la legibilidad.

Resultado

NOTA: ¡Si conoce la relación de aspecto de su lata, puede arreglarla mejor!

Espero que le ayudará. Buena suerte :)

Soy nuevo en OpenCV y tengo algunas preguntas. Necesito detectar una botella o una lata en función de su forma. Para esto estoy usando un tablero de pi frambuesa y una cámara pi. El fondo es siempre negro y no cambia. He intentado muchas soluciones posibles a este problema pero no pude obtener resultados satisfactorios. Las cosas que he intentado incluyen detección de bordes, transformaciones morfológicas, matchShapes (), matchTemplate (). Por favor, avíseme si puedo hacer esta tarea de manera eficiente y con la máxima precisión.

Una imagen de muestra: