Usar OpenCV en Fedora Linux – parte 1

El mundo de la tecnología cambia a diario y las demandas de visión artificial, inteligencia artificial y aprendizaje automático aumentan. La tecnología que permite que las computadoras y los teléfonos móviles vean su entorno se llama visión por computador . El trabajo para recrear un ojo humano comenzó en los años 50. Desde entonces, la tecnología de visión artificial ha recorrido un largo camino. La visión artificial ya ha llegado a nuestros teléfonos móviles a través de diferentes aplicaciones. Este artículo presentará OpenCV en Fedora linux

¿Qué es OpenCV?

OpenCV (Biblioteca de visión artificial de código abierto) es una biblioteca de software de aprendizaje automático y visión artificial de código abierto. OpenCV se creó para proporcionar una infraestructura común para las aplicaciones de visión por computadora y para acelerar el uso de la percepción de la máquina en los productos comerciales. Tiene más de 2500 algoritmos optimizados, que incluyen un conjunto completo de algoritmos de aprendizaje automático y visión por computadora clásicos y de última generación. Estos algoritmos se pueden usar para detectar y reconocer rostros, identificar objetos, clasificar acciones humanas en videos y establecer marcadores para superponerlos con realidad aumentada y mucho más.

opencv.org – acerca de

Instalar OpenCV en Fedora linux

Para comenzar con OpenCV, instálelo desde el Fedora repositorios de Linux.

                      $ sudo dnf install opencv opencv-contrib opencv-doc python3-opencv python3-matplotlib python3-numpy
                    

Nota: En Fedora Silverblue o CoreOs, Python 3.9 es parte del compromiso principal. Superponga OpenCV y las herramientas necesarias con: rpm-ostree install opencv opencv-doc python3-opencv python3-matplotlib python3-numpy.

Luego, ingrese los siguientes comandos en una terminal para verificar que OpenCV esté instalado (la entrada del usuario se muestra en negrita).

                      $ 
                      
                        python
                      
                      
Python 3.9.6 (default, Jul 16 2021, 00:00:00) 
[GCC 11.1.1 20210531 (Red Hat 11.1.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
                      
                        import cv2 as cv

                      
                      >>> 
                      
                        print( cv.__version__ )

                      
                      4.5.2
>>> 
                      
                        exit()
                      
                    

La versión actual de OpenCV debe mostrarse cuando ingresa el comando de impresión como se muestra arriba. Esto indica que OpenCV y las bibliotecas de Python-OpenCV se han instalado correctamente.

Además, si desea tomar notas y escribir código con Jupyter Notebook y obtener más información sobre las herramientas de ciencia de datos, consulte el anterior Fedora Artículo de revista: Jupyter y Data Science en Fedora.

Empezar con OpenCV

Una vez completada la instalación, cargue una imagen de muestra usando Python y las bibliotecas de OpenCV (presione el botón S tecla para guardar una copia de la imagen en formato png y finalizar el programa):

Contenido de starry_night.py:

                      
                        import
                      
                      
                        cv2
                      
                      
                        as
                      
                      
                        cv
                      
                      
                        import
                      
                      
                        sys
                      
                      
img = cv.imread(cv.samples.findFile(
                      
                        "starry_night.jpg"
                      
                      ))
if img is None:
    sys.exit(
                      
                        "Could not read the image."
                      
                      )
cv.imshow(
                      
                        "Display window"
                      
                      , img)
k = cv.waitKey(0)
if k == ord(
                      
                        "s"
                      
                      ):
    cv.imwrite(
                      
                        "starry_night.png"
                      
                      , img)

                    
                      $ python starry_night.py
                    

Escala de grises la imagen agregando el parámetro 0 a la función cv.imread como se muestra a continuación.

                      img 
                      
                        =
                      
                       cv
                      
                        .
                      
                      imread(cv
                      
                        .
                      
                      samples
                      
                        .
                      
                      findFile(
                      
                        "starry_night.jpg"
                      
                      ),
                      
                        0
                      
                      )
                    

Estos son algunos valores alternativos que se pueden usar para el segundo parámetro de la función cv.imread.

  • cv2.IMREAD_GRAYSCALE o 0: Cargue la imagen en modo escala de grises.
  • cv2.IMREAD_COLOR o 1: Cargue la imagen en modo color. Cualquier transparencia en la imagen será eliminada. Este es el valor predeterminado.
  • cv2.IMREAD_UNCHANGED o -1: Cargue la imagen sin alterar; incluido el canal alfa.

Mostrar atributos de imagen usando OpenCV

Los atributos de imagen incluyen el número de filas, columnas y canales; el tipo de datos de imagen; el número de píxeles; etc. Suponga que desea acceder a la forma de la imagen y su tipo de datos. Así es como lo harías:

                      
                        import
                      
                      
                        cv2
                      
                      
                        as
                      
                      
                        cv
                      
                      

img 
                      
                        =
                      
                       cv
                      
                        .
                      
                      imread(cv
                      
                        .
                      
                      samples
                      
                        .
                      
                      findFile(
                      
                        "starry_night.jpg"
                      
                      ))

                      
                        print
                      
                      (
                      
                        "
                      
                      
                        Image size is"
                      
                      , img
                      
                        .
                      
                      shape)

                      
                        print
                      
                      (
                      
                        "Data type of image is"
                      
                      , img
                      
                        .
                      
                      dtype)

                    
                      
                      
                      Image size is (600, 752, 3)
Data type of image is uint8

                    
                      
                      
                      
                        print
                      
                      (
                      
                        f"Image 2D numpy array 
                      
                      
                        n
                      
                      
                      
                      
                        {
                      
                      img
                      
                        }
                      
                      
                        "
                      
                      )

                    
                      
                      
                      Image 2D numpy array 
 [[[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  ...

                    
  • img.forma: devuelve una tupla del número de filas, columnas y canales (si es una imagen en color)
  • img.dtipo: devolver el tipo de datos de la imagen

Siguiente imagen de visualización con Matplotlib:

                      
                      
                      
                        import
                      
                      
                        cv2
                      
                      
                        as
                      
                      
                        cv
                      
                      
                        import
                      
                      
                        matplotlib.pyplot
                      
                      
                        as
                      
                      
                        plt
                      
                      
img 
                      
                        =
                      
                       cv
                      
                        .
                      
                      imread(cv
                      
                        .
                      
                      samples
                      
                        .
                      
                      findFile(
                      
                        "starry_night.jpg"
                      
                      ),
                      
                        0
                      
                      )
plt
                      
                        .
                      
                      imshow(img)
plt
                      
                        .
                      
                      show()

                    

¿Qué sucedió?

La imagen se leyó como una imagen en escala de grises, sin embargo, no necesariamente se mostrará en escala de grises cuando se usa la función imshow de Matplotlib. Esto se debe a que la función imshow usa un mapa de color diferente por defecto. Para especificar que se debe usar un mapa de colores en escala de grises, establezca el segundo parámetro de la función imshow en cmap=’gray’ como se muestra a continuación.

                      plt
                      
                        .
                      
                      imshow(img,cmap
                      
                        =
                      
                      
                        'gray'
                      
                      )

                    

Este problema también ocurrirá al abrir una imagen en modo color porque Matplotlib espera la imagen en formato RGB (rojo, verde, azul) mientras que OpenCV almacena imágenes en formato BGR (azul, verde, rojo). Para una visualización correcta, debe invertir los canales de la imagen BGR.

                      
                      
                      
                        import
                      
                      
                        cv2
                      
                      
                        as
                      
                      
                        cv
                      
                      
                        import
                      
                      
                        matplotlib.pyplot
                      
                      
                        as
                      
                      
                        plt
                      
                      
img 
                      
                        =
                      
                       cv
                      
                        .
                      
                      imread(cv
                      
                        .
                      
                      samples
                      
                        .
                      
                      findFile(
                      
                        "starry_night.jpg"
                      
                      ),cv
                      
                        .
                      
                      IMREAD_COLOR)
fig, (ax1, ax2) 
                      
                        =
                      
                       plt
                      
                        .
                      
                      subplots(
                      
                        1
                      
                      ,
                      
                        2
                      
                      )
ax1
                      
                        .
                      
                      imshow(img)
ax1
                      
                        .
                      
                      set_title(
                      
                        'BGR Colormap'
                      
                      )
ax2
                      
                        .
                      
                      imshow(img[:,:,::
                      
                        -1
                      
                      ])
ax2
                      
                        .
                      
                      set_title(
                      
                        'Reversed BGR Colormap(RGB)'
                      
                      )
plt
                      
                        .
                      
                      show()

                    

Dividir y fusionar canales de color

                      
                      
                      
                        import
                      
                      
                        cv2
                      
                      
                        as
                      
                      
                        cv
                      
                      
                        import
                      
                      
                        matplotlib.pyplot
                      
                      
                        as
                      
                      
                        plt
                      
                      

img 
                      
                        =
                      
                       cv
                      
                        .
                      
                      imread(cv
                      
                        .
                      
                      samples
                      
                        .
                      
                      findFile(
                      
                        "starry_night.jpg"
                      
                      ),cv
                      
                        .
                      
                      IMREAD_COLOR)
b,g,r 
                      
                        =
                      
                       cv
                      
                        .
                      
                      split(img)

fig,ax 
                      
                        =
                      
                       plt
                      
                        .
                      
                      subplots(
                      
                        2
                      
                      ,
                      
                        2
                      
                      )

ax[
                      
                        0
                      
                      ,
                      
                        0
                      
                      ]
                      
                        .
                      
                      imshow(r,cmap
                      
                        =
                      
                      
                        'gray'
                      
                      )
ax[
                      
                        0
                      
                      ,
                      
                        0
                      
                      ]
                      
                        .
                      
                      set_title(
                      
                        "Red Channel"
                      
                      );
ax[
                      
                        0
                      
                      ,
                      
                        1
                      
                      ]
                      
                        .
                      
                      imshow(g,cmap
                      
                        =
                      
                      
                        'gray'
                      
                      )
ax[
                      
                        0
                      
                      ,
                      
                        1
                      
                      ]
                      
                        .
                      
                      set_title(
                      
                        "Green Channel"
                      
                      );
ax[
                      
                        1
                      
                      ,
                      
                        0
                      
                      ]
                      
                        .
                      
                      imshow(b,cmap
                      
                        =
                      
                      
                        'gray'
                      
                      )
ax[
                      
                        1
                      
                      ,
                      
                        0
                      
                      ]
                      
                        .
                      
                      set_title(
                      
                        "Blue Channel"
                      
                      );


                      
                        # Merge the individual channels into a BGR image
                      
                      
imgMerged 
                      
                        =
                      
                       cv
                      
                        .
                      
                      merge((b,g,r))

                      
                        # Show the merged output
                      
                      
ax[
                      
                        1
                      
                      ,
                      
                        1
                      
                      ]
                      
                        .
                      
                      imshow(imgMerged[:,:,::
                      
                        -1
                      
                      ])
ax[
                      
                        1
                      
                      ,
                      
                        1
                      
                      ]
                      
                        .
                      
                      set_title(
                      
                        "Merged Output"
                      
                      );
plt
                      
                        .
                      
                      show()

                    
  • cv2.split: Divida una matriz multicanal en varias matrices de un solo canal.
  • cv2.merge: Combine varias matrices para crear una única matriz multicanal. Todas las matrices de entrada deben tener el mismo tamaño.

Nota: Las imágenes con más blanco tienen una mayor densidad de color. Por el contrario, las imágenes con más negro tienen una menor densidad de color. en lo anterior example el color rojo tiene la menor densidad.

Conversión a diferentes espacios de color

La función cv2.cvtColor convierte una imagen de entrada de un espacio de color a otro. Al transformar entre los espacios de color RGB y BGR, el orden de los canales debe especificarse explícitamente (RGB2BGR o BGR2RGB). Tenga en cuenta que el formato de color predeterminado en OpenCV a menudo se denomina RGB, pero en realidad es BGR (los bytes están invertidos). Entonces, el primer byte en una imagen de color estándar (24 bits) será un componente azul de 8 bits, el segundo byte será verde y el tercero será rojo. Los bytes cuarto, quinto y sexto serían entonces el segundo píxel (azul, luego verde, luego rojo), y así sucesivamente.

                      
                      
                      
                        import
                      
                      
                        cv2
                      
                      
                        as
                      
                      
                        cv
                      
                      
                        import
                      
                      
                        matplotlib.pyplot
                      
                      
                        as
                      
                      
                        plt
                      
                      
img 
                      
                        =
                      
                       cv
                      
                        .
                      
                      imread(cv
                      
                        .
                      
                      samples
                      
                        .
                      
                      findFile(
                      
                        "starry_night.jpg"
                      
                      ),cv
                      
                        .
                      
                      IMREAD_COLOR)
img_rgb 
                      
                        =
                      
                       cv
                      
                        .
                      
                      cvtColor(img, cv
                      
                        .
                      
                      COLOR_BGR2RGB)
plt
                      
                        .
                      
                      imshow(img_rgb)
plt
                      
                        .
                      
                      show()

                    

Más información

Más detalles sobre OpenCV están disponibles en el documentación en línea .

Gracias.

Related Posts