【第三章:OpenCv图片、视频读写操作与基本应用】

1.图像处理

1.1 读取、保存一张图像

  • 在图像处理当中,视频其实是由很多帧图片组成(1s视频包含100张图片,视频帧率就是1000FPS),如果帧率越高,视频越顺畅。我们对视频的处理归根到底就是对图片的处理。大家可以将图像处理流程理解成一个加工厂,我们提供原料,经过工厂加工,出来的就是我们需要的产品。

  • 其中,对图片处理是最基础的,在验证我们算法的时候,一般都是对图片处理,如果图像处理效果能满足我们的需求,将输入图片换位图片流,也就是对视频处理。因此我们有必要熟悉图像读取,保存(批量保存)等操作,这将是后续OpenCv算法学习的基础。

  • 注意: cv库读取图片的路径不能包含中文,所有大家读取路径的时候要注意!

图1.1.1 图像处理基本流程


  • 图片的读写和保存代码如下
# 作者:OpenCv机器视觉
# 时间:2023/1/3
# 功能:掌握图片的读写和保存
import cv2 as cv    # 导入cv2库,用cv简写代替


# 图片路径的两种表达形式,个人比较喜欢第一种表达,(利用转义字符)第一种使用的是“\\”,第二种使用电脑直接copy路径,然后前面加r便可
img_path = ".\\img\\1.png"  # img_path = r"/img/1.png"


# 读取图片,函数cv2.imread(filepath,flags)
img = cv.imread(img_path)   # flags不填,或者填1都是直接读取彩色图像,填0以灰度的图像方式读取


# 新建一个显示窗口,窗口名字需要跟图片名字一样为“image”,图片才能显示在窗口上,0:自由缩放,1,按照图片大小显示
cv.namedWindow("image",0)
# 显示图片
cv.imshow("image",img)

# 保存图片,保存路径为:.\\img\\save.png
cv.imwrite(".\\img\\save.png",img)

cv.waitKey(0)# 0表示持续显示图片,不然图片会一闪而过,如果为非50,就是图片演示50ms



图1.1.2 读取图片效果


1.2 批量读取一个文件夹所有图像

  • 在后续的学习当中,会经常用到批量批量处理操作,例如深度学习中数据集的制作,图片的批量重命名,对大量图片进行算法验证的时候,批量处理就能大大提高工作效率。批量处理的思想不仅仅局限于对图像的处理,在办公自动化,处理大量文件时也非常有优势,希望大家能用一种发散的思维去学习,将所学的思想方法广泛应用到各个地方。
  • 大家先掌握批量处理的思维,批量处理还有比较多需要注意的细节,但是这些需要后面大家通过大量例子的训练然后掌握,因为有一些细节具有特殊性,没有必要放在入门基础这里讲解,后面案例分享的时候,涉及到想过知识点我也会提醒大家。
# 作者:OpenCv机器视觉
# 时间:2023/1/3
# 功能:掌握图片的批量操作

import cv2 as cv
import os   #os库主要是对文件和文件夹进行操作


file_path = ".\\img"   # 这里选择当前路径下的img文件夹,里面有1.png、save.png两张图片


# 获取file_path文件夹下面的所有文件
file_list = os.listdir(file_path)
print(file_list)


# 批量操作
for file in file_list:
    # 因为读取图片需要完整的相对路径或者绝对路径,因此需要将文件夹路径与图片命名拼凑起来
    img_path = os.path.join(file_path, file)
    print(img_path)


    # -------图像处理算法,对图片进行批量处理,这里的图像处理算法,推荐写功能函数进行模块化编写----------
    # 读取图片
    cv.imread(img_path)
    # 图像算法函数调用
    print("开始算法处理")
    # 算法处理完成
    print("处理完成")
    print()


  • 运行结果
C:\Users\19446\Anaconda3\python.exe F:/code/anaconda_environment/CSDN/CSDN基础教程/第二章:图像、视频读写操作与基本应用/02_批量读取图片.py
['1.png', 'save.png']
.\img\1.png
开始算法处理
处理完成

.\img\save.png
开始算法处理
处理完成


Process finished with exit code 0



2.视频处理

1.读取本地视频/外置摄像头,并进行显示保存

备注: 这里外置摄像头采用的是免驱的工业相机

# 作者:OpenCv机器视觉
# 时间:2023/1/4
# 功能:读取本地视频/外置摄像头,并进行显示保存

import numpy as np
import cv2
import cv2 as cv

# cap = cv2.VideoCapture(0) # 0:外置摄像头,更换为其他相机设备时,可设置为1,2进行尝试
cap = cv2.VideoCapture(".\\video\\1.mp4") # 这里利用路径读取本地视频

# 查看视频的宽度、高度
frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)


# 对于本地视频,长宽只能采用默认的,不然保存的视频无法打开,但是对于部分工业相机,其分辨率可以设置,同时帧率也会随着变化
# ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
# ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

# 保存视频参数设置
fps = cap.get(cv2.CAP_PROP_FPS)             # 获取原来视频/相机的帧率
fps = 10                                    #保存视频的帧率设置,根据需要适当调整
size = (int(frame_width),int(frame_height)) # 图片的宽高
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
videoWriter = cv2.VideoWriter('.\\video\\1.avi',fourcc,fps,size)# 设置保存路径、保存格式、保存帧率设置、视频大小宽高设置


i = 0
while (cap.isOpened()): # 如果相机已经初始化,即可开始获取图片,对图片进行处理
    ret, frame = cap.read()     # ret 为bool值,frame为获取的每一帧图片

    #------------------------------------------------------------#
    #                     图像处理算法                             #
    # 对帧图片进行保存,命名位数为4,这边保证批量读取是按照顺序0001~0009读取 #
    #       而不是1,10,11,12。。。19,2、21、22...方式读取          #
    # cv.imwrite(".\\img\\"+str(format(i, '04d'))+".jpg",frame)  #
    #------------------------------------------------------------#


    # 显示视频流
    cv.namedWindow("frame",0)
    cv.imshow("frame",frame)

    # 对视频进行写操作
    videoWriter.write(frame)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break


# 退出之后进行内存释放
cap.release()
cv2.destroyAllWindows()



  • 这里是深度相机KinectV2的驱动代码
from pykinect2 import PyKinectV2
from pykinect2.PyKinectV2 import *
from pykinect2 import PyKinectRuntime
import numpy as np
import cv2

kinectD = PyKinectRuntime.PyKinectRuntime(PyKinectV2.FrameSourceTypes_Depth)
kinectC = PyKinectRuntime.PyKinectRuntime(PyKinectV2.FrameSourceTypes_Color)

while True:
    # --- Getting frames and drawing
    # if kinectD.has_new_depth_frame():
    if kinectC.has_new_color_frame():
        frameD = kinectD.get_last_depth_frame()
        frameC = kinectC.get_last_color_frame()
        frameD = frameD.astype(np.uint8)
        frameC = np.reshape(frameC, (1080, 1920, 4))
        frameD = np.reshape(frameD, (424, 512))
        outputC = cv2.resize(frameC, (0, 0), fx=0.5, fy=0.5)
        outputD = cv2.resize(frameD, (0, 0), fx=1.0, fy=1.0)
        cv2.imshow('KINECT Video StreamC', outputC)
        cv2.imshow('KINECT Video StreamD', outputD)
        frame = None
    key = cv2.waitKey(1)
    if key == 27:
        break

3.图片转视频

  • 视频是由图片流组成,所有我们可以通过多张图片合成视频。

  • 之前做过常见几个初等函数的Taylor拟合,每个函数生成了50张图片,因此这里采用之前的图片,利用下面代码,直接生成一个视频。

图2.3.1 需要转换的图片


  • 以下是转换效果视频:

泰勒拟合三角函数sinx

  • 以下是运行代码
# 作者:OpenCv机器视觉
# 时间:2023/1/4
# 功能:图片转视频
import cv2
import os


file_path = 'img\\sinx\\'         # 图片所在文件夹
imgs = os.listdir(file_path)     # 所有图片名称


fps = 15                    # 设置保存视频的帧率
size=(640,480)              # 设置保存视频的宽高,一般以图片原有的宽高为准,
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
videoWriter = cv2.VideoWriter('video\\sinx.avi',fourcc,fps,size) # 视频保存参数设置


for i in imgs:
    img_path = os.path.join(file_path,i)    # 讲文件路径与图片名合并成图片完成的路径
    frame = cv2.imread(img_path)            # 读取图片
    videoWriter.write(frame)                # 每一帧图片写入视频

videoWriter.release()                       # 释放内容

4.图片/视频制作Gif动态图

4.1 图片生成Gif

  • 将需要转换的图片放在文件夹中
图4.1.1 需要转换的图片


  • 使用下面代码,进行转换,代码路径大家根据实际情况进行更改
# 作者:OpenCv机器视觉
# 时间:2023/1/4
# 功能:图片转GIF
import imageio
import os

def img_to_gif(imgs, gif_name, duration=1.0):

    # 将所有图片存放在同一个列表当中
    frames = []
    for img in imgs:
        print(img)
        frames.append(imageio.imread(img))

    imageio.mimsave(gif_name, frames, 'GIF', duration=duration)


def main():
    file_path = ".\\img\\lnx"        # 文件夹路径,这里是用相对路径表示
    imgs = os.listdir(file_path)    # 获取文件夹所有的图片名称

    # 图片文件路径+图片名称拼接成完整的相对路径
    imgs_path = []
    for j,img in enumerate(imgs):
         imgs_path.append(os.path.join(file_path,img))


    gif_name = '1.gif'
    duration = 0.2       # 帧率 = 1/duration
    img_to_gif(imgs_path, gif_name, duration)   # 开始图片转GiF



if __name__ == '__main__':
    main()

  • 生成效果如下所示
图4.1.2 图片转GIF效果

4.2 视频生成Gif

  • 思路: 视频先转为图片,图片再生成GIF
  • 步骤1: 视频生成图片
# 作者:OpenCv机器视觉
# 时间:2023/1/4
# 功能:视频转图片

import cv2 as cv
import os


input_path= "1.mp4"
name =  os.path.splitext(input_path)[0]  # 文件名称
cap = cv.VideoCapture(input_path)

# 检查保存路径是否存在,如果不存在,则创建文件夹
if os.path.exists(name):
    pass
else:
    os.makedirs(name)


i = 0 # 图片编号初始值设置
while True:
    ret,frame = cap.read()
    i = i+1
    if i%3==0:  # 没3帧获取一张图片
        print(i)
        cv.imwrite(".\\"+name+"\\"+str(format(i, '04d'))+".jpg",frame)# 对图片进行保存



步骤2: 图片转Gif,与4.1相同



5.结尾

备注: 图片的读写、视频的读写都是图像处理最基础的一步,希望以上内容对大家有所帮助。同时因为个人能力有限,若存在不足之处,还请大家批评指正,愿与大家共同学习进步!
预告: 下一章节内容为:基于颜色空间的阈值分割,还有提供方便的滑动条进行目标识别例子,大家敬请期待!

6. 其他章节链接


1.理论系列:

第一章:pycharm、anaconda、opencv、pytorch、tensorflow、paddlex等环境配置大全总结【图像处理py版本】

第二章:OpenCv算法的基本介绍与应用

==》 第三章:OpenCv图片、视频读写操作与基本应用

第四章:OpenCv阈值分割/二值化(单通道、多通道图片)总结


2.项目系列:

项目一:四六级改卷系统
项目二:实战篇:粘连物体分割——利用几何分割实现瓶盖分割检测
项目三:实战篇:粘连物体分割——利用几何分割实现硬币分割检测
项目四:实战篇:粘连物体分割——利用几何分割实现细胞分割检测
项目五:实战篇:粘连物体分割——利用分水岭算法实现糖豆分割检测

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值