opencv 的基本操作 绘制几何图形
1.基本操作
1.1 读取图像
cv2.imread(path,[读取方式])
参数:
- path:要读取的图像路径
- 读取方式的标志(彩色-默认,灰色等等)
参考代码:
import cv2
import numpy as np
# 读取图像
img=cv2.imread(r"./src/1.jpg")
print(img)
'''
[[[246 246 246]
[246 246 246]
[246 246 246]
...
...
...
[246 246 246]
[246 246 246]
[246 246 246]]]
'''
print(img.shape,type(img),img.de)#(651, 650, 3) <class 'numpy.ndarray'>
说明图像可以以数据类型为uint8数组的形式输出
1.2 显示图像
cv2.imshow(arg1,arg2)
参数:
arg1:显示图像的窗口名称,以字符串类型表示
arg2:要加载的图像
注意:在调用显示图像的API后,要调用cv2.waitKey(0)给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来
# 显示图像
cv2.imshow('img',img) #第一个参数窗口名称 第二个参数为要显示的图像
cv2.waitKey(0) #让图像在屏幕上停留的时间(单位毫秒) 0:表示的是让图像永久暂停在屏幕上
- cv2.waitKey() 表示让图像在屏幕上停留的时间(单位毫秒) 0:表示的是让图像永久暂停在屏幕上
1.3.保存图像
cv2.imwrite(arg1,arg2)
参数:
- arg1:文件名,要保存在哪里
- arg2:要保存的图像
# 显示图像
cv2.imshow('img',img) #第一个参数窗口名称 第二个参数为要显示的图像
#保存图像
cv2.imwrite(r"./src/0.jpg",img)
cv2.waitKey(0) #让图像在屏幕上停留的时间(单位毫秒) 0:表示的是让图像永久暂停在屏幕上
2.绘制几何图形
2.1 1.绘制直线
cv2.line(img,start,end,color,thickness)

参数:
- img:要绘制直线的图像
- Start,end: 直线的起点和终点
- color: 线条的颜色
- Thickness: 线条宽度
#绘制直线
cv2.line(img,(100,10),(150,100),(255,255,0),2)
#参数分别为要操作的图像,直线的起始位置,直线的结束位置,颜色,粗细
cv2.imshow("img",img)
cv2.waitKey(0)
2.2 绘制圆形
cv.circle(img,centerpoint, r, color, thickness)
参数:
- img:要绘制圆形的图像
- Centerpoint, r: 圆心和半径
- color: 线条的颜色
- Thickness: 线条宽度,为-1时生成闭合图案并填充颜色(将是实心的)
# 绘制圆形
h,w,c=img.shape #分别是图像的高,宽,和颜色
cv2.circle(img,(int(h/2),int(w/2)),100,(0,255,255),-1)
cv2.imshow("img",img)
cv2.waitKey(0)
2.3绘制矩形
cv.rectangle(img,leftupper,rightdown,color,thickness)
参数:
- img:要绘制矩形的图像
- Leftupper, rightdown: 矩形的左上角和右下角坐标
- color: 线条的颜色
#绘制矩形
cv2.rectangle(img,(100,100),(300,400),(255,255,0),2)
cv2.imshow("img",img)
cv2.waitKey(0)
2.4.向图像中添加文字
cv.putText(img,text,station, font, Fontscale ,color,thickness,cv2.LINE_AA)
参数:
-
img: 图像
-
text:要写入的文本数据(opencv不提供中文编码)
-
station:文本的放置位置
-
font:字体样式
-
Fontscale :字体大小
-
thickness字体线条宽度
-
cv2.LINE_AA
最后一个参数
cv2.LINE_AA
表示使用反走样(Anti-Aliasing)技术来绘制文本边框。- 反走样是一种提高图形质量的技术,它通过混合颜色和像素边缘以减少锯齿状效果,使文本看起来更加平滑、清晰。
- 在 OpenCV 中,
cv2.LINE_AA
是一种高级线条类型,用于实现文本边界的高质量渲染。相比于其他线型如cv2.LINE_8
(默认值),它能提供更好的视觉效果,特别是在文本较小或者需要高精度显示的情况下
'''绘制文本'''
img=cv2.imread(r"./src/1.jpg")
#参数分别为要操作的图像,文本,文本的位置,文本的字体,文本的大小,颜色,线条粗细,文本的圆滑程度
cv2.putText(img,'hello',(100,150),cv2.FONT_ITALIC,5,(255,255,0),10,cv2.LINE_AA)
cv2.imshow("img",img)
cv2.waitKey(0)
2.5 获取并修改图像中的像素点
'''获取并修改图像中的像素点'''
img=cv2.imread(r"./src/1.jpg")
# 获取某个像素点的值
px=img[100,100]#[246 246 246] 表示这个像素点的BGR三原色
print(px)
# 改变图像中的像素点
img[100,:]=[0,0,255]
cv2.imshow('img',img)
cv2.waitKey(0)
取出图像像素点就像是numpy中取出数组索引,而修改就是对数组进行索引修改或者切片修改
6.捕获摄像头的实时视频流
cap = cv2.VideoCapture(path)
path视频流资源路径设置为0代表从默认摄像头捕获视频流
ret, frame = cap.read()(获取的是视频中每一帧的图片)
60帧=cv2.waitKey((1000毫秒)/60)
返回值cap 调用read()方法可以得到一个布尔值和一帧图像。布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败;如果为True,第二项则是当前帧的图像数据。
'''捕获摄像头的实时视频流'''
path=0#r'./src/谁.mp4'#获取视频的地址 0表示获取本地摄像头
cap=cv2.VideoCapture(path) #获取视频
while True:
# 获取视频每一帧的图像
ret,img=cap.read() #ret 表示是否获取到视频的图像
# 视频是每一帧图片在一定时间暂停下,循环迭代出来的
if ret:
cv2.imshow("img",img)
if cv2.waitKey(20)&0xff==ord('q'):
break
else:
break