Introducción a Opencv: introducción y uso básico | Equipo de tecnología de JD Logistics

1 Introducción a Opencv

Opencv es una biblioteca dedicada clásica en visión por computadora, admite múltiples idiomas, es multiplataforma y tiene funciones potentes. Opencv-Python proporciona una interfaz Python para Opencv, lo que permite a los usuarios llamar a C/C++ en Python para lograr las funciones requeridas y al mismo tiempo garantizar la legibilidad y la eficiencia operativa.

Opencv fue fundado por Gray Bradsky en Intel en 1999 y la primera versión salió en 2000. Vadim Pisarevsky se une a Gary Bradsky para gestionar el equipo de software ruso Opencv de Intel.

En 2005, Opencv se utilizó en Stanley, que ganó el DARPA Challenge 2005. Posteriormente, su desarrollo activo continuó con el apoyo de Willow Garage, con Gary Bradsky y Vadim Pisarevsky liderando el proyecto. Opencv ahora admite una variedad de algoritmos relacionados con la visión por computadora y el aprendizaje automático, y se expande día a día.

Opencv admite múltiples lenguajes de programación, como C++, Python, Java, etc., y se puede utilizar en diferentes plataformas como Windows, Linux, OS X, Android e IOS. También se están desarrollando activamente interfaces para operaciones de GPU de alta velocidad basadas en CUDA y OpenCL.

Opencv-Python es una API de Python para Opencv que combina las mejores características de la API de Opencv C++ y el lenguaje Python.

1.1 Opencv-Python

Opencv-Python es una biblioteca especializada diseñada para resolver problemas de visión por computadora.
Python es un lenguaje de programación de propósito general iniciado por Guidovan Rossum y rápidamente se hizo muy popular, principalmente por su simplicidad y legibilidad del código. Permite a los programadores expresar ideas en menos líneas de código sin reducir la legibilidad.

En comparación con lenguajes como C/C++, Python es más lento. Dicho esto, Python se puede ampliar fácilmente usando C/C++, lo que nos permite escribir código de uso intensivo de computadora en C/C++ y crear contenedores de Python que se pueden usar como módulos de Python. Nos brinda dos beneficios: primero, el código es tan rápido como el código C/C++ original (porque es código C++ real que se ejecuta en segundo plano) y, segundo, es más fácil escribir código en Python que en C/C++. Opencv-Python es un contenedor de Python para la implementación original de Opencv C++.

Opencv-Python aprovecha Numpy, una biblioteca altamente optimizada para operaciones numéricas que utiliza un lenguaje estilo MATLAB. Todas las estructuras de matrices Opencv se convierten hacia y desde matrices Numpy. Esto también facilita la integración con otras bibliotecas que usan Numpy, como Scipy y Matplotlib.

1.2 Áreas de aplicación

  • La interacción persona-ordenador
  • reconocimiento de objetos
  • Segmentación de imagen
  • Reconocimiento facial
  • Reconocimiento de acción
  • Seguimiento deportivo
  • robot
  • Análisis deportivo
  • visión de máquina
  • análisis estructural
  • conducción segura del coche

Como se mencionó anteriormente, opencv es muy poderoso y brilla en varios campos. Desde lo más superficial a lo más profundo, esta vez primero presentaremos las partes relevantes de la edición de imágenes y el reconocimiento alfanumérico simple. En el futuro, continuaremos iniciando el reconocimiento facial. segmentación de imágenes y reconocimiento de imágenes, posicionamiento y otras funciones;

2 instalación y uso de opencv-python

Primero necesitamos instalar el entorno.

  1. python3: instale python3: el tutorial de python tiene instrucciones detalladas, el sitio web instala python
  2. numpy: instalar numpy: pip instalar numpy
  3. opencv-python: aplicación opencv-python: pip install opencv-python

Después de instalar opencv-python, abra el entorno interactivo de Python en la línea de comando: la importación cv2 se realizó correctamente, lo que significa que opencv-python se instaló correctamente.

2.1 leer()

La función imread lee imágenes digitales. Primero, eche un vistazo a la definición de esta función en el sitio web oficial.

cv2.imread(path_of_image, intflag)

Parámetro de función uno: la ruta completa de la imagen que debe leerse
Parámetro de función dos: la forma en que se lee el logotipo en la imagen, puede elegir el siguiente método:

  • cv2.IMREAD_COLOR: Carga imágenes en color. Se ignorará cualquier transparencia de la imagen. es la bandera predeterminada
  • cv2.IMREAD_GRAYSCALE: Cargar imagen en modo escala de grises
  • cv2.IMREAD_UNCHANGED: conserva el canal de color original de la imagen leída
  • 1: Equivalente a cv2.IMREAD_COLOR
  • 0: Equivalente a cv2.IMREAD_GRAYSCALE
  • -1: Equivalente a cv2.IMREAD_UNCHANGED
color_img = cv2.imread("image_file/1.jpeg")
print(color_img.shape)

gray_img=cv2.imread("image_file/1.jpeg", cv2.IMREAD_GRAYSCALE)
print(gray_img.shape)

#把单通道图像保存后,再读取,仍然是3通道,相当于将单通道复制到3个通道保存
cv2.imwrite("image_file/gray_1.jpeg",gray_img)

2.2 umbral()

La función de esta función es binarizar la imagen. La binarización de la imagen es establecer el valor de gris de los píxeles de la imagen en 0 o 255, lo que significa que toda la imagen presenta un efecto visual obvio de solo blanco y negro. La binarización es uno de los métodos más simples de segmentación de imágenes. La binarización puede convertir imágenes en escala de grises en imágenes binarias. La binarización se logra estableciendo la escala de grises de los píxeles mayores que un cierto valor crítico de escala de grises como el valor máximo de la escala de grises y estableciendo la escala de grises de los píxeles menores que este valor como el valor mínimo de la escala de grises.

Dibuja un ejemplo

cv.threshold() se utiliza para implementar la segmentación de umbral. La función tiene 4 parámetros:

  • Parámetro 1: la imagen original a procesar suele ser una imagen en escala de grises, que también se procesa en el paso anterior.
  • Parámetro 2: Establecer umbral
  • Parámetro 3: umbral máximo, generalmente 255
  • Parámetro 4: método de umbral, hay 5 tipos principales, a saber: THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC, THRESH_TOZERO y THRESH_TOZERO_INV

Ejemplo:
ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
ret, th2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)
ret, th3 = cv.threshold(img, 127 , 255, cv.THRESH_TRUNC)
ret, th4 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO)
ret, th5 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO_INV)

títulos = ['Original', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
imágenes = [img, th1, th2, th3, th4, th5]

Utilice Matplotlib para mostrar
i en el rango (6):
plt.subplot(2, 3, i + 1)
plt.imshow(images[i], 'gray')
plt.title(titles[i], fontsize=8)
plt .xticks([]), plt.yticks([]) # Ocultar el eje de coordenadas
plt.show()

Salida real:

Instrucciones oficiales correspondientes.

2.3 morfologíaEx()

Las operaciones morfológicas son operaciones simples basadas en la forma de una imagen. Operaciones realizadas sobre imágenes binarias en general. Es necesario ingresar dos parámetros, uno es la imagen original y el segundo se llama elemento estructurante o núcleo, que se utiliza para determinar la naturaleza de la operación.

Dos operaciones morfológicas básicas son la erosión y la dilatación. Sus variaciones constituyen operaciones de apertura y operaciones de cierre, cuyos conceptos específicos son los siguientes:

1) Corrosión:

Al igual que la erosión del suelo, esta operación erosiona los límites del objeto en primer plano (pero el primer plano permanece blanco). ¿Cómo se hace esto? El núcleo de convolución se desliza a lo largo de la imagen. Si todos los valores de píxeles de la imagen original correspondientes al núcleo de convolución son 1, entonces el elemento central mantiene el valor de píxel original; de lo contrario, se vuelve cero.
¿Qué impacto tendrá esto? Según el tamaño del núcleo de convolución, todos los píxeles cercanos al primer plano se erosionarán (se volverán 0), por lo que los objetos del primer plano se harán más pequeños y el área blanca de toda la imagen se reducirá. Esto es útil para eliminar el ruido blanco y también se puede utilizar para desconectar dos objetos conectados, etc.

2) Ampliación:

A diferencia de la corrosión, siempre que uno de los valores de píxel de la imagen original correspondiente al núcleo de convolución sea 1, el valor de píxel del elemento central es 1.
Entonces esta operación aumentará el área blanca (primer plano) de la imagen. Generalmente, primero se utiliza la corrosión y luego la expansión para eliminar el ruido. Debido a que la corrosión elimina el ruido blanco, también reduce el tamaño de los objetos en primer plano. Entonces lo ampliamos nuevamente. En este punto el ruido se ha eliminado y no volverá a aparecer, pero las perspectivas siguen ahí y aumentarán. Los infladores también se pueden utilizar para unir dos objetos separados.

3) Operación abierta:

Primero se corroe y luego se expande. Eliminar pequeños puntos brillantes en la imagen (CV_MOP_OPEN);

4) Operación cerrada

Primero se expande y luego se corroe. Eliminar pequeñas manchas oscuras en la imagen (CV_MOP_CLOSE);

kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 8))
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv.imshow("MORPH_OPEN_1", opening)
cv2.waitKey(0)

kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 8))
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv.imshow("MORPH_OPEN_1", closing)
cv2.waitKey(0)

3 casos de aplicación

Lo anterior es un uso simple de opencv. Ahora tomemos un caso de aplicación práctico: identificar el código de verificación. De hecho, de acuerdo con los tres pasos anteriores, la imagen se puede procesar paso a paso, atenuarla, binarizarla, abrirla y finalmente Reconocido. Primero, la imagen original es la siguiente:

1) El primer efecto de procesamiento es escalar grises y binarizar la imagen para prepararla para la extracción del contorno. Después de la binarización, la imagen es blanca o negra, lo que es más propicio para las operaciones de apertura y cierre.

src = cv2.imread('image_file/before.png')
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow("Binarization", binary)
cv2.waitKey(0)

2) Según la imagen binaria anterior, realice una operación de apertura en la imagen resultante para eliminar la parte de ruido.

kernel = cv.getStructuringElement(cv.MORPH_RECT, (8, 1))
open_out = cv.morphologyEx(binl, cv.MORPH_OPEN, kernel)
cv.imshow("MORPH_OPEN_2", open_out)
cv2.waitKey(0)

3) Para el último procesamiento, establezca el fondo en blanco e identifique el código de identificación de la imagen.

cv.bitwise_not(open_out, open_out)  
cv.imshow("Transform", open_out)
textImage = Image.fromarray(open_out)
text = pytesseract.image_to_string(textImage)  
cv2.waitKey(0)

4) Finalmente imprima el código de verificación.

4 Resumen

Creo que después de leer detenidamente los puntos de conocimiento anteriores, opencv-python se ha vuelto competente en las operaciones básicas de las imágenes. A continuación, presentaremos algunos otros conceptos de imágenes digitales, así que estad atentos ~

Autor: JD Logística Zhang Weinan

Fuente: Comunidad de desarrolladores de JD Cloud Ziyuanqishuo Tech Indique la fuente al reimprimir

Lei Jun: La versión oficial del nuevo sistema operativo de Xiaomi, ThePaper OS, ha sido empaquetada. La ventana emergente en la página de lotería de la aplicación Gome insulta a su fundador. Ubuntu 23.10 se lanza oficialmente. ¡También podrías aprovechar el viernes para actualizar! Episodio de lanzamiento de Ubuntu 23.10: La imagen ISO fue "retirada" urgentemente debido a que contenía discurso de odio. Un estudiante de doctorado de 23 años solucionó el "error fantasma" de 22 años en Firefox. Se lanzó el escritorio remoto RustDesk 1.2.3. Wayland mejorado para soportar TiDB 7.4 Lanzamiento: Oficial Compatible con MySQL 8.0. Después de desconectar el receptor USB Logitech, el kernel de Linux falló. El maestro usó Scratch para frotar el simulador RISC-V y ejecutó con éxito el kernel de Linux. JetBrains lanzó Writerside, una herramienta para la creación de documentos técnicos.
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4090830/blog/10119720
Recomendado
Clasificación