🍉 博主微信
cvxiayixiao
🍓 【Segment Anything Model】计算机视觉检测分割任务专栏。 链接
🍑 【公开数据集预处理】特别是医疗公开数据集的接受和预处理,提供代码讲解。链接
🍈 【opencv+图像处理】opencv代码库讲解,结合图像处理知识,不仅仅是调库。链接本专栏代码地址
https://github.com/xiawei20161308104/xv_opencv_tutorials
文章目录
1.本节涉及的opencv新函数
🚩cv.line(),
🚩cv.circle() ,
🚩cv.rectangle(),
🚩cv.ellipse(),
🚩cv.putText()
2.opencv cv.line()绘制直线
cv.line()
函数用于绘制图像,首先有一个底图,在底图之上绘制直线,(0,0)为起始点,(511,511)为终止点,5为线宽
imshow()
函数用于显示图像,第一个参数是窗口的名称,第二个参数是要显示的图像。
waitKey(0)
函数用于等待用户按下任意键关闭图像窗口。
destroyAllWindows()
函数用于关闭所有打开的窗口
代码
import numpy as np
import cv2 as cv
# 创建一个黑色图像
img = np.zeros((512,512,3), np.uint8)
# 在图像上绘制一条蓝色的对角线,线宽为5像素
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()
效果
3.opencv cv.circle()绘制圆形
在上图基础上绘制一个半径为100的圆,圆心为(256, 256),颜色为红色,线宽为2
代码
第一个参数是图像。
第二个参数是圆心的坐标 (x, y)。
第三个参数是圆的半径。
第四个参数是颜色,以 (B, G, R) 的形式指定。
第五个参数是线宽,如果为负数,则表示填充整个圆
cv.circle(img, (256, 256), 100, (0, 0, 255), 2)
效果
3.opencv cv.circle()绘制实心圆
在cv.circle()函数中将线宽参数(thickness)设置为负值
代码
# 绘制一个填充的圆,半径为100,圆心在(256, 256),颜色为蓝色
cv.circle(img, (256, 256), 100, (255, 0, 0), -1)
线宽参数(thickness)设置为-1,表示绘制填充的圆。 圆的半径为100,圆心位于(256, 256),填充颜色为蓝色((255,0, 0))。
效果
4.opencv cv.circle()图像上绘制多个圆
多次调用cv.circle()函数,并为每个圆指定不同的参数
代码
# 绘制多个实心圆与空心圆
import numpy as np
import cv2 as cv
# 创建一个黑色图像
img = np.zeros((512,512,3), np.uint8)
# 在图像上绘制一条蓝色的对角线,线宽为5像素
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.circle(img, (256, 256), 100, (0, 0, 255), 2)
cv.circle(img, (256, 256), 100, (255, 0, 0), -1)
cv.circle(img, (100, 100), 50, (255, 0, 0), 2)
cv.circle(img, (200, 200), 80, (0, 255, 0), -1)
cv.circle(img, (300, 300), 30, (0, 0, 255), -1)
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()
效果
5.opencv cv.rectangle()绘制矩形
代码
import numpy as np
import cv2 as cv
# 创建一个空白图像
img = np.zeros((512, 512, 3), np.uint8)
# 在图像上绘制一个矩形,左上角坐标为(100, 100),右下角坐标为(400, 300),颜色为绿色,线宽为2
cv.rectangle(img, (100, 100), (400, 300), (0, 255, 0), 2)
# 显示图像
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()
第一个参数是图像。
第二个参数是矩形的左上角坐标 (x1, y1)。
第三个参数是矩形的右下角坐标 (x2, y2)。
第四个参数是颜色,以 (B, G, R) 的形式指定。
第五个参数是线宽,如果为负数,则表示填充整个矩形。
效果
6.opencv cv.rectangle()绘制多个矩形
代码
import numpy as np
import cv2 as cv
# 画一个黑色背景
img = np.zeros((512, 512, 3), np.uint8)
# 画很多个矩形 -1是画一个实心的
cv.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 2)
cv.rectangle(img, (300, 300), (400, 400), (0, 0, 255), -1)
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()
效果
7.opencv cv.ellipse()绘制椭圆
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
img:
要在上面绘制椭圆的图像或绘图表面。
center
:椭圆中心的坐标,以元组 (x, y) 形式表示。
axes
:表示椭圆的长轴和短轴长度的元组 (major_axis_length, minor_axis_length)。
angle
:椭圆的旋转角度,以度为单位。
startAngle
:椭圆弧的起始角度,以度为单位。
endAngle
:椭圆弧的结束角度,以度为单位。
color
:椭圆的颜色,使用 BGR 格式表示。可以是一个标量值或元组 (B, G, R)。
thickness
(可选):表示椭圆边界的厚度。如果未指定,椭圆将被填充。
lineType
(可选):指定用于绘制椭圆边界的线条类型。可以是以下之一:cv2.LINE_4、cv2.LINE_8、cv2.LINE_AA。默认情况下,使用 cv2.LINE_8。
shift
(可选):指定椭圆中心和轴值的坐标中的小数位数。默认为 0。
代码
import numpy as np
import cv2 as cv
# Create a blank image
img = np.zeros((512, 512, 3), np.uint8)
# Draw multiple rectangles
cv.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 2)
cv.rectangle(img, (300, 300), (400, 400), (0, 0, 255), -1)
# 绘制一个填充的红色椭圆
center = (250, 250)
axes = (150, 100)
color = (0, 0, 255) # 使用 BGR 颜色格式
cv.ellipse(img, center, axes, 0, 0, 360, color, thickness=-1)
# Display the image
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()
效果
将椭圆放在图像的右上角代码
可以通过调整椭圆中心的坐标来实现
import numpy as np
import cv2 as cv
# Create a blank image
img = np.zeros((512, 512, 3), np.uint8)
# Draw multiple rectangles
cv.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 2)
cv.rectangle(img, (300, 300), (400, 400), (0, 0, 255), -1)
# 绘制一个填充的红色椭圆
center = (250, 250)
axes = (150, 100)
color = (0, 0, 255) # 使用 BGR 颜色格式
cv.ellipse(img, center, axes, 0, 0, 360, color, thickness=-1)
center = (400, 100) # 将椭圆中心的坐标修改为右上角位置
axes = (15, 10)
color = (0, 0, 255) # 使用 BGR 颜色格式
cv.ellipse(img, center, axes, 0, 0, 360, color, thickness=-1)
# Display the image
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()
效果
8.opencv cv.putText()绘制文本
置绘制单行或多行文本,并允许你设置字体、字号、颜色等文本属性。
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
img
:要在上面绘制文本的图像或绘图表面。
text
:要绘制的文本内容。
org
:文本的起始坐标,以元组 (x, y) 形式表示,表示文本框左下角的位置。
fontFace
:字体类型,可以是预定义的字体名称,也可以是自定义字体文件的路径。
fontScale
:字体缩放因子,决定文本的大小。
color
:文本的颜色,使用 BGR 格式表示。可以是一个标量值或元组 (B, G, R)。
thickness
(可选):文本的线条粗细,如果为 0,则表示绘制填充的文本。默认值为 1。
lineType
(可选):文本边界的线条类型,可以是以下之一:cv2.LINE_4、cv2.LINE_8、cv2.LINE_AA。默认情况下,使用 cv2.LINE_8。
bottomLeftOrigin
(可选):如果为 True,则将 org 参数解释为文本框左下角的位置。默认为 False,表示 org 参数解释为文本框左上角的位置
代码
import numpy as np
import cv2 as cv
# Create a blank image
img = np.zeros((512, 512, 3), np.uint8)
# Draw multiple rectangles
cv.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 2)
cv.rectangle(img, (300, 300), (400, 400), (0, 0, 255), -1)
# 绘制一个填充的红色椭圆
center = (250, 250)
axes = (150, 100)
color = (0, 0, 255) # 使用 BGR 颜色格式
cv.ellipse(img, center, axes, 0, 0, 360, color, thickness=-1)
center = (400, 100) # 将椭圆中心的坐标修改为右上角位置
axes = (15, 10)
color = (0, 0, 255) # 使用 BGR 颜色格式
cv.ellipse(img, center, axes, 0, 0, 360, color, thickness=-1)
# 绘制文本
text = "Hello, OpenCV!"
org = (50, 100) # 文本框左下角的位置
fontFace = cv.FONT_HERSHEY_SIMPLEX # 字体类型
fontScale = 1.5 # 字体缩放因子
color = (255, 255, 255) # 使用白色文本
thickness = 2 # 文本线条粗细
cv.putText(img, text, org, fontFace, fontScale, color, thickness)
# Display the image
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()
效果
9.综合练习
代码
import cv2
import numpy as np
import matplotlib.font_manager as fm
# 创建一张空白图像
img = np.zeros((400, 600, 3), dtype=np.uint8)
# 绘制直线
start_point = (50, 50)
end_point = (550, 50)
line_color = (0, 255, 0) # 绿色线条
line_thickness = 2
cv2.line(img, start_point, end_point, line_color, line_thickness)
# 绘制圆
center = (300, 200)
radius = 100
circle_color = (0, 0, 255) # 红色圆圈
circle_thickness = 3
cv2.circle(img, center, radius, circle_color, circle_thickness)
# 绘制矩形
top_left = (100, 250)
bottom_right = (400, 350)
rectangle_color = (255, 0, 0) # 蓝色矩形
rectangle_thickness = -1 # 填充矩形
cv2.rectangle(img, top_left, bottom_right, rectangle_color, rectangle_thickness)
# 绘制椭圆
center = (500, 300)
axes = (100, 50)
angle = 30
start_angle = 0
end_angle = 360
ellipse_color = (255, 255, 0) # 黄色椭圆
ellipse_thickness = 2
cv2.ellipse(img, center, axes, angle, start_angle, end_angle, ellipse_color, ellipse_thickness)
# 绘制文本
text = "中文"
font_size = 30
org = (200, 150)
font_face = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1.5
text_color = (255, 255, 255) # 白色文本
text_thickness = 2
cv2.putText(img, text, org, fontFace=font_face, fontScale=font_size/10, color=text_color, thickness=text_thickness)
# 显示图像
cv2.imshow("绘图示例", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果
问题
所有字体都不支持中文 会乱码