树莓派学习:学习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对象。

你可能感兴趣的:(树莓派学习,python学习,opencv,学习)