Fundamentos de OpenCv-Python


1. ¿Qué es OpenCv?

opencv es una herramienta para el procesamiento rápido de imágenes y problemas de visión artificial, y soporta múltiples lenguajes de desarrollo como c++, python, java, etc. Todos los ejemplos de este tutorial se basan en opencv-python, utilizando el lenguaje python para procesar y estudiar imágenes digitales.

2. Cargar/mostrar/guardar imagen

1.imread para leer la imagen

img = cv2.imread() 							# 读入的图像会被转化为ndarray,未读取到图像,返回None
filename:图像路径
flags:标志以什么形式读入图像,可以选择一下方式:
· cv2.IMREAD_COLOR: 默认模式,图像调整为BGR,任何图像的透明度都将被忽略     可以输入数字 1 代替
· cv2.IMREAD_GRAYSCALE:以灰度模式加载图像							  可以输入数字 0 代替
· cv2.IMREAD_UNCHANGED:保留读取图片原有的颜色通道 					  可以输入数字 -1 代替

2. mostrar pantalla

El papel de la función imshow es crear una ventana y mostrar la imagen en la ventana. La ventana se ajusta automáticamente al tamaño de la imagen. El tamaño de la
ventana que muestra la imagen se puede ajustar a través del módulo imutils.

cv2.imshow(winname,mat)
winname: 窗口名称(字符串)
mat: 图像对象,类型是numpy中的ndarray
------
# 我们一般就传入两个参数,一个需要修改大小的图像,一个weight或height,图像的新尺寸和原尺寸长宽比不变 
imutils.resize(image,width=None,height=None) 					

3. imwrite guardar

cv2.imwrite(filename, image)
filename: 保存的图像名称(字符串)
image: 图像对象,类型是numpy中的ndarray类型

4.waitKey() y destruir todas las ventanas()

waitkey controla la duración de imshow. Cuando imshow no va seguido de waitkey, es equivalente a no proporcionar tiempo para que imshow muestre la imagen. La función waitKey es una función
que espera los eventos del teclado. Cuando el valor del parámetro delay<=0, el tiempo de espera es infinitamente largo y el retraso es positivo Cuando es un número entero n, espere al menos n milisegundos antes del final
de waitKey Cuando se presiona cualquier tecla durante el período de espera, la función finaliza y el valor de la clave (código ASCII) del Si la tecla no se presiona después de que finaliza el tiempo de espera, se devuelve -1.Se puede usar la función ord ()
Para obtener el código ADCII del carácter, determine si la tecla de la letra A se presiona durante la espera período, y use el valor de retorno de waitKey ==ord("a")

Luego, cuando destruyamos la ventana, imagine dos formas:
(1) Deje que la ventana permanezca por un tiempo y luego destrúyala automáticamente;
(2) Reciba el comando especificado, como recibir la entrada de teclado especificada, y luego finalice la ventana

retval=cv2.waitKey(delay=None)  				# delay表示等待键盘触发的时间,单位是ms,默认为0
- delay > 0 :	等待delay毫秒时仍未接收到键盘输入,图像将自动销毁
- delay <= 0 : 无限等待,接收到任意键盘输入便会进行窗口销毁

Cuando usamos la función imshow para mostrar imágenes, necesitamos destruir la ventana de visualización de imágenes en el programa por fin, de lo contrario, el programa no terminará normalmente.Las funciones comúnmente utilizadas para destruir ventanas incluyen las siguientes dos

- cv2.destroyWindow(winname) 			# 销毁单个特定窗口 winname:将要销毁的窗口的名字

- cv2.destroyAllWindows() 				# 销毁全部窗口,无参数

3. Dibujo sencillo

Parámetros públicos:
img: Indica el ndarray del objeto de imagen que se debe dibujar.
Color: Indica el color de la figura geométrica dibujada, usando BGR.
Grosor: Indica el grosor de la línea en la figura geométrica dibujada, el valor predeterminado es 1, para imágenes cerradas. como círculos y elipses, tomar - 1 es para llenar el interior del gráfico
. lineType: indica el tipo de dibujo de líneas de gráficos geométricos. La línea predeterminada conectada en 8 es suave. Cuando se usa cv2.LINE_AA, la línea es más suave.

  1. Línea recta
    cv2.line(img, pt1, pt2, color, grosor=Ninguno, lineType=Ninguno, shift=Ninguno)
    pt1, pt2 representan las coordenadas de píxel del punto inicial y final de la línea respectivamente
  2. Rectangle
    cv2.rectangle(img, pt1, pt2, color, thick=None, lineType=None, shift=None)
    pt1, pt2 representan las coordenadas de la esquina superior izquierda y la esquina inferior derecha del rectángulo respectivamente
  3. Círculo
    cv2.circle(img, centro, radio, color, grosor=Ninguno, tipo de línea=Ninguno, shift=Ninguno) el
    centro y el radio representan las coordenadas del centro del círculo y el radio del círculo respectivamente
  4. Agregar texto
    cv2.putText(img,text,org,fontFace,fontScale,color,thickness=None,lineType=None)
    text es el contenido del texto que se dibujará
    org es la posición de la fuente dibujada, la esquina inferior izquierda del texto es el punto de partida
    fontFace tipo de fuente, ejemplo cv2.FONT_HERSHEY_SIMPLEX
    fontScale tamaño de fuente

  1. Interacción del mouse
    Cree una función de respuesta, escriba la operación que se implementará en la función
    def OnMouseAction(event,x,y,flags,param)
    OnMouseAction es el nombre de la función de respuesta, puede personalizar
    el evento para indicar qué evento se activó, como cv2. EVENT_LBUTTONDOWN Al presionar el botón izquierdo
    x, y indica las coordenadas del mouse en la ventana (x, y) cuando se activa el evento del mouse.
    flags indica el evento de arrastre del mouse . Después de definir la función de respuesta
    como la función ID
    , vincule la función a una ventana específica, permita que cuando el mouse en la ventana active un evento, la función de respuesta se puede encontrar y ejecutar.
    Use la función cv2.setMouseCallback(winname,onMouse) para enlazar la ventana y la función de respuesta
    winname es el nombre de la ventana
    y onMouse es el nombre de la función de respuesta
# 示例:单击鼠标左键,输出鼠标的坐标信息
def OnMouseAction(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print(x, y)
img = cv2.imread("lena.jpg")
cv2.namedWindow("x")
cv2.setMouseCallback("x", OnMouseAction)
cv2.imshow("x", img)
cv2.waitKey()
cv2.destroyAllWindows()
  1. Barra de desplazamiento
    cv2.createTrackbar(trackbarname,winname,value,count,onChange)
    trackbarname nombre de la barra de desplazamiento
    winname ventana nombre
    valor valor inicial, posición del control deslizante
    cuenta valor máximo de la barra de desplazamiento, generalmente el valor mínimo es 0
    onChange función de devolución de llamada, establezca la barra de desplazamiento en La operación después de la la tabla está escrita en esta función
    Obtenga el valor de retorno de la barra de desplazamiento a través de la función retval = cv2.getTrackbarPos(trackbarname,winname)

4. Conceptos básicos del procesamiento de imágenes

  1. Cuando se lee una imagen en color usando OpenCv, los valores de píxel de los canales B, G y R de la imagen se leerán en secuencia, y se puede acceder a los valores en la matriz de imágenes en forma de un índice, por ejemplo, imagen[0,0,0] accede a la primera imagen de la imagen Fila 0, columna 0, píxel del canal 0 (canal B)
  2. Operación de canales
    División de canales
    por índice b=img[:,:,0] g =img[:,:,1] r=img[:,:,2] b,g,r=cv2.split( img ) combinación
    de
    canales
    cv2.merge([b,g,r])
  3. Obtener el atributo de imagen
    img.shape fila, columna, canal -> H, W, C
    img.dtype tipo de datos
    img.size número total de píxeles

Cinco, espacio de color

  1. El espacio de color GRAY (imagen en escala de grises)
    generalmente se refiere a una imagen en escala de grises de 8 bits con 256 niveles de gris, y el rango de valores de píxeles es [0,255]
  • RGB->GRIS
    Gris=0.299 R+0.587 G+0.114*B
  • GRIS->RGB
    R=Gris, G=Gris, B=Gris
  1. Espacio de color HSV
    Matiz, color de luz, rango de valores [0,360]
    Saturación, profundidad de color, rango [0,1]
    Valor de brillo, brillo de luz, rango [0,1]
  2. Función de conversión de tipo
    dst = cv2.cvtColor(src,code,dst=None,dstCn=None)
    dst representa la imagen de salida, que tiene el mismo tipo de datos y profundidad que la imagen de entrada.
    src representa la imagen de entrada, y uint8,uint16 El código float32
    representa el espacio de color. El código de conversión
    dstCn es el número de canales de la imagen de destino.

6. Transformación geométrica

  1. Escalado
    dst = cv2.resize(src,dsize,dst=Ninguno,fx=Ninguno,fy=Ninguno,interpolación=Ninguno)
    dst imagen de destino de salida, el tamaño de la imagen es dsize (cuando el valor no es 0)
    src imagen original
    dsize imagen de salida Tamaño
    fx Relación de zoom horizontal
    fy Relación de zoom vertical
    interpolación método de interpolación, el valor predeterminado es cv2.INTER_LINEART, interpolación bilineal
    El tamaño de la imagen de destino dst se especifica mediante dsize o fx\fy
  • Si especifica el valor de dsize, independientemente de si especifica el valor de fx\fy, el tamaño de dst está determinado por dsize dsize
    (w,h), w y h corresponden al ancho y alto de la imagen objetivo ampliada, w está relacionado con fx, y h está relacionado con fy
    Cuando se especifica dsize, el tamaño de escala en la dirección x es fx=double(dsize.w / src.w)
    De manera similar, el tamaño de escala en la dirección y es fy= double(tamañod.h / src.h)
  • Especificar por los parámetros fx y fy
    Si el valor del parámetro dsize es Ninguno, el tamaño de la imagen de destino en este momento es
    w = redondo (fx src.w), h = redondo (fy src.h)
  1. Flip
    dst = cv2.flip(src, flipCode)
    dst representa la imagen de destino con el mismo tamaño y tipo de datos que la imagen original
    src imagen original
    flipCode tipo de rotación

    flipcode efecto
    0 Voltear alrededor del eje x
    un numero positivo Voltear alrededor del eje y (más comúnmente utilizado)
    numero negativo Da la vuelta a x, y al mismo tiempo
  2. Afín
    La transformación afín significa que la imagen se puede traducir y rotar a través de una serie de transformaciones geométricas
    dst = cv2.warpAffine(src,M,dsize,dst=None,flags=None)
    dst imagen de destino
    src imagen original
    M Matriz de transformación, 2 filas y 3 columnas
    dsize Tamaño de imagen de salida, el orden es (w, h), primera fila y luego columna
    dst (x, y) = src (M11 x+M12 y+M13, M21 x+M22 y+M23)

  • Traducción M=np.float32([[1,0,detx],[0,1,dety]]), detx y dety son distancias de traducción en las direcciones x e y
  • La rotación obtiene la matriz de transformación M a través de la función retval = cv2.getRotationMatrix2D(centro, ángulo, escala).El
    centro es el punto central de la rotación, (x, y)
    el ángulo es el ángulo de rotación, un número positivo significa en sentido antihorario, y un número negativo significa en el sentido de las agujas del reloj.La
    escala es la escala de transformación, para escalar el tamaño.

7. Procesamiento de video

Un vídeo se compone de una serie de imágenes llamadas fotogramas. La velocidad de reproducción de fotogramas se denomina velocidad de fotogramas, la unidad es fotograma/segundo y el inglés correspondiente es FPS (fotogramas por segundo).

  • Clase de captura de video
  1. Objeto de captura de inicialización
    = cv2.VideoCapture("Número de identificación de la cámara")
    El número de identificación de la cámara es -1 de forma predeterminada, lo que significa que una cámara se selecciona aleatoriamente. Si hay varias cámaras, use los números 0, 1 y 2 para representar el número de identificación de la cámara a su vez
    "Objeto de captura" es el valor de retorno, que es el objeto instanciado de la clase VideoCapture
    . Al inicializar el archivo de video, el parámetro es el nombre del archivo
    Objeto de captura = cv2.VideoCapture ("nombre de archivo")
  2. cv2.VideoCapture.isOpend() verifica si la inicialización es exitosa, devuelve True en caso de éxito y devuelve False en caso de falla
  3. Recuperación de cuadro de captura
    , imagen = cv2.VideoCapture.read()
    retval indica si el cuadro de captura es exitoso,
    la imagen Verdadero/Falso indica el cuadro devuelto, si no hay cuadro, devuelve Ninguno
  4. cv2.VideoCapture.release() Cierra la cámara
  5. Configuración de la propiedad
    retval = cv2.VideoCapture.get(propld) Obtener el
    valor propld de la propiedad del objeto de la clase VideoCapture
    cv2.CAP_PROP_FRAME_WIDTH
    cv2.CAP_PROP_FRAME_HEIGHT
    retval = cv2.VideoCapture.set(propld,value) Cambiar la propiedad del objeto de la clase VideoCapture
  • La clase VideoWriter
    guarda la imagen como un archivo de video/modifica las propiedades del video, incluida la conversión completa del tipo de video.
  1. Objeto de instanciación de inicialización
    = cv2.VideoWriter(filename, fourcc, fps, frameSize)
    nombre de archivo, si el nombre de archivo ya existe, sobrescribirá el archivo
    fourcc, a menudo usa cv2.VideoWriter_fourcc('X','V','I', ' D'), que indica el tipo de codificación mp4, la extensión del archivo generado es .avi
    fps, la velocidad de fotogramas
    frameSize, el ancho y el alto de cada fotograma
  2. función de escritura
    Ninguna = cv2.VideoWriter.write(image)
    image es el cuadro de video que se escribirá, y el formato de la imagen en color es BGR
  3. Liberar
    cv2.VideoWriter.release()
import cv2
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
forcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("xx.avi", forcc, 25, (640, 480))
while cap.isOpened():
    retval, frame = cap.read()
    if retval:
        out.write(frame)
        cv2.imshow("xx", frame)
        k = cv2.waitKey(1)
        if k == 27:
            break
    else:
        break
cap.release()
out.release()
cv2.destroyAllWindows()

Resumir

Sugerencia: aquí hay un resumen del artículo:
por ejemplo: lo anterior es de lo que hablaré hoy. Este artículo solo presenta brevemente el uso de pandas, y pandas proporciona una gran cantidad de funciones y métodos que nos permiten procesar datos rápidamente. y fácilmente

Supongo que te gusta

Origin blog.csdn.net/goodlmoney/article/details/126830538
Recomendado
Clasificación