【opencv 系列】第2章 图片&视频的读取和保存

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本章主要学习图片和视频的读取和保存

1. 图片

  1. 读取
    cv2.imread(img_path),img_path :图片路径
    img_path 不存在,不会报错,但返回的是None, 这一点其实挺坑的,需要业务上做判断.
  2. 显示
    cv2.imshow(img),img : 图片
    这种方式会一闪而过,需要结合 cv2.waitkey(0) 和 cv2.destroyAllwindows() 使用
    示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
  3. 灰度处理
    cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  4. 保存图片
    cv2.imwrite(img_path, img_new)
    img_path: 图片路径,img_new: 处理后的图片
    在这里插入图片描述

2.视频(读取摄像头、视频文件)

在这里插入图片描述

2.1 从摄像头读视频

  1. cv2.VideoCapture() 从摄像头获取视频流
  2. capture.get() 获取帧的属性
  3. capture.isOpened() 判断摄像头是否打开
  4. cv2.waitKey(20) & 0xFF == ord(‘q’) 键盘输入q退出
  5. cv2.waitKey(20) & 0xFF == ord(‘c’) 键盘输入c截取帧
  6. capture.release() 释放资源

2.2 从视频读取文件

其实没有本质区别
在这里插入图片描述

2.3 保存摄像头读取的视频

在这里插入图片描述

  1. 视频编码:
    fourcc = cv2.VideoWriter_fourcc(*‘XVID’)

  2. 灰度写入视频文件
    cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False)

2.4 图片的打开,读取和保存代码

# 1.导入库
import cv2
import argparse

# 2. 获取参数
parser = argparse.ArgumentParser()

# 3. 参加参数
parser.add_argument("img_input",help="read one image")
parser.add_argument("img_output",help="save the processed image")

# 4. 解析参数, 以字典形式保存参数和值
args = vars(parser.parse_args())

print(args)
# exit("=" * 100)
# 5. 加载图片
img = cv2.imread(args["img_input"])

# 6.处理: 灰度处理
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 7 保存图片
cv2.imwrite(args["img_output"],img_gray)

# 8 显示图片
cv2.imshow("Original Image", img)
cv2.imshow("Gray Image", img_gray)

# 9 等待
cv2.waitKey(0)

# 10 关闭窗口
cv2.destroyAllWindows()

启动命令

python demo1.py ../images/children.jpg ./1.jpg

在这里插入图片描述

2.5 摄像头的打开,读取和保存代码

自己看代码把,写的都很清楚.

# 从摄像头读取
import cv2
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("index_camera",help="the camera ID", type=int)
args = parser.parse_args()
# 视频捕获
##
##capture = cv2.VideoCapture(args.index_camera)
## [ WARN:0@2.521] global D:\a\opencv-python\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (539) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback
##
# 方法二:(仅适用于Windows操作系统)

# 打开cmd并输入:

# setx OPENCV_VIDEOIO_PRIORITY_MSMF 0 
## 这两个方法并不好使
capture = cv2.VideoCapture(0, args.index_camera)
# 帧的宽度
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
# 帧的高度
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
# 每秒的帧数
fps = capture.get(cv2.CAP_PROP_FPS)
print("frame width:{}".format(frame_width))
print("frame height:{}".format(frame_height))
print("frames per second:{}".format(fps))

if capture.isOpened() is False:
    print("Error Camera !")


# 读取视频直到关闭

while capture.isOpened():
    # 通过摄像头,一帧一帧捕获
    ret, frame = capture.read()
    if  ret is True:
        # 显示捕获的帧
        cv2.imshow("frame", frame)
        # 将捕获的帧转化为灰度帧
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 显示灰度帧
        cv2.imshow("gray frame", gray_frame)
        # 键盘输入q, 退出视频捕获
        # if cv2.waitKey(20) & 0xFF == ord("q"):
        #     break
        # if cv2.waitKey(20) & 0xFF == ord("q"):
        #     break
        key_pressed = cv2.waitKey(100)
        print('单机窗口,输入按键,电脑按键为',key_pressed,'按esc键结束')
        if key_pressed == 27:
            break

    else:
        break
# 释放
capture.release()
cv2.destroyAllWindows()

2.6 从文件读取

# 1. 记载库
import cv2
import argparse

# 2 获取参数
parser = argparse.ArgumentParser()

# 3 添加参数
parser.add_argument("video_path", help="the path to the video file")

# 4 解析参数
args = parser.parse_args()

# 5 加载视频文件
capture = cv2.VideoCapture(args.video_path)



# 6 读取视频
ret, frame = capture.read() # ret 是否读取到了帧(图片)

while ret:
    cv2.imshow("video", frame)
    ret, frame = capture.read() # 继续读取帧
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break

capture.release()
cv2.destroyAllWindows() # 关闭

2.5 和 2.6 很相似

2.6 从视频读取,再保存回视频

和前面的代码很相似,但要写入视频
只有这两部增加了


# 8 对视频进行编码
fourcc = cv2.VideoWriter_fourcc(*"XVID")
output_gray = cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False)

# 10 将读取到的帧转换为灰度
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 11 将转换后的帧写入都新的视频文件中
    output_gray.write(gray_frame)

完整代码

# 1 导入库
import cv2
import argparse

# 2 获取参数
parser = argparse.ArgumentParser()

# 3 添加参数
parser.add_argument("video_output", help="the path to the output video")

# 4 解析参数
args = parser.parse_args()

# 5 捕获摄像头
capture = cv2.VideoCapture(0)

# 6 是否打开了摄像头
if capture.isOpened() is False:
    print("Camera Error !")

# 7 获取帧的属性:宽,高,以及fps
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH) # 宽
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT) # 高
fps = capture.get(cv2.CAP_PROP_FPS)

# 8 对视频进行编码
fourcc = cv2.VideoWriter_fourcc(*"XVID")
output_gray = cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False)

# 9 读取摄像头
while capture.isOpened():
    ret, frame = capture.read() # 一帧一帧地读取
    if ret is True:
        # 10 将读取到的帧转换为灰度
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 11 将转换后的帧写入都新的视频文件中
        output_gray.write(gray_frame)
        # 12 显示视频
        cv2.imshow("gray", gray_frame)
        # 13 等待或按q退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# 14 释放资源
capture.release()
output_gray.release()
cv2.destroyAllWindows()

总结

其实读取视频这些很有用,比如从摄像头读取,可能给的是一个rstmp的地址流, 从视频流读取, 抽帧,再送入模型做识别,在报警. 这个时候就需要读取视频/抽帧这个服务常驻和读取识别的时候能够自充起, python的opencv在这方面有劣势,很多错误报不出来, c++版本的好一些, ffmeg更好,需要c++的功底.
git地址:https://github.com/justinge/opencv_tutorial.git

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、主要内容:OpenCV能够实现强大丰富的图像处理,但是它缺少一个能够支持它运行的界面。Csharp经过多年的发展,得益于它的“所见及所得”能力,非常方便编写界面。这两者如果能够“双剑合璧”,将有效帮助实际工作产出。本课着重推荐GOCW采用“Csharp基于CLR直接调用Opencv编写的算法库”方法,能够将最新的OpenCV技术引入进来,同时保证生成程序的最小化。    为了进一步说明Csharp和OpenCV的结合使用,首先一个较为完整的基于winform实现答题卡识别的例子,相比较之前的实现,本次进一步贴近生产实际、内涵丰富,对算法也进行了进一步提炼。同时我们对WPF下对OpenCV函数的调用、OpenCV.js的调用进行相关教授。       二、课程结构1、 EmguCV、OpenCVSharp和GOCW之间进行比较(方便代码编写、能够融入最新的算法、速度有保障、方便调试找错、拒绝黑箱化);2、视频采集模块的构建,视频采集和图像处理之间的关系;3、视频采集专用的SDK和“陪练”系统的介绍;4、在视频增强类项目中和图像处理项目中,算法的选择;5、Csharp界面设计、图片的存储和其他构建设计;6、较为完整的答题卡识别例子,兼顾界面设计和算法分析;8、WPF基于GOCW也同样可以基于GOCW实现算法调用;webForm虽然也可以通过类似方法调用,但是OpenCV.JS的方法更现代高效。9、关于软件部署的相关要点和窍门。       三、知识要点:1、基本环境构建和程序框架;2、CLR基本原理和应用方法;3、接入、采集、模拟输入;4、图像处理,通过构建循环采集图片;5、增强和实时处理;6、基于投影等技术的答题卡识别算法;7、存储、转换;8、部署交付。        课程能够帮助你掌握Csharp调用Opencv的基本方法,获得相应框架代码和指导;从而进一步提升实现“基于图像处理”的解决方案能力。  

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值