English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python+Explicación detallada de la detección de rostros de OpenCV y ejemplos

Acerca de OpenCV

OpenCV es una biblioteca de visión por computadora de código abierto de Intel (Versión de Computadora). Está compuesto por una serie de funciones C y un número pequeño de funciones C++ clases que implementan muchos algoritmos comunes en el procesamiento de imágenes y visión por computadora.

OpenCV tiene, incluyendo 300 funciones C de API de nivel medio y alto, plataformas múltiples. No depende de otras bibliotecas externas, aunque también se pueden usar ciertas bibliotecas externas. OpenCV es gratuito para aplicaciones no comerciales y comerciales. Además, OpenCV proporciona acceso a hardware, que puede acceder directamente a la cámara, y OpenCV también proporciona un sistema GUI (graphical user interface) simple: highgui. Construimos esta detección de rostros a través de algunos métodos proporcionados por OpenCVdetección de rostros.

empaquetado de Python para OpenCV 

OpenCV en sí mismo tiene C/C++ Escrito, si se desea usar en otros lenguajes, podemos empacar sus archivos de bibliotecas dinámicas, afortunadamente, en Python hay muchos de tales empacados, este artículo utiliza Cvtypes.

De hecho, muchos paquetes en Python vienen de terceros, como PIL (Python Image Library), que es un paquete de procesamiento de gráficos implementado en C, empacado en Python, estos paquetes te permiten usar estos API de la misma manera que los funciones integradas de Python.

Principio de detección de rostros

La detección de rostros pertenece a una parte de la detección de objetivos (object detection), y principalmente involucra dos aspectos

1.Realizar primero una estadística de probabilidad del objetivo a detectar, para conocer algunas características del objetivo a detectar y establecer el modelo de detección de objetivos.
2.Coincide el modelo obtenido con la imagen de entrada, si hay coincidencia, se salida la región coincidente, de lo contrario, no se hace nada. 

Visión por computadora

El sistema de visión por computadora es muy diferente del ojo humano, aunque también tiene algunos puntos en común. El ojo humano puede ver objetos mediante la estimulación de las células fotoeléctricas del ojo por la luz reflejada en los objetos, y luego la formación de la imagen del objeto en el cerebro por el nervio óptico. Lo que la computadora ve a través de la cámara es mucho más simple, en términos simples, es una serie de matrices compuestas por números. Estos números indican la intensidad de la luz emitida por los objetos, y los elementos fotoeléctricos de la cámara convierten las señales de luz en señales digitales, cuantificándolas en matrices.

Cómo llegar a la conclusión: "Esto es una cara" de estos números, es una cosa bastante compleja. El mundo físico es colorido, generalmente, las imágenes en color en la computadora están compuestas por varios canales de color, como las imágenes en modo RGB, que tienen canales rojos (Red), verdes (Green) y azules (Blue), estos tres canales son imágenes en escala de grises, por ejemplo, un punto por}}8bits para representar, entonces un canal puede representar2^8=256gris. Al叠加这三个通道, se puede representar3*8=24de color, es decir, lo que llamamos24de color verdadero

El tratamiento de tales imágenes es sin duda una cosa muy compleja, por lo que es necesario convertir primero la imagen a color en escala de grises, lo que puede reducir la cantidad de datos (por ejemplo, en el modo RGB, se puede reducir a la mitad de la imagen original)1/3), al mismo tiempo, se pueden eliminar algunos señales de ruido. Primero, convierta la imagen en escala de grises, luego aumente el contraste de esta imagen de escala de grises, lo que permite que las partes oscuras de la imagen sean más oscuras y las partes brillantes sean más brillantes. Después de este tratamiento, la imagen es más fácil de ser reconocida por el algoritmo.

Tabla de características Haar

OpenCV utiliza la tabla de características Haar en la detección de objetos, que contiene clasificadores boost. Primero, la gente utiliza características Haar de la muestra para entrenar el clasificador, obteniendo un clasificador boost en cadena. El método de entrenamiento incluye dos aspectos:

1. Ejemplo positivo, es decir, la muestra de objetivo a detectar
2. Ejemplo de muestra, cualquier imagen aleatoria

Primero, unifique estas imágenes en el mismo tamaño, este proceso se llama normalización, luego realice el cálculo. Una vez completado el clasificador, se puede usar para detectar la región de interés en la imagen de entrada, generalmente, la imagen de entrada es mayor que el ejemplo, por lo que es necesario mover la ventana de búsqueda para recuperar diferentes tamaños de objetivos. El clasificador puede cambiar su tamaño en proporción para lograr esto, lo que puede requerir varias escaneos de la imagen de entrada.

¿Qué es el clasificador en cadena? El clasificador en cadena es un clasificador grande formado por la concatenación de varios clasificadores simples, y la ventana detectada pasa sucesivamente a través de cada clasificador. Si una ventana pasa a través de todos los clasificadores, se puede determinar que es una región de objetivo. Además, para considerar el problema de eficiencia, se puede colocar el clasificador más estricto en la parte superior de toda la cadena de clasificadores, lo que puede reducir el número de coincidencias.

El clasificador básico utiliza características Haar como entrada, con 0/1Para la salida, 0 representa que no hay coincidencia,1representan la coincidencia.

características Haar

 

 características de borde, que contienen cuatro tipos
 características lineales, que contienen8especie
 El centro se centra en las características, que contiene dos tipos

Al escanear la imagen a detectar, tomemos como ejemplo la característica de borde (a) mencionada anteriormente, como se mencionó anteriormente, la imagen en la computadora es una matriz de números, el programa primero calcula el valor de grises x de toda la ventana, luego calcula el valor de grises negro y dentro del cuadro rectangular, luego calcula(x}}-2El valor de y), comparar este valor con x, si esta proporción está en un rango determinado, entonces significa que la región de escaneo actual de la imagen a detectar coincide con las características de borde (a), luego continuar el escaneo.

Una descripción más detallada de este algoritmo está fuera del alcance de este artículo, pero se pueden obtener más información en las fuentes de referencia.

Detección de objetivos de tamaño no fijo

Debido a que la detección de objetivos basada en el flujo de video, es poco probable que sepamos de antemano el tamaño del objetivo a detectar, lo que requiere que nuestros clasificadores en la tabla de sucesión tengan la capacidad de aumentar (o reducir) proporcionalmente, de modo que cuando un pequeño ventanilla se mueve a través de toda la imagen a detectar sin encontrar el objetivo, podemos ajustar el tamaño del clasificador y continuar detectando hasta que se detecte el objetivo o el tamaño de la ventana sea equivalente al de la imagen a detectar.

Paso uno:Preprocesamiento de imágenes

Después de obtener un cuadro (una imagen) de la cámara, debemos realizar algunos preprocesamientos en esta imagen:
1. Convertir la imagen del modo RGB a una imagen en escala de grises y realizar el procesamiento
2. Realizar la operación de equilibrio de histograma de la imagen en escala de grises

Estos pasos en OpenCV son muy sencillos:

image_size = cv.cvGetSize(image)# Obtener el tamaño original de la imagen 
grayscale = cv.cvCreateImage(image_size, 8, 1)# Crear una imagen en escala de grises vacía 
cv.cvCvtColor(image, grayscale, cv.CV_BGR2GRAY)# Conversión 
storage = cv.cvCreateMemStorage(0)# Crear un área de almacenamiento nueva para uso posterior 
cv.cvClearMemStorage(storage) 
cv.cvEqualizeHist(grayscale, grayscale)# Equilibrio de histograma de imagen en escala de grises 

Paso dos:Detectar y marcar el objetivo

En OpenCV, el modelo de detección de rostros ya se ha establecido como un archivo XML, que contiene los resultados de entrenamiento del clasificador de características harr mencionadas anteriormente. Podemos omitir el proceso de creación de la tabla de sucesión cargando este archivo. Con la tabla de sucesión, solo necesitamos pasar la imagen a detectar y la tabla de sucesión al algoritmo de detección de objetivos de OpenCV para obtener una colección de rostros detectados.

# detect objects 
cascade = cv.cvLoadHaarClassifierCascade('haarcascade_frontalface_alt.xml', 
      cv.cvSize(1,1))}} 
faces = cv.cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2, 
    cv.CV_HAAR_DO_CANNY_PRUNING, 
    cv.cvSize(50, 50))#Establecer el tamaño mínimo de la cara como50*50 píxeles 
if faces: 
 print 'face detected here', cv.cvGetSize(grayscale) 
 for i in faces: 
 cv.cvRectangle(image, cv.cvPoint( int(i.x), int(i.y)), 
   cv.cvPoint(int(i.x + i.width), int(i.y + i.height)), 
   cv.CV_RGB(0, 255, 0), 1, 8, 0)#Dibujar un rectángulo verde 

Paso tres:Dibujar la ventana de video con highgui

highgui.cvNamedWindow ('camera', highgui.CV_WINDOW_AUTOSIZE) 
highgui.cvMoveWindow ('camera', 50, 50) 
highgui.cvShowImage('camera', detimg) 

Se puede ver que la API de OpenCV es bastante clara, utilizando el paquete de Python, puede hacer que el código sea muy pequeño. Bueno, podemos ver los resultados de ejecución del programa: 

Dado que el flujo de video es dinámico, podemos usar un ciclo infinito en la entrada del programa, en el ciclo, cada vez que leemos un cuadro del video, transmitimos este cuadro al módulo de detección de rostros, el módulo realiza una marca en este cuadro (si hay un rostro), luego devuelve este cuadro, el programa principal recibe este cuadro y actualiza la ventana de visualización.

Otras características de OpenCV

Detección de bordes Laplaciano

def laplaceTransform(image): 
 laplace = None 
 colorlaplace = None 
 planes = [None, None, None] 
 image_size = cv.cvGetSize(image) 
 if not laplace: 
 for i in range(len(planes)): 
  planes[i] = cv.cvCreateImage(image_size, 8, 1) 
 laplace = cv.cvCreateImage(image_size, cv.IPL_DEPTH_16S, 1) 
 colorlaplace = cv.cvCreateImage(image_size, 8, 3) 
 cv.cvSplit(image, planes[0], planes[1], planes[2], None) 
 for plane in planes: 
 cv.cvLaplace(plane, laplace, 3) 
 cv.cvConvertScaleAbs(laplace, plane, 1, 0) 
 cv.cvMerge(planes[0], planes[1], planes[2], None, colorlaplace) 
 colorlaplace.origin = image.origin 
 return colorlaplace 

Efecto visual:

CVtypes incluye un ejemplo de histograma de espacio de color de imágenes:

Conclusión

OpenCV tiene una función muy potente y proporciona una gran cantidad de implementaciones de algoritmos. El contenido mencionado en el texto es solo una pequeña parte de la visión por computadora. Los lectores pueden considerar marcar las caras recopiladas para lograr el reconocimiento de rostros de personas específicas. O considerar la migración de la detección de rostros a la red para lograr la supervisión remota. Imagine que los dispositivos sin vida, podemos hacer que parezcan tener pensamientos a través de nuestros pensamientos y acciones, y esto es muy interesante en sí mismo.

Esto es todo el contenido de este artículo, espero que haya sido útil para su aprendizaje y que apoyen más a los tutoriales de grito.

Declaración: El contenido de este artículo se ha obtenido de la red, y pertenece al autor original. El contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará