树莓派4b + usb摄像头 + 阿里云oss + python3 + opencv 实现定时拍照并保存到阿里云oss

树莓派工控机:https://docs.edatec.cn/cm4-nano/zh/在这里插入图片描述
一个树莓派连接了四个usb摄像头,因此使用了一个拓展坞
安装opencv-python可以参考这篇文章树莓派安装opencv-python

#coding=utf-8
import sys
import time
import datetime
import os
import cv2
import schedule
import oss2


# 开机自启动需要 等一会不然会报错(可能是开机没联网)
time.sleep(120)


Device = 'R1'


def UploadFile_oss2(localfile,now_time,i):
    access_key = '你的阿里云oss的 access_key '
    secret_key = '你的阿里云oss的 secret_key '

    try:
      auth = oss2.Auth(access_key, secret_key)
      bucket = oss2.Bucket(auth, '你的阿里云oss的Endpoint(地域节点)', '的的阿里云oss的bucket名称')

      print
      '>> uploading local file: ' + localfile
      if False == os.path.exists(localfile):
        print
        '>> local file not exist: ' + localfile
        return False
      result = bucket.put_object_from_file(Device + "-c"+str(i)+"-"+str(now_time)+"img.jpg", localfile)
    except:
        return False

# 拍照
def job(text=""):
    now_time = datetime.datetime.now()
    for i in range(10):
        try:
            camera = cv2.VideoCapture(i)
            if camera.isOpened():
                # 设置分辨率
                camera.set(3, 3840)
                camera.set(4, 2880)
                ret, img = camera.read()
                file_name = "/home/py/" + Device + "/" + Device + "-c" + str(i) + "-" + str(now_time) + "img.jpg"
                print(file_name)
                cv2.imwrite(file_name, img)
                # 上传图片到阿里云oss
                UploadFile_oss2(file_name, now_time, i)
                print(i, "I'm working...")
                sys.stdout.flush()
                camera.release()
            else:
                print(i, "no")
        except Exception as e:
            print(e)


def del_files():
    test_path = r"/home/py/" + Device
    for root, dirs, files in os.walk(test_path):
        for name in files:
            if name.endswith(".jpg"):  # 指定要删除的格式,这里是jpg 可以换成其他格式
                os.remove(os.path.join(root, name))


# 检查网络,断网重启wifi
def restartWifi():
    status = os.system("ping -w 3 www.baidu.com")
    if status == 1:
        # 关闭wifi
        os.system('sudo ip link set wlan0 down')
        # 开启wifi
        os.system('sudo ip link set wlan0 up')
    else:
        print('已经连上网了')
    return status


job()

schedule.every(30).minutes.do(job, "1")
# 重连wifi
schedule.every(15).minutes.do(restartWifi)

# 定时删除图片
schedule.every(1).days.do(del_files)


while True:
    schedule.run_pending()
    time.sleep(1)

cv2.destroyAllWindows()

由于实验室有时可能会断网,所以写了一个定时查看网络状态,如果断网就重启wifi
树莓派内存有限,所以一天删除一次存储的图片的函数

把 camera.py 复制到树莓派 /home/py/ 下
在 /home/py/ 下创建 R1文件夹
运行代码的命令:
sudo nohup /usr/bin/python3 -u /home/py/camera.py >/home/py/camera.log 2>&1 &
上述代码会在在后台运行并输出日志到 camera.log中
实时查看日志命令:
tail -f camera.log

后来摄像头数量增加,使用了两个拓展坞,8个摄像头,发现 camera = cv2.VideoCapture(i) 这种方式只能识别 4个摄像头,新增的4个无法识别。
解决办法:
先查看有多少摄像头:ls /dev/video*
在这里插入图片描述

找到video 后面最大的数字
修改后的代码

#coding=utf-8
import sys
import time
import datetime
import os
import cv2
import schedule
import oss2


# 开机自启动需要 等一会不然会报错(可能是开机没联网)
time.sleep(120)


Device = 'R1'


def UploadFile_oss2(localfile,now_time,i):
    access_key = '你的阿里云oss的 access_key '
    secret_key = '你的阿里云oss的 secret_key '

    try:
      auth = oss2.Auth(access_key, secret_key)
      bucket = oss2.Bucket(auth, '你的阿里云oss的Endpoint(地域节点)', '的的阿里云oss的bucket名称')

      print
      '>> uploading local file: ' + localfile
      if False == os.path.exists(localfile):
        print
        '>> local file not exist: ' + localfile
        return False
      result = bucket.put_object_from_file(Device + "-c"+str(i)+"-"+str(now_time)+"img.jpg", localfile)
    except:
        return False

# 拍照
def job(text=""):
    now_time = datetime.datetime.now()
    for i in range(video 后面最大的数字):
        try:
            # camera = cv2.VideoCapture(i)
            camera = cv2.VideoCapture("/dev/video" + str(i))
            if camera.isOpened():
                # 设置分辨率
                camera.set(3, 3840)
                camera.set(4, 2880)
                ret, img = camera.read()
                file_name = "/home/py/" + Device + "/" + Device + "-c" + str(i) + "-" + str(now_time) + "img.jpg"
                print(file_name)
                cv2.imwrite(file_name, img)
                # 上传图片到阿里云oss
                UploadFile_oss2(file_name, now_time, i)
                print(i, "I'm working...")
                sys.stdout.flush()
                camera.release()
            else:
                print(i, "no")
        except Exception as e:
            print(e)


def del_files():
    test_path = r"/home/py/" + Device
    for root, dirs, files in os.walk(test_path):
        for name in files:
            if name.endswith(".jpg"):  # 指定要删除的格式,这里是jpg 可以换成其他格式
                os.remove(os.path.join(root, name))


# 检查网络,断网重启wifi
def restartWifi():
    status = os.system("ping -w 3 www.baidu.com")
    if status == 1:
        # 关闭wifi
        os.system('sudo ip link set wlan0 down')
        # 开启wifi
        os.system('sudo ip link set wlan0 up')
    else:
        print('已经连上网了')
    return status


job()

schedule.every(30).minutes.do(job, "1")
# 重连wifi
schedule.every(15).minutes.do(restartWifi)

# 定时删除图片
schedule.every(1).days.do(del_files)


while True:
    schedule.run_pending()
    time.sleep(1)

cv2.destroyAllWindows()

最后再设置开机自启
sudo nano /etc/rc.local
复制代码到rc.ocal文件中
sudo nohup /usr/bin/python3 -u /home/py/camera.py >/home/py/camera.log 2>&1 &
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值