Python调用手机摄像头检测火焰烟雾的三种方法

news2025/4/1 23:38:42

方法1:使用IP摄像头应用 + OpenCV

1. 在手机上安装IP摄像头应用(如IP Webcam for Android)

2. 配置应用并启动服务器

3. 在Python中使用OpenCV连接

import cv2

import numpy as np

# 手机IP摄像头URL(替换为你的手机IP和端口)

url = "http://192.168.x.x:8080/video"

# 连接摄像头

cap = cv2.VideoCapture(url)

while True:

    ret, frame = cap.read()

    if not ret:

        print("无法获取视频流")

        break

    # 转换为HSV颜色空间(火焰和烟雾检测常用)

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    

    # 火焰颜色范围(HSV)

    lower_flame = np.array([0, 100, 100])

    upper_flame = np.array([30, 255, 255])

    

    # 烟雾颜色范围(可能需要调整)

    lower_smoke = np.array([0, 0, 100])

    upper_smoke = np.array([180, 50, 200])

    

    # 创建火焰和烟雾的掩膜

    flame_mask = cv2.inRange(hsv, lower_flame, upper_flame)

    smoke_mask = cv2.inRange(hsv, lower_smoke, upper_smoke)

    

    # 检测火焰

    flame_pixels = cv2.countNonZero(flame_mask)

    if flame_pixels > 1000: # 阈值可根据实际情况调整

        cv2.putText(frame, "FLAME DETECTED!", (10, 30), 

                   cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    

    # 检测烟雾

    smoke_pixels = cv2.countNonZero(smoke_mask)

    if smoke_pixels > 1000: # 阈值可根据实际情况调整

        cv2.putText(frame, "SMOKE DETECTED!", (10, 70), 

                   cv2.FONT_HERSHEY_SIMPLEX, 1, (150, 150, 150), 2)

    

    # 显示结果

    cv2.imshow('Fire and Smoke Detection', frame)

    

    if cv2.waitKey(1) & 0xFF == ord('q'):

        break

 

cap.release()

cv2.destroyAllWindows()

 

方法2:使用DroidCam + Python

1. 在手机和电脑上安装DroidCam

2. 连接后使用类似上面的OpenCV代码处理视频流

方法3:使用更高级的深度学习模型

对于更准确的检测,可以使用预训练的深度学习模型:

import cv2

import numpy as np

from tensorflow.keras.models import load_model

 

# 加载预训练模型(需要先训练或下载合适的模型)

model = load_model('fire_smoke_detection_model.h5')

 

# 连接摄像头(同上)

cap = cv2.VideoCapture("http://192.168.x.x:8080/video")

 

while True:

    ret, frame = cap.read()

    if not ret:

        break

    

    # 预处理图像

    resized = cv2.resize(frame, (224, 224))

    normalized = resized / 255.0

    input_img = np.expand_dims(normalized, axis=0)

    

    # 预测

    predictions = model.predict(input_img)

    fire_prob, smoke_prob = predictions[0]

    

    # 显示结果

    if fire_prob > 0.7:

        cv2.putText(frame, f"FIRE: {fire_prob:.2f}", (10, 30), 

                   cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    if smoke_prob > 0.7:

        cv2.putText(frame, f"SMOKE: {smoke_prob:.2f}", (10, 70), 

                   cv2.FONT_HERSHEY_SIMPLEX, 1, (150, 150, 150), 2)

    

    cv2.imshow('Detection', frame)

    

    if cv2.waitKey(1) == ord('q'):

        break

 

cap.release()

cv2.destroyAllWindows()

 

 注意事项:

1. 颜色阈值:火焰和烟雾的颜色范围可能需要根据实际环境调整

2. 性能优化:在手机上实时处理可能需要降低分辨率或帧率

3. 网络延迟:Wi-Fi连接质量会影响实时性

4. 准确率:简单颜色检测误报率高,深度学习模型更准确但需要更多资源

5. 光线条件:检测效果受环境光线影响较大

 

进阶改进方向:

1. 使用背景减除技术提高烟雾检测准确率

2. 结合运动检测减少误报

3. 使用YOLO或MobileNet等轻量级目标检测模型

4. 添加报警功能(声音、通知等)

5. 实现云存储检测记录

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2324981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python if else while for 学习笔记

一.if,else if语句用于根据条件执行代码块 else语句可与if语句结合,当if判断为假时执行else语句 x10 if x>5:print("x大于5") y3 if y>5:print("y大于5") else:print("y小于等于5")结果: 二.while循环…

正则化是什么?

正则化(Regularization)是机器学习中用于防止模型过拟合(Overfitting)的一种技术,通过在模型训练过程中引入额外的约束或惩罚项,降低模型的复杂度,从而提高其泛化能力(即在未见数据上…

搜索-BFS

马上蓝桥杯了,最近刷了广搜,感觉挺有意思的,广搜题类型都差不多,模板也一样,大家写的时候可以直接套模板 这里给大家讲一个比较经典的广搜题-迷宫 题目问问能否走到 (n,m) 位置,假设最后一个点是我们的&…

《边缘计算风云录:FPGA与MCU的算力之争》

点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章:边城烽烟——数据洪流压境****第二章:寒铁剑匣——FPGA的千机变****第三章:枯木禅杖——MCU的至简道****第四章:双生契…

R-GCN-Modeling Relational Data with GraphConvolutional Networks(论文笔记)

CCF等级:B 发布时间:2018年6月 25年3月31日交 目录 一、简介 二、原理 1.整体 2.信息交换与更新 2.1基分解 2.2块对角矩阵 3.实体分类或链接预测 3.1实体分类 3.2链接预测 三、结论和未来工作 一、简介 RGCN通过允许不同关系类型之间的信息…

【C++初阶】----模板初阶

1.泛型函数 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。 2.函数模板 2.1函数模板的概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型…

Pycharm(七):几个简单案例

一.剪刀石头布 需求:和电脑玩剪刀石头布游戏 考察点:1.随机数;2.判断语句 import random # numrandom.randint(1,3) # print(num) # print(**30) #1.录入玩家手势 playerint(input(请输入手势:(1.剪刀 2.石头 3&…

gnvm切换node版本号

1. gnvm下载官网 GNVM - Node.js version manager on Windows by Go 2. 安装 2.1 不存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到任意文件夹,并将此文件夹加入到环境变量 Path。 2.2 存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到 Node.js 所在的文件夹。 2.…

PyTorch 深度学习实战(29):目标检测与 YOLOv12 实战

在上一篇文章中,我们探讨了对比学习与自监督表示学习。本文将深入计算机视觉的核心任务之一——目标检测,重点介绍最新的 YOLOv12 (You Only Look Once v12) 算法。我们将使用 PyTorch 实现 YOLOv12 模型,并在 COCO 数据集上进行训练和评估。…

【区块链安全 | 第五篇】DeFi概念详解

文章目录 DeFi1. DeFi 生态概览2. 去中心化交易所(DEX)2.1 AMM(自动做市商)模型2.2 订单簿模式(现货交易) 3. 借贷协议3.1 Aave3.2 使用闪电贷(Flash Loan) 4. 稳定币(St…

【初探数据结构】归并排序与计数排序的序曲

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习! 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对数据结构感…

基于ruoyi快速开发平台搭建----超市仓库管理(修改记录1)

一、数据库的设计一定注意不要用关键字 数据库是同学设计的,但是在实践过程中,发现,生成的代码一直报错,结果发现数据库里面商品表里面的商品类别竟然设置成class, 注意:: class 是 Java 中的关键字&…

Springboot学习笔记3.20

目录 1.实战篇第一课 我们将会在本次实战中学习到哪些知识点? 开发模式和环境搭建: 注册接口 1.Lombok 2.开发流程 1.controller层,这个层会指明访问路径和要执行的逻辑: 2.我们把返回结果根据接口文档包装成一个类result&a…

Ubuntu和Windows实现文件互传

1.开启Ubuntu下的FTP服务: (1)终端输入: sudo apt-get install vsftpd(2)安装完成后: 终端输入: /etc 是 Linux 系统的全局配置文件目录,存储系统和应用程序的配置信息…

java面向对象从入门到入土

面向对象进阶 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 重点学习:学习已有对象并使用,学习如何自己设计对象并使用 设计对…

linux ACL权限控制之用户权限控制程序设计

linux中的ACL(Access Control List,访问控制列表)是一种比传统UNIX权限更细粒度的权限控制机制,允许为文件和目录设置更为具体的用户和组权限。本文介绍使用acl命令和程序api对文件进行更精细的用户权限控制。 1. 命令行示例 使…

Java多线程与JConsole实践:从线程状态到性能优化!!!

目录 一、前言二、JConsole 使用教程二、线程的基本状态2.1新建状态(New)2.2就绪状态(Ready)2.3运行状态(Running)2.4 阻塞状态(Blocked)2.5. 等待状态(Waiting&#xff…

Stable Diffusion vue本地api接口对接,模型切换, ai功能集成开源项目 ollama-chat-ui-vue

1.开启Stable Diffusion的api服务 编辑webui-user.bat 添加 –api 开启api服务,然后保存启动就可以了 2.api 文档地址 http://127.0.0.1:7860/docs3. 文生图 接口 地址 /sdapi/v1/txt2img //post 请求入参 {enable_hr: false, // 开启高清hrdenoising_stre…

第十四届蓝桥杯真题(PWM输出)

一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹&#…

【Qt】ffmpeg编码—存储(H264)

目录 一、编码分析 1.解码线程: ​编辑2.编码线程: ​编辑 ​编辑 二、ffmpeg编码 1.注册所有组件 2.编码初始化函数 (2)打开视频流 4.查找编码器 5. 写文件头信息,写到formatContex中 6.发送一帧数据给编码器…