当前位置: 首页 > article >正文

告别VLC和浏览器:用Python+OpenCV实时处理mjpg-streamer视频流的三种方法

PythonOpenCV实时处理mjpg-streamer视频流的三种实战方案当我们需要从网络摄像头获取实时视频流进行计算机视觉处理时mjpg-streamer是一个非常轻量级且高效的选择。与直接使用VLC或浏览器查看不同通过Python编程获取视频流可以让我们实现更灵活的实时图像处理。下面介绍三种不同的方法每种方法都有其适用场景和性能特点。1. 准备工作与环境配置在开始之前确保你已经有一个运行中的mjpg-streamer服务器。通常可以通过以下命令启动./mjpg_streamer -i input_uvc.so -o output_http.so -w ./www默认情况下视频流可以通过http://[服务器IP]:8080/?actionstream访问。我们将使用这个URL作为示例。安装必要的Python库pip install opencv-python numpy requests2. 方法一使用OpenCV的VideoCapture这是最简单直接的方法适合快速原型开发。import cv2 stream_url http://192.168.1.100:8080/?actionstream cap cv2.VideoCapture(stream_url) while True: ret, frame cap.read() if not ret: print(无法获取帧尝试重新连接...) cap.release() cap cv2.VideoCapture(stream_url) continue # 在这里添加你的图像处理代码 processed_frame cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow(MJPG Stream, processed_frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()性能特点实现简单代码量少延迟较高通常在300-500ms内存占用中等断流后恢复能力较弱提示如果遇到连接问题可以尝试在URL后添加dummyparam绕过某些缓存问题。3. 方法二使用requests库直接处理MJPEG流这种方法提供了更底层的控制适合需要精确控制帧处理的场景。import requests import numpy as np import cv2 from io import BytesIO stream_url http://192.168.1.100:8080/?actionstream session requests.Session() response session.get(stream_url, streamTrue) bytes_buffer bytes() for chunk in response.iter_content(chunk_size1024): bytes_buffer chunk a bytes_buffer.find(b\xff\xd8) # JPEG开始标记 b bytes_buffer.find(b\xff\xd9) # JPEG结束标记 if a ! -1 and b ! -1: jpg_data bytes_buffer[a:b2] bytes_buffer bytes_buffer[b2:] try: frame cv2.imdecode(np.frombuffer(jpg_data, dtypenp.uint8), cv2.IMREAD_COLOR) if frame is not None: # 图像处理代码 processed_frame cv2.Canny(frame, 100, 200) cv2.imshow(Processed Stream, processed_frame) if cv2.waitKey(1) 0xFF ord(q): break except Exception as e: print(f帧处理错误: {e}) cv2.destroyAllWindows() session.close()性能对比特性OpenCV方法Requests方法延迟高中CPU使用率低中内存使用中低断流恢复能力弱强实现复杂度简单中等4. 方法三使用socket编程实现高效流处理对于需要最低延迟的应用可以使用原始socket连接import socket import numpy as np import cv2 import re class MJPGStreamer: def __init__(self, host, port8080): self.host host self.port port self.buffer b self.content_length 0 self.sock None def connect(self): self.sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.connect((self.host, self.port)) self.sock.sendall(bGET /?actionstream HTTP/1.1\r\n\r\n) def get_frame(self): while True: data self.sock.recv(4096) if not data: raise ConnectionError(连接中断) self.buffer data while True: # 查找JPEG开始标记 jpeg_start self.buffer.find(b\xff\xd8) if jpeg_start -1: break # 查找Content-Length头 header_end self.buffer.find(b\r\n\r\n) if header_end -1: break header self.buffer[:header_end].decode(utf-8) match re.search(rContent-Length: (\d), header) if not match: self.buffer self.buffer[jpeg_start:] break content_length int(match.group(1)) jpeg_end header_end 4 content_length if len(self.buffer) jpeg_end: break jpeg_data self.buffer[header_end4:jpeg_end] self.buffer self.buffer[jpeg_end:] try: frame cv2.imdecode(np.frombuffer(jpeg_data, dtypenp.uint8), cv2.IMREAD_COLOR) return frame except: continue return None # 使用示例 stream MJPGStreamer(192.168.1.100) stream.connect() while True: frame stream.get_frame() if frame is not None: # 图像处理 processed_frame cv2.resize(frame, (640, 480)) cv2.imshow(Socket Stream, processed_frame) if cv2.waitKey(1) 0xFF ord(q): break cv2.destroyAllWindows()三种方法的关键指标对比方法平均延迟(ms)CPU使用率(%)内存占用(MB)断流恢复适用场景OpenCV VideoCapture350-50015-2550-80差快速原型开发Requests库200-30025-4030-50好需要精细控制的场景Socket直接连接100-20030-5020-40优秀低延迟关键应用5. 实战优化技巧与常见问题解决在实际应用中你可能会遇到以下问题及解决方案1. 流中断处理def robust_stream_processing(): max_retries 5 retry_delay 1 # 秒 while True: try: # 初始化流连接 cap cv2.VideoCapture(stream_url) while True: ret, frame cap.read() if not ret: raise ConnectionError(帧读取失败) # 处理帧... except Exception as e: print(f错误发生: {e}) cap.release() if max_retries 0: print(达到最大重试次数退出) break print(f{retry_delay}秒后尝试重新连接...) time.sleep(retry_delay) max_retries - 12. 性能优化建议降低分辨率如果处理速度不够可以在获取流时降低分辨率帧跳过对于非实时关键应用可以每N帧处理一次多线程处理使用生产者-消费者模式分离帧获取和处理from threading import Thread from queue import Queue frame_queue Queue(maxsize10) def frame_producer(): cap cv2.VideoCapture(stream_url) while True: ret, frame cap.read() if ret: frame_queue.put(frame) def frame_consumer(): while True: frame frame_queue.get() # 处理帧... producer_thread Thread(targetframe_producer) consumer_thread Thread(targetframe_consumer) producer_thread.start() consumer_thread.start()3. 嵌入式设备上的特殊考虑在资源受限的嵌入式设备上运行时使用cv2.IMREAD_GRAYSCALE减少内存使用避免不必要的图像转换操作考虑使用imutils.resize保持宽高比的缩放对于树莓派等设备考虑使用picamera库直接获取流# 树莓派上的优化示例 from picamera.array import PiRGBArray from picamera import PiCamera import time camera PiCamera() camera.resolution (640, 480) camera.framerate 30 raw_capture PiRGBArray(camera, size(640, 480)) time.sleep(0.1) # 让相机预热 for frame in camera.capture_continuous(raw_capture, formatbgr, use_video_portTrue): image frame.array # 处理图像... raw_capture.truncate(0) # 清空流准备下一帧在实际项目中选择哪种方法取决于你的具体需求。如果需要快速验证想法OpenCV的VideoCapture是最简单的选择。如果需要更稳定的连接和更好的控制requests方法提供了良好的平衡。而对于延迟敏感的应用如无人机控制或机器人导航socket方法提供了最低的延迟。

相关文章:

告别VLC和浏览器:用Python+OpenCV实时处理mjpg-streamer视频流的三种方法

PythonOpenCV实时处理mjpg-streamer视频流的三种实战方案 当我们需要从网络摄像头获取实时视频流进行计算机视觉处理时,mjpg-streamer是一个非常轻量级且高效的选择。与直接使用VLC或浏览器查看不同,通过Python编程获取视频流可以让我们实现更灵活的实时…...

2026降AI率工具性价比比拼:SpeedAI凭实力突围

2026年毕业季临近,不少同学都在问:现在哪款降AI工具性价比最高?这个问题其实很难一概而论,毕竟“性价比”对不同人来说标准完全不同:有人觉得单价低就是性价比高,有人觉得功能全更重要,还有人只…...

颠覆性突破:如何在Windows上无缝运行Android应用的终极指南

颠覆性突破:如何在Windows上无缝运行Android应用的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾渴望在Windows电脑上直接运行心仪的And…...

如何高效配置云端视频播放:115proxy-for-kodi插件实战指南

如何高效配置云端视频播放:115proxy-for-kodi插件实战指南 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 想要在电视上直接播放115云盘中的高清视频,却苦于没有合…...

揭秘ComfyUI-SUPIR核心技术:从架构设计到实战调优的深度解析

揭秘ComfyUI-SUPIR核心技术:从架构设计到实战调优的深度解析 【免费下载链接】ComfyUI-SUPIR SUPIR upscaling wrapper for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-SUPIR ComfyUI-SUPIR作为ComfyUI生态中专业的图像超分辨率插件&…...

解锁云端影视:115proxy-for-kodi插件让电视直连云盘视频

解锁云端影视:115proxy-for-kodi插件让电视直连云盘视频 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 还在为电视无法直接播放115云盘中的影视资源而烦恼吗?今天…...

LinkBoy实战:用GD32驱动彩屏做动态小项目(植物生长、中国结动画源码解析)

GD32LinkBoy彩屏动画开发实战:从图形算法到动态效果优化 在嵌入式开发领域,将静态显示升级为生动动画是许多开发者向往的里程碑。GD32系列微控制器凭借其出色的性价比和丰富的外设接口,成为中小型可视化项目的理想选择。当搭配LinkBoy这一融合…...

别再乱用connect了!Qt信号槽传参的四种实战姿势(附代码避坑)

Qt信号槽传参的四种高阶用法与避坑指南 在开发复杂Qt桌面应用时,对象间的通信往往需要传递各种参数。看似简单的connect操作,实则暗藏玄机。我曾在一个多控件编辑器项目中,因为信号槽传参不当导致内存泄漏和性能问题,调试了整整三…...

手把手教你配置STM32 IAP跳转:从BootLoader关中断到APP开中断的完整流程

STM32 IAP跳转实战指南:从BootLoader到APP的中断管理全解析 引言 在嵌入式开发领域,IAP(In-Application Programming)技术为产品固件升级提供了极大便利,但其中的跳转过程却暗藏玄机。许多开发者第一次尝试实现STM32的…...

避坑指南:Windows下WhisperX安装全流程(解决cudnn.dll报错和HuggingFace连接超时)

Windows下WhisperX实战安装指南:从环境配置到语音转文字全流程 最近在折腾语音转文字工具时,发现WhisperX这个基于OpenAI Whisper的增强版项目确实让人眼前一亮。它不仅保留了原版的识别准确度,还通过批量推理和音素对齐等技术大幅提升了处理…...

物品申领审批发放管理系统

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 物品申领审批发放管理系统是一种小型办公软件,系统由ASPACCESS/MSSQL语言开发集成,适合各种单位在物品申领审批发放管理流程登记.后台可设管理员各种人员角色权限分配。 以下是系…...

如何为AndroidPdfViewer添加PDF打印功能:完整实现指南

如何为AndroidPdfViewer添加PDF打印功能:完整实现指南 【免费下载链接】AndroidPdfViewer Android view for displaying PDFs rendered with PdfiumAndroid 项目地址: https://gitcode.com/gh_mirrors/an/AndroidPdfViewer 你是否在为Android应用中集成PDF打…...

如何免费重置Navicat Premium试用期:macOS用户的终极解决方案

如何免费重置Navicat Premium试用期:macOS用户的终极解决方案 【免费下载链接】navicat-premium-reset-trial Reset macOS Navicat Premium 15/16/17 app remaining trial days 项目地址: https://gitcode.com/gh_mirrors/na/navicat-premium-reset-trial 你…...

SAP PO实战:手把手教你用Postman测试REST接口,搞定SLD到IB的完整配置流程

SAP PO实战:从SLD配置到Postman测试的REST接口全流程解析 当你第一次在SAP PO中配置REST接口时,是否遇到过这样的困惑:明明按照教程一步步配置了SLD、ESB和IB,却在最后用Postman测试时总是报错?本文将带你深入理解每个…...

避开华为PoE供电的5个大坑:配置了poe enable为啥设备还是不亮?一次讲清功率预留、优先级与兼容性检测

华为PoE供电实战避坑指南:从配置到排障的深度解析 凌晨三点,机房告警灯突然亮起——刚部署的无线AP集体离线,监控大屏瞬间黑了一半。这种场景对网络工程师来说绝不陌生,而问题往往出在最基础的PoE供电环节。明明按照手册配置了poe…...

解密6自由度KUKA机械臂的智能搬运实战:前沿工业自动化技术深度剖析

解密6自由度KUKA机械臂的智能搬运实战:前沿工业自动化技术深度剖析 【免费下载链接】pick-place-robot Object picking and stowing with a 6-DOF KUKA Robot using ROS 项目地址: https://gitcode.com/gh_mirrors/pi/pick-place-robot 在工业4.0浪潮中&…...

别被128TB吓到!深入浅出解读Linux /proc/kcore的ELF内存布局与物理内存映射

别被128TB吓到!深入浅出解读Linux /proc/kcore的ELF内存布局与物理内存映射 第一次在终端里敲下ls -lh /proc/kcore时,那个醒目的128TB文件大小确实让我倒吸一口凉气——我的硬盘总共才1TB,这玩意儿是怎么存在的?相信不少Linux开发…...

从刷题到实战:一文搞懂C/C++进制转换(含itoa、strtol、bitset函数避坑指南)

从刷题到实战:C/C进制转换全攻略与避坑指南 引言:为什么进制转换如此重要? 记得第一次参加技术面试时,面试官抛出一道看似简单的题目:"如何将十六进制的颜色代码转换为RGB值?"当时手忙脚乱的样子…...

终极Chrome书签管理指南:如何用树状结构告别混乱

终极Chrome书签管理指南:如何用树状结构告别混乱 【免费下载链接】neat-bookmarks A neat bookmarks tree popup extension for Chrome [DISCONTINUED] 项目地址: https://gitcode.com/gh_mirrors/ne/neat-bookmarks 你是否经常在数百个杂乱的书签中迷失方向…...

好写作AI:你的“学术方向盘”,让论文写作从“换工具”变成“换车道”

打开手机应用商店,搜索“AI写作”,你会看到上百个图标。 你一个个点开,发现有的工具擅长写营销文案,有的专攻英文润色,有的号称一键生成千字论文。你试了一个又一个,写出来的东西要么像通稿,要…...

家电工厂10人设计团队应用云飞云智能共享云桌面:从3D建模到模具开发的无缝衔接

一、制造业现有困境在家电制造行业,产品更新换代迅速,设计周期不断压缩,对设计团队的协作效率和创新能力提出了更高要求。对于10人规模的家电设计团队而言,如何实现从3D建模到模具开发的高效、无缝衔接,成为提升整体竞…...

深入C++浮点数取整:除了round和ceil,你还需要了解rint和nearbyint的隐藏玩法

深入C浮点数取整:除了round和ceil,你还需要了解rint和nearbyint的隐藏玩法 在量化交易策略回测中,一个看似简单的浮点数取整操作可能导致千分之一的基础误差被放大成百万级资金偏差。某对冲基金曾因使用round而非rint函数处理欧元/美元汇率转…...

从‘亚利桑那大学多项式’到Zemax实操:一文理清Zernike条纹多项式与标准多项式的区别与选用指南

从‘亚利桑那大学多项式’到Zemax实操:一文理清Zernike条纹多项式与标准多项式的区别与选用指南 在光学设计和波前分析领域,Zernike多项式就像是一把瑞士军刀,能够将复杂的波前畸变分解为一系列正交的基函数。但当你第一次打开Zemax的波前分析…...

qPCR实验翻车实录:从扩增曲线异常到熔解曲线双峰,我踩过的坑和填坑指南

qPCR实验翻车实录:从扩增曲线异常到熔解曲线双峰,我踩过的坑和填坑指南 凌晨三点的实验室,qPCR仪嗡嗡作响,屏幕上那条扭曲的扩增曲线仿佛在嘲笑我的徒劳。这是本周第三次重复实验,熔解曲线依然倔强地分裂成双峰。作为刚…...

告别SDR时代:手把手教你配置ONFI NV-DDR接口,让NAND Flash性能起飞

告别SDR时代:手把手教你配置ONFI NV-DDR接口,让NAND Flash性能起飞 在嵌入式存储领域,NAND Flash的性能瓶颈往往源于接口技术的滞后。当项目面临启动速度不足或数据吞吐量受限时,工程师们常发现传统SDR接口已成为系统性能的"…...

从陀螺仪漂移到位置修正:图解SINS精对准中的误差传递链

从陀螺仪漂移到位置修正:图解SINS精对准中的误差传递链 在自动驾驶和无人机领域,精确的导航系统是确保安全与性能的核心。想象一下,当你的设备在复杂环境中飞行或行驶时,一个微小的陀螺仪漂移如何像蝴蝶效应般最终导致显著的定位偏…...

蓝奏云直链解析架构解析:三步实现自动化文件获取的最佳实践

蓝奏云直链解析架构解析:三步实现自动化文件获取的最佳实践 【免费下载链接】LanzouAPI 蓝奏云直链,蓝奏api,蓝奏解析,蓝奏云解析API,蓝奏云带密码解析 项目地址: https://gitcode.com/gh_mirrors/la/LanzouAPI …...

3分钟掌握Windows和Office智能激活:KMS_VL_ALL_AIO完整指南

3分钟掌握Windows和Office智能激活:KMS_VL_ALL_AIO完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗?KMS_VL_ALL_AIO是一款开源免费…...

别再手动重启了!用Systemd守护你的Sentinel控制台(Linux Ubuntu/CentOS保姆级配置)

别再手动重启了!用Systemd守护你的Sentinel控制台(Linux Ubuntu/CentOS保姆级配置) 在分布式系统的世界里,服务的稳定性往往决定了业务的连续性。想象一下凌晨三点被报警叫醒,发现核心流量管控系统因为一个简单的进程崩…...

【成都信息工程大学主办 | 多主题征稿,涵盖深度学习、强化学习、自然语言处理等 | IEEE (CPS)出版,EI稳定检索】2026年人工智能与数据挖掘国际学术会议(AIDM 2026)

多主题征稿 | EI稳定检索 2026年人工智能与数据挖掘国际学术会议(AIDM 2026) 2026 International Conference on Artificial Intelligence and Data Mining 大会官网:www.ic-aidm.org【论文投稿】 截稿时间:见官网 大会时间…...