树莓派相机。资源不足

Ale*_*kzz 2 python tornado raspberry-pi

尝试启动带有运动传感器的相机。像这样工作正常:

import RPi.GPIO as GPIO
import time
import picamera
import datetime
import os

def getFileName():
    return datetime.datetime.now().strftime("%Y-%m-%d_%H.%M.%S.h264")

pin = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
prevState = False
currState = False
camera = picamera.PiCamera()
while True:
    time.sleep(0.1)
    prevState = currState
    currState = GPIO.input(pin)
    if currState != prevState:
        newState = "HIGH" if currState else "LOW"
        print ("GPIO pin %s is %s" % (pin, newState))
        if currState:
            fileName = getFileName()
            print ("Starting Recording...")
            camera.start_preview()
            camera.start_recording(fileName)
            time.sleep(10)
            print (fileName)
        else:
            camera.stop_preview()
            time.sleep(1)
            camera.stop_recording()
            print ("Stopped Recording")

    else:
        print("No motions")
Run Code Online (Sandbox Code Playgroud)

但后来我尝试为 Tornado 服务器定义我的函数:

def secure_on(prevState, currState):
    pin = 4
    #GPIO.setmode(GPIO.BCM)
    #GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    #camera = picamera.PiCamera()
    time.sleep(0.1)
    prevState = currState
    #currState = GPIO.input(pin)
    if currState != prevState:
        newState = "HIGH" if currState else "LOW"
        return {'info': "GPIO pin %s is %s" % (pin, newState)}
        if currState:
            fileName = getFileName()
            print ("Starting Recording...")
            #camera.start_preview()
            #camera.start_recording(fileName)
            time.sleep(10)
            return {'info': fileName}
        else:
            #camera.stop_preview()
            time.sleep(1)
            #camera.stop_recording()
            return {'info': "Stopped Recording"}
    else:
        return {'info': "No motions"}
Run Code Online (Sandbox Code Playgroud)

龙卷风:

class SecureOnHandler(tornado.web.RequestHandler):
    @gen.coroutine
    def get(self):
        result = RosPi.secure_on(prevSec, currSec)

        self.write({"info": result['info']})
Run Code Online (Sandbox Code Playgroud)

之后我得到一个错误

“无法启用相机组件:资源不足(内存除外)错误:tornado.access:500 GET /secure_on

什么可能导致错误?提前致谢!

小智 5

我知道这是一个老问题,但我只是想发布我的Out of resources错误解决方案,以防它可以节省某人的时间和精力。

对我来说,问题是我同时初始化相机模块是两个Python文件(一个带有while循环的脚本,在检测到运动时拍照,另一个脚本按需拍照)。

根据文档:https://picamera.readthedocs.io/en/release-1.13/faq.html#camera-locks-up-with-multiprocessingPiCamera ,您必须确保一次只有一个进程创建 的实例。

我的解决方案只是将初始化相机模块移至函数内,并.close()在拍照后调用以释放进程,以供下一个调用它的脚本使用。