树莓派工控机: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 &