树莓派学习:学习opencv+用opencv获取树莓派mjpg摄像头视频流

目录

前提步骤

打开树莓派摄像头

查看是否有图像,登录游览器打开树莓派IP地址的8080端口

获取mjpg的视频流url

代码

先设定好mjpg的视频流的url

利用opencv库中的v2.VideoCapture类读取mjpg视频流   cv2.VideoCapture()

检查摄像头是否成功打开,如果没有,则打印错误消息并退出程序   cap.isOpened()

创建一个空的numpy数组    np.empty()

从视频中读取一帧图像    cap.read()

在窗口中显示图像输出    cv2.imshow

延时50毫秒,播放下一帧图像    cv2.waitKey

全部代码 

 将帧保存为图像   cv2.imwrite()

 读取图像  cv2.imread()    cv2.cvtColor

释放VideoCapture对象并关闭视频文件   cap.release()


前提步骤

  1. 树莓派可以用mjpg-streame库开启摄像头
  2. 安装好python

打开树莓派摄像头

  1. 进入mjpg库
    cd mjpg-streamer/mjpg-streamer-experimental
  2. 启动摄像头脚本
    ./start.sh 

查看是否有图像,登录游览器打开树莓派IP地址的8080端口

http://xxx.xxx.xxx.xxx:8080

获取mjpg的视频流url

点开stream,复制当前的网址(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

  • cv2.imshow接受两个参数:窗口的名称和要显示的图像
  • 窗口名称是'output',要显示的图像是变量output
    cv2.imshow('output', output)

延时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对象。

  • 34
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
谷歌翻译: 如果相机拍照而没有人注意到,它真的发生了吗?在本书中,我们将向您展示如何制作基于Raspberry Pi的相机系统,以便您可以捕获延时图像并通过WiFi查看,如果检测到运动则触发相机,甚至可以执行基本面部认可作为机器学习方法的介绍。 拿一个Raspberry Pi并添加一个相机模块,你就有了一个可编程相机。添加一些软件,您就可以开始进行有趣的监视和自动对象识别工作。将Pi激活为WiFi节点,您可以远距离完成所有这些美妙的事物。 一个好的监控系统不仅仅是拍照。它还应该将这些图片转化为可操作的信息,从而增加您的知识。现在可以在软件中轻松完成,我们将向您展示如何操作。 本书汇集了一系列小技巧 - 设置Pi相机,将Pi广播作为WiFi设备,增加时间流逝和运动检测和人脸识别,并在其上粘贴电池组,以便它可以在任何地方运行 - 创建便携式间谍相机。我们在“Find the Pi”派对比赛,在我们的实验室中实施隐私尊重的安全性,以及炫耀面部识别等现代技术的过程中使用了这些装备。其他用途可能包括监控鹿和野生动物,检查您的邮箱到达邮件,以及捕获自然事件或交通模式的延时序列。 我们的第一个项目是创建一个便携式“SpyPi”摄像机设备,通过WiFi广播图像而无需网络 - 您只需登录它即可查看摄像机看到的内容。它非常适合“寻找相机”狩猎挑战或独立安全。 第二个项目将涉及设置一个延时摄像头,可以进行简单的运动检测 - 非常适合监控位置。该系统将包括一周后自动删除旧图像。 第三个项目是为您的SpyPi添加面部检测和面部识别功能。在此过程中,您将了解这些项目结束时安装的工具和软件,以便您可以超越本书并探索其他机器学习方法。 所以抓住一个Pi,一个SD卡,一个USB摄像头和一个USB电池组,让我们走吧!
### 回答1: mjpg-streamer是一款开源的视频流获取工具,可以将摄像头视频流转换为MJPEG格式,并通过网络传输到其他设备上。它支持多种摄像头设备,包括USB摄像头、IP摄像头等。用户可以通过简单的命令行操作来启动mjpg-streamer,并在浏览器中查看视频流。mjpg-streamer还支持多种插件,可以实现视频流的录制、截图、图像处理等功能。 ### 回答2: mjpg-streamer是一个工具,它可以捕捉摄像头视频流并将其转换成MJPEG格式输出,可以用于做摄像头监控或者视频流媒体等应用。 首先,在Linux系统中安装mjpg-streamer软件包,可以使用命令“sudo apt-get install mjpg-streamer”进行安装。安装完成后,输入“mjpg-streamer -i input_uvc.so -o output_http.so -w /usr/local/share/mjpg-streamer/www”命令就可以启动mjpg-streamer工具。 其中,-i参数指定输入模块,这里我们使用input_uvc.so代表捕捉摄像头视频流;-o参数指定输出模块,这里使用output_http.so代表将捕捉的视频流通过HTTP协议输出;-w参数指定输出的网页路径,这里我们使用/usr/local/share/mjpg-streamer/www目录下的网页。 启动完成后,在浏览器地址栏输入“http://localhost:8080/”或者“http://<IP address>:8080/”就可以访问捕捉到的视频流页面,IP address为主机的IP地址。如果需要对摄像头进行配置,可以在网页上点击“控制”按钮进行配置。 通过mjpg-streamer获取视频流可以很方便地将摄像头视频流输出到网页上,提供给用户查看或者进行其他处理。但需要注意的是,mjpg-streamer只能处理MJPEG格式的视频流,如果需要处理其他格式的视频流需要使用其他工具。 ### 回答3: Mjpg-streamer是一种使用C语言编写的视频流媒体服务器,它可以将视频流传输到Web浏览器或其他客户端软件。为了使用mjpg-streamer获取视频流,您需要按照以下步骤进行操作: 第一步,安装mjpg-streamer软件。在Windows系统中,您可以从mjpg-streamer官方网站下载可执行文件或安装包。在Linux系统中,您可以使用包管理器进行安装,例如对于Debian和Ubuntu用户,可以在终端中运行以下命令:sudo apt-get install mjpg-streamer 第二步,在终端或命令行界面中启动mjpg-streamer。例如,在Linux系统中,您可以使用以下命令:mjpg_streamer -i input_device -o output_device。其中,“input_device”是您要使用的视频输入设备(例如摄像头),“output_device”是输出设备,例如“httpd”可以将视频流以HTTP协议传输到Web浏览器中。 第三步,在Web浏览器中打开视频流。在浏览器中,输入“http://localhost:8080/?action=stream”地址,其中8080是您在第二步中指定的端口号。如果一切正常,您应该能够在浏览器中看到实时视频流。 注意,使用mjpg-streamer获取视频流需要预先安装和配置所需的硬件和驱动程序。使用不同的输入设备可能需要不同的配置和命令行参数。此外,由于使用网络传输视频流,因此mjpg-streamer可能会产生较高的网络带宽和资源消耗。因此,您需要根据自己的需求和硬件配置进行适当调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值