基于orangepi lts 3 的延时摄影程序

news2025/7/15 11:26:09

利用orangepi +摄像头 使用python写一个延时摄影的程序。

一,思路

orangepi 外接摄像头,利用opencv,按照一定间隔取图,再利用opencv 将图片编码成视频。

利用mqtt进行通讯,可以写一个app进行控制。

二,代码

# -*- coding: utf-8 -*-
import cv2
import random
import paho.mqtt.client as mqtt
import threading
import time
import shutil
import os
import json
from PIL import Image

class Camera(object):
    def __init__(self,_host,_port):
        self.host=_host
        self.port=_port

        self.client_id='python-mqtt-{}'.format(random.randint(0,1000))
        self.client=mqtt.Client(self.client_id)
        self.camera_start='camera_start'
        self.camera_stop='camera_stop'

        self.cap = cv2.VideoCapture(1) 

        self.isRuning=False

        #3秒1张 12小时 压缩成120fps =  两分钟视频
        self.interval=3
        #录制多少小时
        self.duration=0

        self.imagePath='/mnt/usb/image'
        self.videoPath='/mnt/usb/video'

    #开始录制
    def start(self):
        index=0

        shutil.rmtree(self.imagePath)
        os.makedirs(self.imagePath)

        print('开始录制视频 ',self.duration)
        while self.isRuning:
            ret,frame = self.cap.read()
            if ret:
                imgName=self.imagePath+'/{}.jpg'.format(index)
                cv2.imwrite(imgName,frame)
                index+=1
            # frame = cv2.imread('test.jpeg')
            # imgName=self.imagePath+'/{}.jpg'.format(index)
            # cv2.imwrite(imgName,frame)
            # index+=1
            time.sleep(self.interval)
            #到时间自动停止
            if self.duration !=0:
                if (60*60*self.duration)/self.interval<=index: 
                    self.stop()
                
    #停止录制
    def stop(self):
        print('停止录制 开始生成视频')
        self.isRuning = False
        time.sleep(self.interval)

        current_timestamp = time.time()
        local_time = time.localtime(current_timestamp)
        current_time = time.strftime('%Y-%m-%d_%H:%M:%S',local_time)

        videoFile = self.videoPath+"/"+current_time+".mp4"
        t = threading.Thread(target=self.image_to_video(self.imagePath,videoFile,120))
        t.start()

    #生成视频
    def image_to_video(self,_image_path, _media_path, _fps):
        image_names = os.listdir(_image_path)
        image_names.sort(key=lambda n: int(n[:-4]))
        fourcc = cv2.VideoWriter_fourcc('M','P','4','V')
        fps = _fps
        image = Image.open(os.path.join(_image_path, image_names[0]))
        media_writer = cv2.VideoWriter(_media_path, fourcc, fps, image.size)
        for image_name in image_names:
            print(image_name)
            im = cv2.imread(os.path.join(_image_path, image_name))
            media_writer.write(im)
        media_writer.release()
        print('视频写入完成')

    def __del__(self):
        self.client.disconnect()
        self.cap.release()
    
    def on_message(self,client,userdata,message):
        print('收到消息 ',message.topic,message.payload.decode('utf-8'))
        if message.topic==self.camera_start:
            if self.isRuning==False:
                self.isRuning=True

                payloadStr = message.payload.decode('utf-8')
                payloadJ = json.loads(payloadStr)
                self.duration = payloadJ["duration"]

                t = threading.Thread(target=self.start)
                t.start()
        elif message.topic == self.camera_stop:
            self.stop()

    def run(self):
        self.client.connect(self.host,self.port)
        self.client.on_message=self.on_message

        self.client.subscribe(self.camera_start)
        self.client.subscribe(self.camera_stop)

        self.client.loop_forever()

if __name__ =='__main__':
    try:
        camera = Camera("127.0.0.1",1883)
        camera.run()

    except KeyboardInterrupt:
        del camera

三,粗糙的设备

 

四,拍摄了一个晚上的街景。 摄像头有点差 而且大雾 看的很模糊

2023-10-31_23_58_20

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

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

相关文章

layui form表单 label和input宽度

情况是这样的&#xff0c;表单里有多个输入框&#xff0c;只有个别label 是长的&#xff0c;我就想调整一下个别长的&#xff0c;其它不变 <div class"layui-form-item"><label class"layui-form-label">是否分标分量:</label><div …

计算机毕业设计选题推荐-校园失物招领微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

没搞错吧?阿里云99元一年服务器老用户可以买!

阿里云老用户优惠服务器99元/年&#xff0c;谁再说阿里云不好我给谁急&#xff0c;云服务器ECS配置为经济型e实例&#xff0c;2核CPU、2G内存、3M固定带宽、40G ESSD entry 系统盘&#xff0c;老用户优惠价99元一年&#xff0c;老用户可以买&#xff0c;当然新用户也可以买&…

轻松玩转人物风格迁移!DualStyleGAN让你一键生成各种风格人物图片!【一个有趣的开源项目】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…

OOM如何处理

1. OOM是什么 OOM是Out of Memory的缩写&#xff0c;意思是内存溢出。它是指程序在申请内存时&#xff0c;系统可分配的内存已不足&#xff0c;从而导致程序运行失败。 2. OOM发生的一些情况 Java heap space 1.1 解释说明 当堆内存&#xff08;Heap Space&#xff09;没有足…

使用VS2017打包安装程序如何修改默认安装路径

步骤如下&#xff1a; 首先找到安装项目 打开文件系统 点击鼠标右键&#xff0c;view-文件系统。这时打开文件系统 找到Application Folder的属性窗口 修改DefaultLocation的属性 如果想改变默认的安装路径&#xff0c;修改DefaultLocation的属性。 去掉计算机的名称。 完…

2023世界传感器大会即将开启,汉威科技向全球发出邀请

由河南省政府、中国科学技术协会主办&#xff0c;郑州市人民政府、中国仪器仪表学会、河南省工业和信息化厅、河南省科学技术协会承办的“2023世界传感器大会”将于11月5日~7日在郑州国际会展中心举办。 传感器是链接数字世界与物理世界的桥梁&#xff0c;是万物互联、智慧化时…

pytorch复现_NMS

NMS&#xff08;非极大值抑制&#xff09;阈值是用于控制在一组重叠的边界框中保留哪些边界框的参数。当检测或识别算法生成多个边界框可能涵盖相同物体时&#xff0c;NMS用于筛选出最相关的边界框&#xff0c;通常是根据它们的置信度分数。 具体来说&#xff0c;NMS的工作原理…

大数据预处理与采集实验三:Urllib的GET和POST请求(1)

目录 Urllib基本操作-GET ➢没有进行utf-8编码的输出 ➢经过utf-8decode之后的输出 ➢ Timeout参数&#xff1a;捕获由于连接超时而引发的异常 ◆Urllib基本操作-定制请求头 ➢ 在GET请求中加入多个访问参数 ◆Urllib基本操作-POST ➢有道词典网页爬取&#xff1a;找到…

中文编程软件哪个好用,初学编程软件推荐

中文编程软件哪个好用&#xff0c;初学编程软件推荐 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;想如图这个实例就是用这个…

关于Kubernetes——cka认证含金量怎么样?

2019年和2020年&#xff0c;Rancher分别对近1,000名专业人员展开了调查。调查结果表明&#xff0c;Kubernetes在不同行业连续两年保持了90%以上的采用率&#xff0c;而生产环境中的容器采用率从2019年的85%增长至2020年的87%。 SUSE大中华区总裁秦小康表示&#xff1a;“从调研…

Seata入门系列【18】Seata集成Mybatis-Plus多数据源

1 前言 在使用单个服务&#xff0c;多数据源时&#xff0c;也存在分布式事务问题。 当单体系统需要访问多个数据库&#xff08;实例&#xff09;时就会产生分布式事务。 比如&#xff1a;用户信 息和订单信息分别在两个MySQL实例存储&#xff0c;用户管理系统删除用户信息&am…

Scala和Play WS库编写的爬虫程序

使用Scala和Play WS库编写的爬虫程序&#xff0c;该程序将爬取网页内容&#xff1a; import play.api.libs.ws._ import scala.concurrent.ExecutionContext.Implicits.global ​ object BaiduCrawler {def main(args: Array[String]): Unit {val url ""val proxy…

超详细的接口测试用例编写

自动化始终只是辅助测试工作的一个手段&#xff0c;对于测试人员而言&#xff0c;测试基础和测试用例的设计才是核心。如果测试用例的覆盖率或者质量不高&#xff0c;那将这部分用例实现为自动化用例的意义也就不大了。 那么&#xff0c;接口测试用例应该怎么编写呢&#xff1…

Powercli批量修改分布式交换机端口组

背景 需求&#xff1a; 批量修改虚拟机的分布式端口组 解决&#xff1a; 三条命令解决&#xff1a;先获取目标虚拟机、获取目标端口组、修改虚拟机端口组、检查虚拟机状态。 $vm Get-VM -Name <虚拟机名称> $portGroup Get-VirtualPortGroup -Name <端口组名称…

数据出境安全评估:重要性和实施策略

数据出境安全评估是确保数据安全和合规的重要环节。随着全球化的加速和信息技术的快速发展&#xff0c;企业和个人需要处理大量的数据&#xff0c;其中许多数据涉及个人隐私和企业机密。因此&#xff0c;数据出境安全评估对于保护数据安全和隐私权至关重要。 一、数据出境安全评…

深度学习_3 数据操作之线代,微分

线代基础 标量 只有一个元素的张量。可以通过 x torch.tensor(3.0) 方式创建。 向量 由多个标量组成的列表&#xff08;一维张量&#xff09;。比如 x torch.arange(4) 就是创建了一个1*4的向量。可以通过下标获取特定元素&#xff08;x[3]&#xff09;&#xff0c;可以通…

什么是Webpack的热模块替换(Hot Module Replacement)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

springboot医院绩效考核系统源码

医院绩效考核系统是一种以人力资源管理为基础&#xff0c;选用适合医院组织机构属性的绩效理论和方法&#xff0c;基于医院战略目标&#xff0c;构建全方位的绩效考评体系&#xff0c;在科学、合理的绩效管理体系基础上&#xff0c;采用科学管理的方法&#xff0c;如平衡计分卡…

CS224W4.2——计算PageRank

在介绍了PageRank及其公式之后&#xff0c;我们讨论了求解PageRank的方法。我们提出了求解图的随机邻接矩阵(即PageRank)的主特征向量的幂次迭代方法。此外&#xff0c;我们在之前的PageRank实现中引入了两个问题:死角&#xff08;dead ends&#xff09;(没有外部链接的节点)和…