当输出没有文件名时,必须指定Python"格式"

时间:2016-04-05 08:35:00

标签: python opencv raspberry-pi2

我遵循本教程:http://www.pyimagesearch.com/2015/06/01/home-surveillance-and-motion-detection-with-the-raspberry-pi-python-and-opencv/

这是一个教程,用于在python集成dropbox(或不是)中使用覆盆子pi构建家庭监控和运动检测。 就我而言,我不想使用Dropbox。 我在下面的代码中有错误(真的,我是新手,这是我正在做的第一个教程......):

这是complet代码:

# import the necessary packages
from pyimagesearch.tempimage import TempImage
from dropbox.client import DropboxOAuth2FlowNoRedirect
from dropbox.client import DropboxClient
from picamera.array import PiRGBArray
from picamera import PiCamera
import argparse
import warnings
import datetime
import imutils
import json
import time
import cv2


# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-c", "--conf", required=True,
    help="path to the JSON configuration file")
args = vars(ap.parse_args())


# filter warnings, load the configuration and initialize the Dropbox
# client
warnings.filterwarnings("ignore")
conf = json.load(open(args["conf"]))
client = None
if conf["use_dropbox"]:
    # connect to dropbox and start the session authorization process
    flow = DropboxOAuth2FlowNoRedirect(conf["dropbox_key"], conf["dropbox_secret"])
    print "[INFO] Authorize this application: {}".format(flow.start())
    authCode = raw_input("Enter auth code here: ").strip()

# finish the authorization and grab the Dropbox client
(accessToken, userID) = flow.finish(authCode)
client = DropboxClient(accessToken)
print "[SUCCESS] dropbox account linked"
# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
camera.resolution = tuple(conf["resolution"])
camera.framerate = conf["fps"]
rawCapture = PiRGBArray(camera, size=tuple(conf["resolution"]))

# allow the camera to warmup, then initialize the average frame, last
# uploaded timestamp, and frame motion counter
print "[INFO] warming up..."
time.sleep(conf["camera_warmup_time"])
avg = None
lastUploaded = datetime.datetime.now()
motionCounter = 0
# capture frames from the camera
for f in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    # grab the raw NumPy array representing the image and initialize
    # the timestamp and occupied/unoccupied text
    frame = f.array
    timestamp = datetime.datetime.now()
    text = "Unoccupied"


# resize the frame, convert it to grayscale, and blur it
frame = imutils.resize(frame, width=500)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)

# if the average frame is None, initialize it
if avg is None:
    print "[INFO] starting background model..."
    avg = gray.copy().astype("float")
    rawCapture.truncate(0)
    continue

    # accumulate the weighted average between the current frame and
    # previous frames, then compute the difference between the current
    # frame and running average
    cv2.accumulateWeighted(gray, avg, 0.5)
    frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(avg))
# threshold the delta image, dilate the thresholded image to fill
    # in holes, then find contours on thresholded image
    thresh = cv2.threshold(frameDelta, conf["delta_thresh"], 255,
        cv2.THRESH_BINARY)[1]
    thresh = cv2.dilate(thresh, None, iterations=2)
    (cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)

    # loop over the contours
    for c in cnts:
        # if the contour is too small, ignore it
        if cv2.contourArea(c) < conf["min_area"]:
            continue




# compute the bounding box for the contour, draw it on the frame,
    # and update the text
    (x, y, w, h) = cv2.boundingRect(c)
    cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    text = "Occupied"



# draw the text and timestamp on the frame
ts = timestamp.strftime("%A %d %B %Y %I:%M:%S%p")
cv2.putText(frame, "Room Status: {}".format(text), (10, 20),
    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
cv2.putText(frame, ts, (10, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX,
    0.35, (0, 0, 255), 1)
# check to see if the room is occupied
if text == "Occupied":
    # check to see if enough time has passed between uploads
    if (timestamp - lastUploaded).seconds >= conf["min_upload_seconds"]:
        # increment the motion counter
        motionCounter += 1

        # check to see if the number of frames with consistent motion is
        # high enough
        if motionCounter >= conf["min_motion_frames"]:
            # check to see if dropbox sohuld be used
            if conf["use_dropbox"]:
                # write the image to temporary file
                t = TempImage()
                cv2.imwrite(t.path, frame)

                # upload the image to Dropbox and cleanup the tempory image
                print "[UPLOAD] {}".format(ts)
                path = "{base_path}/{timestamp}.jpg".format(
                    base_path=conf["dropbox_base_path"], timestamp=ts)
                client.put_file(path, open(t.path, "rb"))
                t.cleanup()

            # update the last uploaded timestamp and reset the motion
            # counter
            lastUploaded = timestamp
            motionCounter = 0

# otherwise, the room is not occupied
else:
    motionCounter = 0


# check to see if the frames should be displayed to screen
    if conf["show_video"]:
    # display the security feed
    cv2.imshow("Security Feed", frame)
    key = cv2.waitKey(1) & 0xFF

    # if the `q` key is pressed, break from the lop
    if key == ord("q"):
        break

# clear the stream in preparation for the next frame
rawCapture.truncate(0)
# import the necessary packages
import uuid
import os



class TempImage:
    def __init__(self, basePath="./", ext=".jpg"):
        # construct the file path
        self.path = "{base_path}/{rand}{ext}".format(base_path=basePath,
            rand=str(uuid.uuid4()), ext=ext)

    def cleanup(self):
        # remove the file
        os.remove(self.path)

我做了所有的步骤。

但不知何故,当我运行命令时:

sudo python pi_surveillance.py  --conf conf.json

然后,我得到了这个:

[INFO] warming up
Traceback (most recent call last):
 File "pi_surveillance.py", line 54 in <module>
  for f in camera.capture_continuous(rawCapture, format="bgr", use_video_port= True
 File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 1808, in capture_continuous
  format = self._get_image_format(output, format)
 File "usr/lib/python2.7/dist-packages/picamera/camera.py", line 832, in _get_image_format
  format = format or self._get_output_Format(output)
 File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 814, in _get_output_format
  'Format must be specified when output has no filename')
picamera.exc.PiCameraValueError: Format must be specified when output has no filename

我试图自己解决这个问题但我没有足够的知识。 任何人都可以帮助我吗?

编辑/更新:

@lapinkoira我在此之前添加了这一行import pdb ; pdb.set_trace()for f in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):

然后它回报我:

pi@raspberrypi:~ $ sudo python pi_surveillance.py --conf conf.json
[INFO] warming up..

> /home/pi/pi_surveillance.py(55)<module>()
-> for f in camera.capture_continuous(rawCapture, fromat="bgr", use_video_port=True):
(Pdb)
(Pdb) Traceback (most recent call last):
  File "pi_surveillance.py", line 55, in <module>
    for f in camera.capture_continuous(rawCapture, fromat="bgr", use_video_port=True):
  File "pi_surveillance.py", line 55, in <module>
    for f in camera.capture_continuous(rawCapture, fromat="bgr", use_video_port=True):
  File "/usr/lib/python2.7/bdb.py", line 49, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/lib/python2.7/bdb.py", line 67, in dispatch_line
    self.user_line(frame)
  File "/usr/lib/python2.7/pdb.py", line 158, in user_line
    self.interaction(frame, None)
  File "/usr/lib/python2.7/pdb.py", line 210, in interaction
    self.cmdloop()
  File "/usr/lib/python2.7/cmd.py", line 130, in cmdloop
    line = raw_input(self.prompt)
KeyboardInterrupt`

0 个答案:

没有答案