picamera配opencv做发现移动物体后录像50秒

news2024/11/15 6:44:47

本来是想配合上一篇写的测距传感器数据打开摄像头录制个50秒实时画面,后来这个测距传感器(因为我是歪用,用来识别范围内的移动物体)给的数据,false alarming还是太高了。于是想到使用本人之前深恶痛绝的opencv来试一试。

很多时候,养寄居蟹就是养一盆土。大概如下吧。

所以也就有动静的时候,偷摸观察下是比较不错的。下面就是自研的小动静侦测录像代码,真是累死。基本就是自己试出来的,采用的数值可以算是一个时间序列上的二次导了吧,表达画面变化的变化速率(只是单位时间不是1秒而已)。

实时拍摄的里面截取了3秒,一起找找寄居蟹,

代码实现如下,文件结构

.
├── output
└── save_key_events.py

2024-05-25: 加了画面带datetime overlay的。

from picamera2 import Picamera2,MappedArray
from picamera2.encoders import H264Encoder
from picamera2.outputs import FileOutput,FfmpegOutput

import time
import cv2
import numpy as np

colour=(120,230,30)
origin=(0,30)
font=cv2.FONT_HERSHEY_SIMPLEX
scale=1
thickness=1
picam2 =Picamera2()
picam2.configure(picam2.create_video_configuration(main={"size": (640,480)}))

def apply_timestamp(request):
    timestamp = time.strftime("%Y%m%d_%H:%M:%S")
    with MappedArray(request,"main") as m:
        cv2.putText(m.array,timestamp,origin,font,scale,colour,thickness)


picam2.pre_callback = apply_timestamp
encoder = H264Encoder()

picam2.start()
print("[INFO] warming up camera...")
t = 0
for t in [0,30]:
    t = t + 1
    time.sleep(1)
print("Ready to go!")
last_mean = 0
skip_flag = 0

try:
    while True:
        if skip_flag > 0: #实际的观测发现,即便撤去画面中模拟的道具,这个二阶比值change_velocity还会有一些不稳定。
            skip_flag = skip_flag - 1
            time.sleep(20)
        frame = picam2.capture_array()
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        current_mean = np.mean(gray)
        current_result = np.abs(current_mean - last_mean)

        if last_mean != 0 :
            change_velocity = min(current_result,previous_result) / max(current_result,previous_result)
            print(change_velocity)
            if change_velocity < 0.6 and change_velocity > 0.1 and skip_flag in [0,3]:
                now = time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
                if skip_flag == 3:
                    now = "csc_" + now
                fname = "./output/" + now + ".mp4"
                output_file = FfmpegOutput(fname)
                picam2.start_recording(encoder,output=output_file)
                time.sleep(50)
                picam2.stop_recording()
                last_mean = current_mean
                if skip_flag == 0:
                    skip_flag = 4
        if last_mean == 0:
            last_mean = current_mean
        previous_result = current_result
        time.sleep(10)
        picam2.start()
except KeyboardInterrupt:
    picam2.stop_recording()
    cv2.destroyAllWindows()

finally:
    # do a bit of cleanup
    picam2.stop_recording()

最后抄来一个bash控制文件夹大小,删旧文件的。用crontab每隔15分钟,弄一次。

#!/bin/bash
#Usage = sh limit-directory-size.sh /media/computer/mypartition 80 4 ("/media/computer/mypartition" = the directory to be limited / "88"=the percentage of the total partition this directory is allowed to use / "120"=the number of files to be deleted every time the script loops (while $Directory_Percentage > $Max_Directory_Percentage)

#Directory to limit
Watched_Directory=$1
echo "Directory to limit="$Watched_Directory

#Percentage of partition this directory is allowed to use
Max_Directory_Percentage=$2
echo "Percentage of partition this directory is allowed to use="$Max_Directory_Percentage

#Current size of this directory
Directory_Size=$( du -sk "$Watched_Directory" | cut -f1 )
echo "Current size of this directory="$Directory_Size

#Total space of the partition = Used+Available
Disk_Size=$(( $(df $Watched_Directory | tail -n 1 | awk '{print $3}')+$(df $Watched_Directory | tail -n 1 | awk '{print $4}') ))
echo "Total space of the partition="$Disk_Size

#Curent percentage used by the directory
Directory_Percentage=$(echo "scale=2;100*$Directory_Size/$Disk_Size+0.5" | bc | awk '{printf("%d\n",$1 + 0.5)}')
echo "Curent percentage used by the directory="$Directory_Percentage

#number of files to be deleted every time the script loops (can be set to "1" if you want to be very accurate but the script is slower)
Number_Files_Deleted_Each_Loop=$3
echo "number of files to be deleted every time the script loops="$Number_Files_Deleted_Each_Loop

#While the current percentage is higher than allowed percentage, we delete the oldest files
while [ $Directory_Percentage -gt $Max_Directory_Percentage ] ; do
    #we delete the files
    find $Watched_Directory -type f -printf "%T@ %p\n" | sort -nr | tail -$Number_Files_Deleted_Each_Loop | cut -d' ' -f 2- | xargs rm
    #we delete the empty directories
    find $Watched_Directory -type d -empty -delete
    #we re-calculate $Directory_Percentage
    Directory_Size=$( du -sk "$Watched_Directory" | cut -f1 )
    Directory_Percentage=$(echo "scale=2;100*$Directory_Size/$Disk_Size+0.5" | bc | awk '{printf("%d\n",$1 + 0.5)}')
done

难得讲究,以下是参考的文章:

Simple Motion Detection with Python and OpenCV — For Beginners

Motion Detection using OpenCV

用opencv来自动保存关键事件视频片段 - 知乎

using bash - Limit the size of a directory by deleting old files

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

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

相关文章

如何使用Kimi和通义千问辅助快速阅读论文

说明 上一篇博文我介绍了最新阅读的一篇TinyML的论文。我有个习惯就是使用Google Schloar跟踪当前最新的论文&#xff0c;只要在Google Schloar中设置好关键字&#xff0c;它每天就把最新的相关论文的链接和摘要发送到邮箱里面。不过现在论文太多了&#xff0c;每篇都认真读取…

分享免费的手机清理软件app,一款国外开发的手机清理神器,让手机再战两年!

手机内存越来越大&#xff0c;软件却越来越占地方&#xff0c;就像微信这家伙&#xff0c;轻轻松松就吃了十几个G&#xff01; 害得阿星8128G的手机&#xff0c;本来想换新的&#xff0c;结果用了这款Avast Cleanup软件&#xff0c;瞬间感觉手机还能再战两年&#xff01; 注意…

让大模型变得更聪明三个方向

让大模型变得更聪明三个方向 随着人工智能技术的飞速发展&#xff0c;大模型在多个领域展现出了前所未有的能力&#xff0c;但它们仍然面临着理解力、泛化能力和适应性等方面的挑战。那么&#xff0c;如何让大模型变得更聪明呢&#xff1f; 方向一&#xff1a;算法创新 1.1算…

Generative Action Description Prompts for Skeleton-based Action Recognition

标题&#xff1a;基于骨架的动作识别的生成动作描述提示 源文链接&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/papers/Xiang_Generative_Action_Description_Prompts_for_Skeleton-based_Action_Recognition_ICCV_2023_paper.pdfhttps://openaccess.thecvf.c…

【云原生】kubernetes声明式管理-----YAML文件

目录 引言 一、声明式管理简介 &#xff08;一&#xff09;什么是声明式管理 &#xff08;二&#xff09;支持格式 二、YAML文件 &#xff08;一&#xff09;YAML文件基本格式 &#xff08;二&#xff09;YAML文件实践 三、YAML文件创建方式 &#xff08;一&#xff0…

TabAttention:基于表格数据的条件注意力学习

文章目录 TabAttention: Learning Attention Conditionally on Tabular Data摘要方法实验结果 TabAttention: Learning Attention Conditionally on Tabular Data 摘要 医疗数据分析通常结合成像数据和表格数据处理&#xff0c;使用机器学习算法。尽管先前的研究探讨了注意力…

2024/05/25学习记录

1、面经复习&#xff1a;前端广度 2、代码随想录刷题&#xff1a;动态规划 3、rosebush 完成input组件基础

汇编原理(二)

寄存器&#xff1a;所有寄存器都是16位&#xff08;0-15&#xff09;&#xff0c;可以存放两个字节 AX,BX,CX,DX存放一般性数据&#xff0c;称为通用寄存器 AX的逻辑结构。最大存放的数据为2的16次方减1。可分为AH和AL&#xff0c;兼容8位寄存器。 字&#xff1a;1word 2Byte…

互联网十万个为什么之 什么是Kubernetes(K8s)?

Kubernetes&#xff08;通常简称为K8s&#xff09;是一款用于自动部署、扩缩和管理容器化应用程序的开源容器编排平台。Kubernetes已发展为现代企业实现敏捷开发、快速迭代、资源优化及灵活扩展的关键技术组件之一。它拥有庞大的开源社区和丰富的生态系统。围绕Kubernetes已经形…

【vue2配置】Vue Router

Vue Router官网 1、npm install vue-router4 2、创建模块&#xff0c;在src目录小创/views/map/MapIndex.vue模块和创router/index.js文件 3、在router/index.js配置路由 import Vue from "vue"; import Router from "vue-router"; // 引入模块 const Ma…

特殊变量笔记3

输入一个错误命令, 在输出$? 特殊变量&#xff1a;$$ 语法 $$含义 用于获取当前Shell环境的进程ID号 演示 查看当前Shell环境进程编号 ps -aux|grep bash输出 $$ 显示当前shell环境进程编号 小结 常用的特殊符号变量如下 特殊变量含义$n获取输入参数的$0, 获取当前She…

嵌入式进阶——震动马达

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 原理图控制分析功能设计 原理图 控制分析 S8050 NPN三极管特性 NPN型三极管的工作原理是基于PN结和PNP型晶体管的工作原理。 当外…

【解答篇】webase-front5002网页启动失败

你好~ 上图是否是你目前的状态&#xff1f; 解压文件也配置了呀 重启了呀 第一次用status检查没问题呀 究竟是怎么回事呢&#xff1f; 首先我要说明几种可能出现的问题~ 节点没有启动 配置文件没有配 节点重启等等。。。。。 不着急&#xff01;&#xff01;这篇文章绝对…

【C/C++】Makefile文件的介绍与基本用法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

烟囱ERP系统

一、烟囱系统定义 “烟囱式”系统&#xff0c;来自维基百科的解释是&#xff1a;一种不能与其他系统进行有效协调工作的信息系统&#xff0c;又称为孤岛系统。 二、烟囱系统的案例 比如&#xff1a;就像以下一样&#xff0c;各个系统之间是独立的&#xff0c;所有对接是通过…

https为何安全?

HTTPS&#xff08;超文本传输安全协议&#xff09;是一种用于安全通信的网络协议&#xff0c;它在HTTP协议的基础上通过SSL/TLS&#xff08;安全套接层/传输层安全&#xff09;协议来加密数据&#xff0c;以保护网络数据的传输安全。 TLS/SSL 基础概念 概念源自百度百科&…

Python面向对象基础与魔法方法详解

系列文章目录 Python数据类型&#xff1a;编程新手的必修课深入探索Python字符串&#xff1a;技巧、方法与实战Python 函数基础详解Python正则表达式详解&#xff1a;掌握文本匹配的魔法Python文件操作宝典&#xff1a;一步步教你玩转文件读写Python面向对象基础与魔法方法详解…

Nmap的使用教程(超详细)

一、Nmap简介 Nmap Nmap是一款开源免费的网络发现&#xff08;Network Discovery&#xff09;和安全审计&#xff08;Security Auditing&#xff09;工具。软件名字Nmap是Network Mapper的简称。Nmap最初是由Fyodor在1997年开始创建的。随后在开源社区众多的志愿者参与下&…

2024电工杯数学建模B题完整论文讲解(含每一问python代码+数据)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024电工杯数学建模B题大学生平衡膳食食谱的优化设计及评价完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 …

QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139136356 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…