OpenCV基础 | 2.图像,视频的加载与保存

2021-08-09 10:16:57 浏览数 (1)

作者:小郭学数据

源自:快学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中读取的视频是没有声音的

结语

以上内容仅是自我学习时记录的笔记,欢迎大家批评指正,一起学习进步。

0 人点赞