opencv advanced 02 - dibuja una variedad de figuras geométricas en la imagen

OpenCV proporciona funciones de dibujo convenientes, que se pueden usar para dibujar líneas rectas, rectángulos, círculos, elipses y otras figuras geométricas, y también puede agregar descripciones de texto en posiciones específicas de la imagen.

OpenCV proporciona la función cv2.line() para dibujar líneas rectas, cv2.rectangle() para dibujar rectángulos, cv2.circle() para dibujar círculos, cv2.ellipse() para dibujar elipses y cv2.polylines para dibujar polígonos () , la función cv2.putText() que agrega texto a la imagen y otras funciones de dibujo.

Estas funciones de dibujo tienen algunos parámetros comunes, que se utilizan principalmente para establecer la imagen de origen, el color, los atributos de línea, etc. A continuación se ofrece una breve introducción a estos parámetros comunes.

  • img : La imagen portadora sobre la que se dibujan los gráficos (portacontenedores para dibujar, también conocido como lienzo, mesa de trabajo).
  • color : El color para dibujar la forma. Los colores generalmente se representan utilizando el modelo BGR, por ejemplo, (0, 255, 0) para el verde. Para imágenes en escala de grises, solo se pueden pasar valores en escala de grises. Tenga en cuenta que el orden de los canales de color es BGR, no RGB.
  • grosor : El grosor de la línea. El valor predeterminado es 1, si se establece en -1, significa que se llenan los gráficos (es decir, los gráficos dibujados son sólidos).
  • lineType : el tipo de línea, el valor predeterminado es 8 tipos de conexión. El valor y la descripción del parámetro lineType se muestran en la Tabla 19-1.

inserte la descripción de la imagen aquí

  • shift: precisión de los datos. Este parámetro se utiliza para controlar la precisión del valor (como las coordenadas del centro del círculo, etc.) y, por lo general, no es necesario configurarlo.

dibujar linea recta

OpenCV proporciona la función cv2.line() para dibujar líneas rectas (segmentos de línea). La sintaxis de esta función es:

img = cv2.line( img, pt1, pt2, color[, grosor[, tipo de línea]])

En la fórmula:

  • Los significados de los parámetros img, color, grosor y tipo de línea son los que se muestran en la descripción anterior.
  • pt1 representa el primer punto (punto de inicio) del segmento de línea.
  • pt2 representa el segundo punto (punto final) del segmento de línea.

Ejemplo: use la función cv2.line() para dibujar tres segmentos de línea dentro de una imagen con un fondo negro.

import numpy as np
import cv2
n = 300  # 图像尺寸

# 创建一个空白的彩色图像,尺寸为(n+1) x (n+1)3通道(RGB)
img = np.zeros((n+1, n+1, 3), np.uint8)

# 在图像上绘制蓝色直线,起点为(0,0),终点为(n,n),线宽为3
img = cv2.line(img, (0, 0), (n, n), (255, 0, 0), 3)

# 在图像上绘制绿色直线,起点为(0,100),终点为(n,100),线宽为1
img = cv2.line(img, (0, 100), (n, 100), (0, 255, 0), 1)

# 在图像上绘制红色直线,起点为(100,0),终点为(100,n),线宽为6
img = cv2.line(img, (100, 0), (100, n), (0, 0, 255), 6)

winname = 'line-demo'  # 窗口名称

# 创建一个窗口并设置窗口名字
cv2.namedWindow(winname)

# 在窗口中显示图像
cv2.imshow(winname, img)

# 等待键盘按键,0表示无限等待
cv2.waitKey(0)
cv2.destroyAllWindows()

resultado de la operación:

inserte la descripción de la imagen aquí

dibujar rectángulo

OpenCV proporciona 函数 cv2.rectangle()métodos para dibujar rectángulos. La sintaxis de esta función es:

img = cv2.rectangle( img, pt1, pt2, color[, grosor[, lineType]] )

En la fórmula:

  • Los significados de los parámetros img, color, grosor y tipo de línea son los que se muestran en la descripción anterior.
  • pt1 es el vértice del rectángulo.
  • pt2 es el vértice opuesto a pt1 en el rectángulo.

Usa la función cv2.rectangle() para dibujar un rectángulo sólido y un rectángulo hueco dentro de una imagen de fondo blanco.

el código se muestra a continuación:

import numpy as np
import cv2

n = 300  # 图像尺寸

# 创建一个白色背景的彩色图像,尺寸为n x n,3通道(RGB)
img = np.ones((n, n, 3), np.uint8) * 255

# 在图像上绘制填充的红色矩形,左上角坐标为(50, 50),右下角坐标为(n-100, n-50),颜色为红色,厚度为-1表示填充, 0表示不填充
img = cv2.rectangle(img, (50, 50), (n-100, n-50), (0, 0, 255), -1)

winname = 'rect-shixin'  # 窗口名称

# 创建一个窗口并设置窗口名字
cv2.namedWindow(winname)

# 在窗口中显示图像
cv2.imshow(winname, img)

# 等待键盘按键,0表示无限等待
cv2.waitKey(0)

# 关闭所有打开的窗口
cv2.destroyAllWindows()

inserte la descripción de la imagen aquí
Voluntadimg = cv2.rectangle(img, (50, 50), (n-100, n-50), (0, 0, 255), -1)

Si -1 se cambia a 0, se puede dibujar un marco rectangular no sólido y el efecto es el siguiente.

inserte la descripción de la imagen aquí

dibujar circulo

OpenCV proporciona una 函数 cv2.circle()herramienta para dibujar círculos. La sintaxis de esta función es:

img = cv2.circle( img, center, radius, color[, thickness[, lineType]] )

En la fórmula:

  • Los significados de los parámetros img, color, grosor y tipo de línea son los que se muestran en la descripción anterior.

  • el centro es el centro de la circunferencia.

  • el radio es el radio

Utilice la función cv2.circle() para dibujar un conjunto de círculos concéntricos dentro de una imagen de fondo blanco.

el código se muestra a continuación:

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
(centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2))
# 将图像的中心作为圆心,实际值为 d/2
red = (0,0,255) # 设置白色变量
for r in range(5,round(d/2),12):
 cv2.circle(img,(centerX,centerY),r,red,3)
 # circle(载体图像,圆心,半径,颜色)
cv2.imshow("Demo19.3",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

resultado de ejecución:

inserte la descripción de la imagen aquí

dibujar una elipse

OpenCV proporciona la función cv2.ellipse() para dibujar elipses. El formato de sintaxis de esta función es:
img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[,
thick[, lineType]])
donde:

  • Los significados de los parámetros img, color, grosor y tipo de línea son los que se muestran en la descripción anterior.
  • center son las coordenadas del centro de la elipse.
  • ejes es la longitud de los ejes.
  • ángulo es el ángulo de desviación.
  • startAngle es el ángulo del ángulo inicial del arco.
  • endAngle es el ángulo del ángulo final del arco.

Utilice la función cv2.ellipse() para dibujar aleatoriamente un conjunto de elipses huecas dentro de una imagen de fondo blanco.

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
# 生成白色背景
center=(round(d/2),round(d/2))
# 注意数值类型,不可以使用语句 center=(d/2,d/2)
size=(100,200)
# 轴的长度
for i in range(0,10):
 angle = np.random.randint(0,361)
 # 偏移角度
 color = np.random.randint(0,high = 256,size = (3,)).tolist()
 # 生成随机颜色,3[0,256)的随机数
 thickness = np.random.randint(1,9)
 cv2.ellipse(img, center, size, angle, 0, 360, color,thickness)
cv2.imshow("demo-tuoyuan",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

resultado de ejecución:
inserte la descripción de la imagen aquí

dibujar polígono

OpenCV proporciona la función cv2.polylines() para dibujar polígonos. La sintaxis de esta función es:

img = cv2.polylines( img, pts, isClosed, color[, thick[,
lineType[, shift]]])

En la fórmula:

  • Los significados de los parámetros img, color, grosor, tipo de línea y desplazamiento son los que se muestran en la descripción anterior.
  • pts son los vértices del polígono.
  • isClosed es una bandera cerrada, que se usa para indicar si el polígono está cerrado. Si el valor es True, conecta el último punto con el primero para cerrar el polígono; de lo contrario, solo conecta los puntos para formar una curva.

Al usar la función cv2.polylines() para dibujar un polígono, debe proporcionar las coordenadas de cada vértice. Las coordenadas de estos puntos construyen una matriz cuyo tamaño es igual a "el número de vértices 1 2", y el tipo de datos de esta matriz debe ser numpy.int32.

Usa la función cv2.polylines() para dibujar un polígono dentro de una imagen de fondo blanco.

import numpy as np
import cv2
d = 400  # 图像尺寸

# 创建一个白色背景的彩色图像,尺寸为d x d,3通道(RGB)
img = np.ones((d, d, 3), dtype="uint8") * 255

# 生成多边形的各个顶点坐标
pts = np.array([[200, 50], [300, 200], [200, 350], [100, 200]], np.int32)

# 重新整形顶点数组,将其变为顶点数 x 1 x 2 的形状
pts = pts.reshape((-1, 1, 2))

# 使用 cv2.polylines() 函数绘制多边形
# 第一个参数为图像,第二个参数为顶点数组,第三个参数为True表示封闭多边形,颜色为绿色,线宽为8
cv2.polylines(img, [pts], True, (0, 255, 0), 8)
cv2.imshow("duobianxing",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

inserte la descripción de la imagen aquí

El tercer parámetro isClosed en la función cv2.polylines() es una bandera cerrada. Cuando este valor se establece en False, cada
vértice solo está conectado con un segmento de línea y el polígono no está cerrado. El código en este punto es:

cv2.polylines(img,[pts],False,(0,255,0),8)

El efecto es el siguiente:

inserte la descripción de la imagen aquí

dibujar texto en gráficos

OpenCV proporciona la función cv2.putText() para dibujar texto en gráficos. La sintaxis de esta función es:

img=cv2.putText(img, text, org, fontFace, fontScale, color[,
thick[, lineType[, bottomLeftOrigin]]])

En la fórmula:

  • Los significados de los parámetros img, color, grosor, tipo de línea y desplazamiento son los que se muestran en la descripción anterior.
  • el texto es la fuente para dibujar.
  • org es la ubicación para dibujar la fuente, comenzando desde la esquina inferior izquierda del texto.
  • fontFace indica el tipo de fuente, y sus tipos de parámetros y significados se muestran en la Tabla 19-2.
  • fontScale representa el tamaño de fuente.
  • bottomLeftOrigin se utiliza para controlar la orientación del texto. El valor predeterminado es False, cuando se establece en True, el texto se refleja verticalmente.

inserte la descripción de la imagen aquí

Usa la función cv2.putText() para dibujar texto dentro de una imagen de fondo blanco.

el código se muestra a continuación:

import numpy as np
import cv2

d = 400  # 图像尺寸

# 创建一个白色背景的彩色图像,尺寸为d x d,3通道(RGB)
img = np.ones((d, d, 3), dtype="uint8") * 255

# 定义字体
font = cv2.FONT_HERSHEY_SIMPLEX


# 在图像上绘制红色的 "OpenCV" 文本,位置同样为(0, 200),字体大小为3,线宽为5
cv2.putText(img, 'OpenCV', (0, 200), font, 3, (0, 0, 255), 5)

# 创建一个窗口并显示图像
cv2.imshow("weizi", img)

cv2.waitKey(0)
cv2.destroyAllWindows()


Este programa utiliza la función cv2.putText() para dibujar el texto "OpenCV" en la imagen img .

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/hai411741962/article/details/132293031
Recomendado
Clasificación