树莓派学习:学习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()
前提步骤
- 树莓派可以用mjpg-streame库开启摄像头
- 安装好python
打开树莓派摄像头
- 进入mjpg库
cd mjpg-streamer/mjpg-streamer-experimental - 启动摄像头脚本
./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 npip_address = '172.20.10.14'
port_number = 8080cap = 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对象。
相关文章:
树莓派学习:学习opencv+用opencv获取树莓派mjpg摄像头视频流
目录 前提步骤 打开树莓派摄像头 查看是否有图像,登录游览器打开树莓派IP地址的8080端口 获取mjpg的视频流url 代码 先设定好mjpg的视频流的url 利用opencv库中的v2.VideoCapture类读取mjpg视频流 cv2.VideoCapture() 检查摄像头是否成功打开,…...
探索Playwright的现代自动化测试力量
在当今数字化时代,Web应用程序的质量和稳定性对于企业的成功至关重要。为了确保Web应用程序的无缝运行,自动化测试工具成为了开发人员和测试团队的重要工具。多年来,Selenium一直是自动化测试的黄金标准,然而,在不久前…...
游戏mod制作--引擎与解包
摘要 游戏mod的制作过程第一步就是需要将原始的游戏工程文件进行解包,得到相应的资源文件(贴图,音频,事件,模型甚至源代码等),这个时候下一步就是需要将解包出来的文件进行分类索引,…...
3D模型制作木质纹理贴图
在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 本文将讲解如何使用GLTF 编辑器 -NSDT 在线材质编辑工具为3D模型设置…...
[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-4线性时不变系统中的冲激响应与卷积
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-数学基础Ch0-4线性时不变系统中的冲激响应与卷积 1. LIT System:Linear Time Invariant2. 卷积 Convolution3. 单位冲激 Unit Impulse——Dirac Delta 线性时不变系统 : L…...
CSS BFC特性和应用
目录 1,介绍2,BFC布局规则3,创建BFC4,BFC应用1,浮动子元素使父级高度坍塌2,非浮动元素被浮动元素覆盖3,margin 合并1,父子 margin 合并:父级和第1个/最后1个子元素2&…...
软件工程 - 第8章 面向对象建模 - 3 - 动态建模
状态图 状态是指在对象生命周期中满足某些条件、执行某些活动或等待某些事件的一个条件和状况 。 案例一:描述烧水器在工作时的详细行为细节 “人就是一个类,而你”、我”、张三”等都是“人这个类的一个实例,站着”、“躺着等都是对象的一…...
Stable Diffusion AI绘画系列【16】:霸气侧漏的二次元武侠风
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...
第二证券:苹果市值重返3万亿美元,关键因素并非人工智能
当地时间12月5日,到美股收盘,苹果公司股价收涨2.1%,报193.42美元,收盘市值重返3万亿美元上方。 上一年12月,苹果公司市值曾在盘中时间短触及3万亿门槛,但收盘并未站稳,本年6月收盘时正式打破3万…...
西南科技大学C++程序设计实验六( 继承与派生一)
一、实验目的 1. 理解不同继承属性对派生类访问基类成员的区别 2. 掌握单继承程序编写 二、实验任务 1、调试下列程序,并在对程序进行修改后再调试,指出调试中的出错原因(该题中A为基类,B为派生类,B以public方式继承A) 重点:理解不同继承方式数据的访问权限,派生类…...
MySQL 性能优化
未完待续... 1. 分库、分表结构优化 1.1 数据库设计 不规范的数据库设计存在数据冗余以及插入、更新、删除异常问题。 规范化(Normalization)是数据库设计的一系列原理和技术,主要用于减少表中数据的冗余,增加完整性和一致性&…...
求职招聘小程序源码系统 全开源源代码:找工作+招人才 平台级别运营版 附带完整的搭建教程
在当前的求职招聘市场中,尽管存在大量的求职者和招聘者,但依然存在着信息不对称、沟通不畅等问题。小编来给大家分享一款求职招聘小程序源码系统,旨在提供一个高效、便捷、安全的求职招聘平台。 以下是部分代码示例: 系统特色功能…...
26、卷积 - 实际上是一个特征提取器
矩阵乘法的本质是特征的融合,卷积算法的本质是特征的提取。 回想一下之前所有介绍卷积的时候,描述了一种卷积运算的场景,那就是一个窗口在图片上滑动,窗口中的数值是卷积核的参数,也就是权值。 卷积的计算本质是乘累…...
web前端之vue3
MENU vue3响应式数据的判断、isRef、isReactive、isReadonly、isProxy、ref、reactive、readonlyvue3的生命周期vue3手写isRef、isReactive、isReadonly、isProxyvue3手写ref、深的refvue3手写shallowRef、浅的refvue3customRefvue3readonly与shallowReadonlyvue3toRaw与markRa…...
原来在C++的类中声明函数时可以不写参数名只写参数类型
2023年12月6日,周三上午 今天才发现原来可以这样写 在C的类中声明函数时可以不写参数名只写参数类型, 但是,在实现时必须写出参数名。 #include<iostream>class People { public:void move(int);void say(std::string);void doSomet…...
独孤思维:这里有蓝海项目,你要吗?
很多人,一看到蓝海项目,就趋之若鹜。 觉得红海项目太卷了,根本赚不到钱。 凡是认为蓝海项目不卷,可以做起来,做的轻松的,都是弱智和无能的表现。 你所能接触到的蓝海,根本就不是蓝海。 能够…...
外卖平台推荐算法的优化与实践
目录 引言 一、推荐算法的原理 二、推荐算法的挑战 三、实际案例分析 四、优化推荐算法的策略 五、结论 引言 在当今数字化社会,外卖平台成为了人们生活中不可或缺的一部分。为了提供更加个性化、高效的服务,外卖平台使用推荐算法成为了一项关键技…...
CONTROLLING VISION-LANGUAGE MODELS FOR MULTI-TASK IMAGE RESTORATION
CONTROLLING VISION-LANGUAGE MODELS FOR MULTI-TASK IMAGE RESTORATION (Paper reading) Ziwei Luo, Uppsala University, ICLR under review(6663), Cited:None, Stars: 350, Code, Paper. 1. 前言 像CLIP这样的视觉语言模型已经显示出对零样本或无标签预测的各种下游任务…...
HarmonyOS应用开发——页面
我们将对于多页面以及更多有趣的功能展开叙述,这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式(UiAbility),样式的书写、状态管理以及动画等方面进行探讨 页面之间…...
Java流Stream使用详解(练习)
练习 第一题 数据过滤 定义一个集合,并添加一些整数1,2,3,4,5,6,7,8,9,10过滤奇数,只留下偶数,并将结果保存起来 import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
