La cámara Raspberry Pi CSI usa python para llamar a la función de biblioteca opencv para detección y reconocimiento de movimiento

Tabla de contenido

1. Completa la llamada de la cámara.

2. Use python para llamar a la función de biblioteca opencv para procesar la imagen

2.1 Flujo general de procesamiento de imágenes

2.2 Parámetros y significados de la función de llamada opencv

2.2.1 ret, img = cap.read() leer imagen de cuadro

2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) imagen en escala de grises

2.2.3 gray_diff_img = cv2.absdiff(gray_img, anterior_img) 帧差法

2.2.4 Procesamiento de binarización de cv2.threshold (src, thresh, maxval, type)

2.2.5 cv2.medianBlur(src, ksize) filtro mediano

2.2.6 np.ones(forma, dtype=Ninguno, order='C')

2.2.7 cv2.morphologyEx(src, op, kernel) 

2.2.8 cv2.findContours(imagen,modo,método)

2.2.9 cv2.contourArea() Calcular el área del contorno

2.2.10 cv2.boundingRect() devuelve las coordenadas del marco del contorno

2.2.11 cv2.rectangle() Conexión de coordenadas, contorno del marco

2.2.12 imagen de visualización de la ventana cv2.imshow()

3. Código de procesamiento


1. Completa la llamada de la cámara.

Si no sabes cómo hacerlo, consulta

Raspberry Pi llama a la cámara CSI para monitoreo en tiempo real

2. Use python para llamar a la función de biblioteca opencv para procesar la imagen

2.1 Flujo general de procesamiento de imágenes

(1) Encienda el dispositivo de la cámara

(2) La imagen se procesa por fotogramas (procesamiento fotograma a fotograma), y en el ciclo while, se lee primero un fotograma de la imagen de la cámara.

(3) Procesamiento de imágenes en escala de grises, juzgando si la imagen del cuadro anterior está vacía. Si está vacío, asigne un marco de imagen y realice el procesamiento de la imagen en escala de grises; si no está vacío, realice también el procesamiento de la imagen en escala de grises.

(4) Método de diferencia de cuadro, utilizando la imagen de cuadro anterior y esta imagen de cuadro para el procesamiento de diferencia.

(5) Procesamiento de imagen de binarización, que realiza el procesamiento de binarización en la imagen después del método de diferencia de fotogramas.

(6) Procesamiento de filtro de mediana

(7) Operación cerrada, erosión, proceso de expansión.

(8) Realice la detección de contornos en la imagen en movimiento y devuelva el conjunto de coordenadas

(9) Utilice las coordenadas para enmarcar el objetivo.

(10) Muestre la imagen y cambie la imagen procesada a la imagen del cuadro anterior.

2.2 Parámetros y significados de la función de llamada opencv

2.2.1 ret, img = cap.read() leer imagen de cuadro

cap son los datos de imagen de la cámara capturados por su dispositivo de cámara 0 (p. ej.: cap = cv2.VideoCapture(0) );

read() es la función de la biblioteca opencv para leer un cuadro de imagen de la cámara, y cap.read() es para obtener un cuadro de imagen leído por el dispositivo de cámara 0;

img es un marco de imagen leído por el dispositivo de cámara 0 y el formato de imagen es BGR;

ret es de tipo bool, devuelve True si la lectura es exitosa y False si falla.

2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) imagen en escala de grises

img: La imagen a convertir.

cv2.COLOR_BGR2GRAY: Convierte una imagen en formato BGR a una imagen en escala de grises.

gris = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gris es la imagen en escala de grises convertida

2.2.3 gray_diff_img = cv2.absdiff(gray_img, anterior_img) 帧差法

cv2.absdiff(a,b) : a y b son ambos un marco de imagen.

Compare la diferencia entre los dos cuadros de imágenes (por ejemplo: durante la detección de movimiento, solo se moverá el objeto en movimiento, pero el fondo no se moverá, cv2.absdiff(a,b) obtendrá la imagen del objeto en movimiento con el fondo eliminado ) . gray_diff_img es un cuadro de imagen después de dos cuadros de procesamiento.

2.2.4  Procesamiento de binarización de cv2.threshold (src, thresh, maxval, type)

src: Un marco de imagen pasado.

umbral: umbral (rango de valores 0-255, seleccionado según la intensidad de la luz)

maxval: color de relleno (rango de valores 0-255, generalmente elija 255 para imágenes binarizadas)

tipo: como se muestra a continuación

 umbral_img = cv2.umbral(gray_diff_img, 40, 255, cv2.UMBRAL_BINARIO)

La imagen binarizada resultante thresh_img

2.2.5 cv2.medianBlur(src, ksize) filtro mediano

src es la imagen a procesar.

ksize es el tamaño del núcleo del filtro. El tamaño del núcleo del filtro se refiere a la altura y el ancho de su imagen vecina durante el proceso de filtrado. Cabe señalar que el tamaño del núcleo debe ser un número impar mayor que 1, como 3, 5, 7, etc. 
Ejemplo: mask_img = cv2.medianBlur(thresh_img, 3) 

2.2.6 np.ones(forma, dtype=Ninguno, order='C')

forma: es un int o una tupla de ints que define el tamaño de la matriz.

dtype: es un parámetro opcional, el valor predeterminado es float. Se utiliza para especificar el tipo de datos de la matriz, como int.

orden: El orden define si almacenar arreglos multidimensionales en la memoria en orden de fila principal (estilo C) o de columna principal (estilo Fortran). No necesitamos escribir, solo por defecto.

Ejemplo: k = np.unos((3, 3), np.uint8) 

Una matriz pequeña de (1,1) con un tamaño de 1 es una unidad para formar una matriz grande con 3 filas y 3 columnas, y el tipo es uint8. (No sé exactamente por qué se usa, supongo que probablemente significa el tamaño de la imagen)

2.2.7 cv2.morphologyEx(src, op, kernel) 

src: es la imagen que necesita ser procesada.

Op:

cv2.MORPH_OPEN: operación de apertura, corroe y luego expande la imagen, lo que equivale a dilatar(erosionar(src,kernal)), la operación de apertura suaviza los límites de la imagen, elimina protuberancias, etc. cv2.MORPH_CLOSE: operación de cierre, primero ejecuta la
imagen Realiza expansión y corrosión, que es equivalente a erosionar (dilatar (src, kernel)), y la operación de cierre se usa para llenar pequeños agujeros dentro de la imagen, llenar la depresión de la imagen, etc.

kernel: ingrese una matriz como el kernel, que representa el tamaño de la imagen. (Yo tampoco entiendo mucho)

cerrar = cv2.morphologyEx(mask_img, cv2.MORPH_CLOSE, k)

2.2.8 cv2.findContours( imagen , modo , método )

image  : Representa la imagen de entrada. Tenga en cuenta que la imagen de entrada debe ser una imagen binaria. Si la imagen de entrada es una imagen en color, primero se debe escalar en gris y binarizar.

mode  :  Indica el modo de recuperación del contorno, hay 4 tipos:

cv2.RETR_EXTERNAL significa que solo detecta el contorno exterior.

Los contornos detectados por cv2.RETR_LIST no establecen una relación jerárquica.

 cv2.RETR_CCOMP establece dos niveles de contornos, la capa superior es el límite exterior y la capa interior es la información del límite del agujero interior. Si hay otro objeto conectado en el agujero interior, el límite de este objeto también está en la capa superior.

cv2.RETR_TREE construye el esquema de una estructura de árbol jerárquica.

método método de aproximación para el contorno, hay 4 tipos:
cv2.CHAIN_APPROX_NONE almacena todos los puntos de contorno, y la diferencia de posición de píxel entre dos puntos adyacentes no supera 1, a saber, max(abs(x1-x2), abs(y2- y1 ))<=1.
cv2.CHAIN_APPROX_SIMPLE comprime elementos en dirección horizontal, dirección vertical y dirección diagonal, y solo conserva las coordenadas finales de la dirección. Por ejemplo, un contorno rectangular solo necesita 4 puntos para guardar la información del contorno.
 cv2.CHAIN_APPROX_TC89_L1 y cv2.CHAIN_APPROX_TC89_KCOS utilizan el algoritmo de aproximación de cadena de Chinl.

Función return value contours : Devuelve varios contornos (devuelve varios fotogramas de objetos en movimiento), y la unidad de cada contorno es un conjunto de puntos (es decir, el tamaño del contorno)

Ejemplo: cnts = cv2.findContours(close_img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

2.2.9 cv2.contourArea() Calcular el área del contorno

2.2.10 cv2.boundingRect() devuelve las coordenadas del marco del contorno

x, y, w, h = cv2.boundingRect(c) , x, y, w, h son las coordenadas de longitud del contorno, c es un subconjunto de contornos

2.2.11 cv2.rectangle() Conexión de coordenadas, contorno del marco

cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) 

Imagen, coordenadas de la esquina superior izquierda del rectángulo, coordenadas de la esquina inferior derecha del rectángulo, color de fuente, peso de fuente

2.2.12 imagen de visualización de la ventana cv2.imshow()

 cv2.imshow("nombre", img) "nombre" es el nombre de la ventana e img es la imagen de visualización de la ventana.

3. Código de procesamiento

import cv2
import time
import numpy as np

def videos():
    cap = cv2.VideoCapture(0)
    cap.set(3, 640)
    cap.set(4, 480)
    cap.set(5,40)
    
    img_num = 0
    k = np.ones((3, 3), np.uint8)  

    while True:
        ret, img = cap.read()

        if not img_num:
            previous = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray_diff = cv2.absdiff(gray, previous)  
        thresh = cv2.threshold(gray_diff, 40, 255, cv2.THRESH_BINARY)[1] 
        mask = cv2.medianBlur(thresh, 3) 
        close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k) 

        cnts = cv2.findContours(close,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0] 
        for c in cnts:   
            area = cv2.contourArea(c)
            if area > 200:
                x, y, w, h = cv2.boundingRect(c)
                cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

        cv2.imshow("thresh_img", close)
        cv2.imshow("Result", img)
        img_num += 1

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

videos()

La esquina superior izquierda está un poco blanca debido a la luz solar.

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_51679917/article/details/130440779
Recomendado
Clasificación