利用opencv库中的v2.VideoCapture类读取mjpg视频流 cv2.VideoCapture()
检查摄像头是否成功打开,如果没有,则打印错误消息并退出程序 cap.isOpened()
读取图像 cv2.imread() cv2.cvtColor
释放VideoCapture对象并关闭视频文件 cap.release()
前提步骤
打开树莓派摄像头
查看是否有图像,登录游览器打开树莓派IP地址的8080端口
http://xxx.xxx.xxx.xxx:8080
获取mjpg的视频流url
http://xxx.xxx.xxx.xxx:8080/?action=stream
代码
先设定好mjpg的视频流的url
ip_address = '172.20.10.14'
port_number = 8080
url = f'http://{ip_address}:{port_number}/?action=stream'
利用opencv库中的v2.VideoCapture类读取mjpg视频流 cv2.VideoCapture()
- 使用cv2.VideoCapture类的一个实例,可以通过传入摄像头设备ID或视频文件路径来连接摄像头或读取视频文件。例如,cv2.VideoCapture(0)表示打开笔记本的内置摄像头,cv2.VideoCapture(“..test.avi“)表示打开指定路径的视频文件。
cap = cv2.VideoCapture(f'http://{ip_address}:{port_number}/?action=stream')
检查摄像头是否成功打开,如果没有,则打印错误消息并退出程序 cap.isOpened()
cap.isOpened()
是OpenCV中VideoCapture
类的一个函数,用于检查视频是否成功打开。如果返回值为True,表示视频已经成功打开,反之则没有成功打开。if not cap.isOpened(): print("无法打开摄像头") exit()
创建一个空的numpy数组 np.empty()
- 得到一个240行,320列,3个通道(颜色通道)的数组,每个元素都是一个无符号8位整数(0-255)。
- 该数组的形状为(240, 320, 3),并且数据类型为
np.uint8。
- 用于存储图像数据。许多图像格式(例如RGB)都有三个颜色通道,因此这个数组可以用于存储图像数据。
- 在使用这个数组时,你可以像处理其他numpy数组一样处理它。
# 创建一个空的numpy数组output来存储图像数据 output = np.empty((240, 320, 3), dtype=np.uint8)
从视频中读取一帧图像 cap.read()
cap.read()
是 OpenCV 中VideoCapture
类的函数- 该函数返回一个布尔值(True/False)以及一个帧图像。如果帧读取正确,则返回 True,否则返回 False。
ret
表示读取帧是否正确,frame
则是当前帧的图像。如果ret
为 True,则可以处理frame
图像;如果ret
为 False,则表明视频已经读取完毕。ret, frame = cap.read()
在窗口中显示图像输出 cv2.imshow
延时50毫秒,播放下一帧图像 cv2.waitKey
cv2.waitKey
是 OpenCV 的一个函数,用于等待并处理键盘事件。50
是等待的毫秒数。这意味着如果用户在 50 毫秒内没有按任何键,则函数会返回当前活动的热键。否则,如果有按键被按下,它会被立即返回cv2.waitKey(50)
全部代码
import cv2
import numpy as np
ip_address = '172.20.10.14'
port_number = 8080
cap = cv2.VideoCapture(f'http://{ip_address}:{port_number}/?action=stream')
if not cap.isOpened():
print("无法打开摄像头")
exit()
output = np.empty((240, 320, 3), dtype=np.uint8)
while True:
ret, output = cap.read()
cv2.imshow('output', output)
cv2.waitKey(50)
将帧保存为图像 cv2.imwrite()
cv2.imwrite()
是 OpenCV 库中的一个函数- 用于将图像写入文件
- 两个参数:输出文件名和要写入的图像。
- 使用
cv2.imwrite()
将img
写入名为 “image.jpg” 的文件中。cv2.imwrite("capture.jpg", output)
读取图像 cv2.imread()
cv2.cvtColor
cv2.imread()
是 OpenCV 库中的一个函数- 用于读取图像文件
- 一个参数,即要读取的图像文件的路径
- 如果图像文件不存在或无法读取,
cv2.imread()
将返回 None。如果图像文件存在并成功读取,则将返回一个 NumPy 数组,其中包含图像的像素值。 cv2.imread()
函数默认使用 BGR 颜色空间,而非 RGB 颜色空间。- 如果需要在处理图像时使用 RGB 颜色空间,可以使用
cv2.cvtColor()
函数将 BGR 图像转换为 RGB 图像。
img = cv2.imread('input.jpg')
#如果是BGR图像
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_rgb
是通过将img
从 BGR 颜色空间转换为 RGB 颜色空间得到的。在 OpenCV 中,图像的默认格式是 BGR,而大多数其他图像处理库(如 Python 的 PIL 或 matplotlib)使用 RGB 颜色空间。因此,如果你需要在这些库中处理 OpenCV 图像,可能需要进行颜色空间的转换。mg_rgb
通常指的是 RGB 图像,而img
通常指的是 BGR 图像。虽然它们在数值上是一样的(因为它们表示的是同一幅图像的像素值),但在处理图像时,使用哪个变量取决于你的需求。例如,如果你需要将图像显示在 matplotlib 中,你可能需要使用img_rgb
。如果你需要处理图像的颜色通道顺序,你可能需要使用img
。- 总的来说,虽然
img_rgb
和img
在数值上相同,但它们的使用和语义上有一些区别。
释放VideoCapture对象并关闭视频文件 cap.release()
cap.release()
是OpenCV库中的一个函数- 用于释放VideoCapture对象并关闭视频文件
- 使用
cv2.VideoCapture()
创建一个VideoCapture对象后,这个对象会占用视频文件的相关资源,比如文件句柄、内存等。当你完成视频的读取后,应该调用cap.release()
释放这些资源,以避免资源泄漏和占用。# 释放VideoCapture对象并关闭视频文件 cap.release()
- 在调用
cap.release()
后,你不能再使用cap
对象,否则会抛出异常。如果你需要再次读取视频文件,应该重新创建一个新的VideoCapture对象。
原文地址:https://blog.csdn.net/weixin_59669309/article/details/134792026
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_47966.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。