Python調用OpenCV實現網路攝影機的運動檢測[樹莓派版]

來源:互聯網
上載者:User

標籤:int   size   sleep   package   bin   asp   argparse   idt   truncate   

[硬體環境]

RaspberryPi 3代B型(英國版)

[軟體環境]

作業系統:Raspbian

Python版本:2.7.3

Python庫:

1.1) opencv-python(3.2.0.6)

[搭建過程]

OpenCV Python庫:

1. pip安裝

[相關代碼(暫時未驗證,去掉了作者原代碼中的DROPBOX自動上傳部分)]

pi_surveillance.py

# USAGE# python pi_surveillance.py --conf conf.json# import the necessary packagesfrom pyimagesearch.tempimage import TempImagefrom picamera.array import PiRGBArray # picamera(CANT BE IMPORTED ON WINDOWS PLATFORM)from picamera import PiCamera # picamera(CANT BE IMPORTED ON WINDOWS PLATFORM)import argparseimport warningsimport datetimeimport imutilsimport jsonimport timeimport cv2# construct the argument parser and parse the argumentsap = 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 clientwarnings.filterwarnings("ignore")conf = json.load(open(args["conf"]))client = None# initialize the camera and grab a reference to the raw camera capturecamera = 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 counterprint "[INFO] warming up..."time.sleep(conf["camera_warmup_time"])avg = NonelastUploaded = datetime.datetime.now()motionCounter = 0# capture frames from the camerafor 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)
conf.json
{    "show_video": true,    "use_dropbox": true,    "dropbox_key": "YOUR_DROPBOX_KEY",    "dropbox_secret": "YOUR_DROPBOX_SECRET",    "dropbox_base_path": "YOUR_DROPBOX_APP_PATH",    "min_upload_seconds": 3.0,    "min_motion_frames": 8,    "camera_warmup_time": 2.5,    "delta_thresh": 5,    "resolution": [640, 480],    "fps": 16,    "min_area": 5000}
tempimage.py
# import the necessary packagesimport uuidimport osclass 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)

 

Python調用OpenCV實現網路攝影機的運動檢測[樹莓派版]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.