作者:小郭学数据
源自:快学python
学习视频可参见python opencv3.3视频教学 基础入门
今天写的是图像,视频的加载与保存
1.图像,数字图像,像素
1.图像
- 图像:定义为二维函数f(x,y),其中,x,y是空间坐标,f(x,y)是点(x,y)的幅值
- 灰度图像:是一个二维灰度(或亮度)函数f(x,y)
- 彩色图像:由三个(如RGB,HSV)二维灰度(或亮度)函数
- RGB:R,红,G,绿,B,蓝
- HSV:H,色调,S,饱和度,V:明度
2.数字图像
- 数字图像:像素组成的二维排列,可以用矩阵表示
- 单色(灰度)图像:每个像素的亮度用一个数值来表示,通常数值范围在0-255,0表示黑,255表示白,其它值表示处于黑白之间的灰度
- 彩色图像:用红,绿,蓝三元组的二维矩阵表示,通常,三元组的每个数值也是在0-255之间,0表示相应的基色在该像素中没有,255则代表相应的基色在该像素中取得最大值
3.像素
数字图像由二维元素组成,每一个元素具有一个特定位置(x,y)和幅值f(x,y),这些元素就称为像素
2.图像信息获得
代码语言:javascript复制def get_image_info(image):
print("图像类型:",type(image))
print("图像长x宽x通道数:",image.shape)
print("图像长宽通道数相乘所得值:",image.size)
print("图像像素值类型:",image.dtype)
pixel_data = np.array(image) # 将图片转换成数组
print("像素大小:", pixel_data)
结果输出
代码语言:javascript复制图像类型: <class 'numpy.ndarray'>
图像长x宽x通道数: (512, 512, 3)
图像长宽通道数相乘所得值:786432
图像像素值类型:uint8
像素大小: [[[128 138 225]
[127 137 224]
[126 136 223]
...
[ 81 68 178]
[ 83 71 183]
[ 84 74 188]]]
3.彩色图转灰度图
代码语言:javascript复制def save_image(image):
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) # 将image图片转换成灰度图
cv.imwrite("huidu.png",gray) #将转换后的图片保存为huidu.png
cv.imshow("gray",gray)
原图与灰度图对比:
4.获取视频
代码语言:javascript复制# 获取视频
def video_demo():
capture = cv.VideoCapture(0) #0指笔记本的内置摄像头,可以设置成1或其他的来选择成别的摄像头
print("类型",type(capture))
while True:
ret, frame = capture.read() # 获取相机图像,返回ret(结果为True/False),和每一帧图片
frame = cv.flip(frame, 1) # 将图片水平翻转,竖直翻转为0
print('1', ret) # 打印出ret值
cv.imshow("video", frame) # 将每一帧图片放入video窗口
c = cv.waitKey(50) # 等有键输入(这里指c=Esc键)或者50ms后自动将窗口消除
if c == 27: #如果按esc退出的话,这里必须是等于27,27是esc的ASCLL十进制表示
break
5.视频保存
代码语言:javascript复制def save_video():
cap = cv.VideoCapture(0)
#FourCC是用于指定视频编解码器的4字节代码
#在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG会生成大尺寸的视频。X264会生成非常小的尺寸的视频)
#在Windows中:DIVX(尚待测试和添加)
#在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。
fourcc = cv.VideoWriter_fourcc('D', 'I','V', 'X')
# 参数说明:输出视频名称,编码格式,播放频率,帧的大小
out = cv.VideoWriter("../images/xiaoguo.avi", fourcc, 50.0, (640, 480))
while cap.isOpened(): # 你可以使用 cap.isOpened(),来检查是否成功初始化了
ret, frame = cap.read()
if ret is True:
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
- cv.waitKey(1) & 0xFF == ord('key'):
- 功能:若键盘输入'key',视频停止录制并保存
- 参数:1:表示延时1ms切换到下一帧图像,对于视频而言;0:只显示当前帧图像,相当于视频暂停;key:要输入键盘的键
- 返回值:ord(' ')将字符转化为对应的整数(ASCII码)
- 科普
- 视频中每一帧代表一幅图像
- 帧的大小也就是图像的的大小即图像的宽,高
OpenCv中读取的视频是没有声音的
结语
以上内容仅是自我学习时记录的笔记,欢迎大家批评指正,一起学习进步。