py + opencv 打造树莓派监控,场景有变化自动拍照上传到百度云

nhtang111 贡献于2016-05-25

作者 User  创建于2016-05-05 02:39:00   修改者User  修改于2016-05-05 02:43:00字数8276

文档摘要: HYPERLINK"http://blog.csdn.net/kowity/article/details/19158395"py+opencv打造树莓派监控,场景有变化自动拍照上传到百度云2014-02-1314:10 3940人阅读 HYPERLINK"http://blog.csdn.net/kowity/article/details/19158395"\l"comments"评论(1) HYPERLINK"javascript:void(0);"\o"收藏"\t"_blank"收藏 HYPERLINK"http://blog.csdn.net/kowity/article/details/19158395"\l"report"\o"举报"举报INCLUDEPICTURE"http://static.blog.csdn.net/images/category_icon.jpg"\*MERGEFORMATINET 分类: C/C++和Python(40) INCLUDEPICTURE"http://static.blog.csdn.net/images/arrow_triangle%20_down.jpg"\*MERGEFORMATINET版权声明:本文为博主原创文章,未经博主允许不得转载。大家用树莓派来做监控,文章里面一般都是使用fswebcam或motion。motion非常强大,可以监测画面变化后保存成mpeg或jpeg,还可以运行成http服务器模式。但是树莓派放在家里,从外面访问有时也会访问不了(比如IP变了等原因)。其实使用Python+OpenCV打造一个对运动画面能够进行简单判断的程序并不困难。下面的程序每个0.5秒做一下检测,如果画面有变化就保存下来,并且将其上传到百度的云存储中。为了保证隐私,上传之前还可以给照片做AES加密,只有知道密码才能查看照片的内容。不过,OpenCV在树莓派上跑还是挺吃力的,CPU基本保持在6-70%左右。注册为百度开发者(HYPERLINK"http://developer.baidu.com/"\t"_blank"http://developer.baidu.com/)就可以创建自己的百度云存储空间了。然后在云存储中新建一个bucket,把代码中所有的'homepics'替换成你的bucket名称。要运行这个程序,在树莓派上需要安装有python2.7和PyCrypto、OpenCV、numpy、requests模块。在命令行运行:cv.py-d0-i/home/img-pqwerty123456qwerty123456-ubcs:[app_key]:[sk]如果没有-p参数照片就不加密,没有-u参数就不会存到百度云上。另外,还做了一个web站点,把bucket中图片都列出来,用浏览器就可以直接查看:HYPERLINK"http://eaho.sinaapp.com/"\t"_blank"http://eaho.sinaapp.com/[python] HYPERLINK"http://blog.csdn.net/kowity/article/details/19158395"\o"viewplain"viewplain HYPERLINK"http://blog.csdn.net/kowity/article/details/19158395"\o"copy"copy HYPERLINK"https://code.csdn.net/snippets/186515"\o"在CODE上查看代码片"\t"_blank"INCLUDEPICTURE"https://code.csdn.net/assets/CODE_ico.png"\*MERGEFORMATINETHYPERLINK"https://code.csdn.net/snippets/186515/fork"\o"派生到我的代码片"\t"_blank"INCLUDEPICTURE"https://code.csdn.net/assets/ico_fork.svg"\*MERGEFORMATINET#coding: cp936  import os, time, datetime, multiprocessing, urllib, base64, hashlib, hmac, argparse, tempfile  import cv2, numpy, requests  from Crypto.Cipher import AES  from Crypto.Util import Counter    class Bcs:  
关键词:

  py + opencv 打造树莓派监控,场景有变化自动拍照上传到百度云 2014-02-13 14:10 3940人阅读 评论(1) 收藏 举报  分类:   C/C++ 和 Python(40)  版权声明:本文为博主原创文章,未经博主允许不得转载。 大家用树莓派来做监控,文章里面一般都是使用 fswebcam 或 motion。motion 非常强大,可以监测画面变化后保存成 mpeg 或 jpeg,还可以运行成 http 服务器模式。但是树莓派放在家里,从外面访问有时也会访问不了(比如 IP 变了等原因)。其实使用 Python + OpenCV 打造一个对运动画面能够进行简单判断的程序并不困难。下面的程序每个 0.5 秒做一下检测,如果画面有变化就保存下来,并且将其上传到百度的云存储中。为了保证隐私,上传之前还可以给照片做 AES 加密,只有知道密码才能查看照片的内容。不过,OpenCV 在树莓派上跑还是挺吃力的,CPU 基本保持在 6-70% 左右。 注册为百度开发者(http://developer.baidu.com/)就可以创建自己的百度云存储空间了。然后在云存储中新建一个 bucket,把代码中所有的 'homepics' 替换成你的 bucket 名称。 要运行这个程序,在树莓派上需要安装有 python2.7 和 PyCrypto、OpenCV、numpy、requests 模块。 在命令行运行:cv.py -d 0 -i /home/img -p qwerty123456qwerty123456 -u bcs:[app_key]:[sk] 如果没有 -p 参数照片就不加密,没有 -u 参数就不会存到百度云上。 另外,还做了一个 web 站点,把 bucket 中图片都列出来,用浏览器就可以直接查看:http://eaho.sinaapp.com/ [python] view plain copy   1. #coding: cp936   2. import os, time, datetime, multiprocessing, urllib, base64, hashlib, hmac, argparse, tempfile   3. import cv2, numpy, requests   4. from Crypto.Cipher import AES   5. from Crypto.Util import Counter   6.    7. class Bcs:   8.     def __init__(self, ak, sk):   9.         self.base_url = 'http://bcs.duapp.com'   10.         self.ak = ak   11.         self.sk = sk   12.         self.MAX_FILE_SIZE = 250000   13.            14.     def getContent(self, method = 'GET', bucket = '', obj = '', time = None, ip = None, size = None):   15.         content = 'Method=%s\n' % method   16.         content += 'Bucket=%s\n' % bucket   17.         content += 'Object=/%s\n' % obj   18.            19.         flag = 'MBO'   20.         if time:   21.             flag += 'T'   22.             content += 'Time=%d\n' % time   23.         if ip:   24.             flag += 'I'   25.             content += 'Ip=%s\n' % ip   26.         if size:   27.             flag += 'S'   28.             content += 'Size=%d\n' % size   29.                30.         return flag, flag + '\n' + content   31.    32.     def getSignature(self, content):   33.         return urllib.quote_plus(base64.encodestring(hmac.new(self.sk, content, hashlib.sha1).digest())[:-1])   34.            35.     def getUrl(self, flag, signature, bucket = '', obj = '', time = None, size = None, oparam = ''):   36.         if obj:   37.             bucket += '/%s' % obj   38.                39.         url = []   40.         param = ''   41.         if time:   42.             url.append('time=%d' % time)   43.         if size:   44.             url.append('size=%d' % size)   45.         if url:   46.             param = '&' + '&'.join(url)   47.         if oparam:   48.             param += '&' + oparam   49.            50.            51.         return '%s/%s?sign=%s:%s:%s%s' % (self.base_url, bucket, flag, self.ak, signature, param)   52.            53.     def upload(self, path, bucket):   54.         name = os.path.split(path)   55.         filename = name[1]   56.         file_size = self.MAX_FILE_SIZE   57.            58.         timestamp = int(time.time() + 60)   59.            60.         flag, content = self.getContent(method = 'POST', bucket = bucket, obj = filename, time = timestamp, size = file_size)   61.         signature = self.getSignature(content)   62.         url = self.getUrl(flag, signature, bucket, filename, timestamp, file_size)   63.            64.         print self.postFile(url, path)   65.            66.     def upload2(self, filename, bucket, text):   67.         file_size = self.MAX_FILE_SIZE   68.            69.         timestamp = int(time.time() + 60)   70.            71.         flag, content = self.getContent(method = 'POST', bucket = bucket, obj = filename, time = timestamp, size = file_size)   72.         signature = self.getSignature(content)   73.         url = self.getUrl(flag, signature, bucket, filename, timestamp, file_size)   74.            75.         print self.postFileContent(url, text)   76.    77.     def postFile(self, url, path):   78.         f = open(path, 'rb')   79.         files = {'file': f}   80.         result = requests.post(url, files=files)   81.         f.close()   82.         return result.text   83.            84.     def postFileContent(self, url, content):   85.         files = {'file': content}   86.         result = requests.post(url, files=files)   87.         return result.text   88.            89.     def listBucket(self):   90.         flag, content = self.getContent(method = 'GET')   91.         signature = self.getSignature(content)   92.         url = self.getUrl(flag, signature)   93.            94.         result = requests.get(url).json()   95.         return result   96.            97.     def listObject(self, bucket, start = 0, limit = 20):   98.         flag, content = self.getContent(method = 'GET', bucket = bucket)   99.         signature = self.getSignature(content)   100.         url = self.getUrl(flag, signature, bucket = bucket, oparam = 'start=%d&limit=%d' % (start, limit))   101.            102.         result = requests.get(url).json()   103.         return result   104.            105.     def getImg(self, bucket, obj):   106.         flag, content = self.getContent(method = 'GET', bucket = bucket, obj = obj)   107.         signature = self.getSignature(content)   108.         url = self.getUrl(flag, signature, bucket, obj)   109.            110.         result = requests.get(url)   111.         return result.content   112.        113.    114. class MotionDetect:   115.     def __init__(self, device = 0, base_path = '', skey = '', upload_mode = ''):   116.         self.mhi = None   117.         self.lastImg = None   118.         self.diff_threshold = 30   119.         self.MHI_DURATION = 0.5   120.         self.MAX_TIME_DELTA = 0.25   121.         self.MIN_TIME_DELTA = 0.05   122.            123.         self.device = device   124.         self.skey = skey   125.         self.upload_mode = upload_mode   126.            127.         if base_path == '':   128.             self.base_path = tempfile.gettempdir()   129.         else:   130.             self.base_path = base_path   131.            132.         self.pipe = multiprocessing.Pipe()   133.         self.worker = None   134.    135.     def update(self, img):   136.         h, w = img.shape[:2]   137.         if self.mhi == None:   138.             self.mhi = numpy.zeros((h, w), numpy.float32)   139.            140.         if self.lastImg == None:   141.             self.lastImg = img   142.                143.         frame_diff = cv2.absdiff(img, self.lastImg)   144.         gray_diff = cv2.cvtColor(frame_diff, cv2.COLOR_BGR2GRAY)   145.         ret, silh = cv2.threshold(gray_diff, self.diff_threshold, 1, cv2.THRESH_BINARY)   146.            147.         timestamp = cv2.getTickCount() / cv2.getTickFrequency()   148.         cv2.updateMotionHistory(silh, self.mhi, timestamp, self.MHI_DURATION)   149.         mask, orient = cv2.calcMotionGradient(self.mhi, self.MAX_TIME_DELTA, self.MIN_TIME_DELTA, apertureSize=5)   150.         segmask, seg_bounds = cv2.segmentMotion(self.mhi, timestamp, self.MAX_TIME_DELTA)   151.    152.         self.lastImg = img   153.            154.         count = 0   155.         for i, rect in enumerate([(0, 0, w, h)] + list(seg_bounds)):   156.             x, y, rw, rh = rect   157.             area = rw*rh   158.             if area < 64**2:   159.                 continue   160.                161.             count += 1   162.         return count   163.            164.     def encrypt(self, img, timestamp):   165.         ctr = Counter.new(128)   166.         aes = AES.new(self.skey, AES.MODE_CTR, counter = ctr)   167.            168.         ret, text = cv2.imencode('.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 80])   169.            170.         cbin = aes.encrypt(text)   171.            172.         filename = os.path.join(self.base_path, timestamp + '.jpg')   173.            174.         outfile = open(filename, 'wb')   175.         outfile.write(cbin)   176.         outfile.close()   177.            178.         return filename   179.            180.     def encrypt2(self, img):   181.         ret, text = cv2.imencode('.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 80])   182.            183.         if self.skey != '':   184.             ctr = Counter.new(128)   185.             aes = AES.new(self.skey, AES.MODE_CTR, counter = ctr)   186.             text = aes.encrypt(text)   187.         return text   188.            189.     def decrypt(self, filename):   190.         cbin = open(filename, 'rb').read()   191.            192.         ctr = Counter.new(128)   193.         aes = AES.new(self.skey, AES.MODE_CTR, counter = ctr)   194.         text = aes.decrypt(cbin)   195.            196.         open(filename + '.jpg', 'wb').write(text)   197.            198.         return filename + '.jpg'   199.    200.     def detect(self):   201.         cap = cv2.VideoCapture(self.device)   202.         time.sleep(2)   203.    204.         while True:   205.             s = time.clock()   206.                207.             timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3]   208.             ret, img = cap.read()   209.             count = self.update(img)   210.                211.             if count > 3:   212.                 cbin = self.encrypt2(img)   213.                 filename = os.path.join(self.base_path, timestamp + '.jpg')   214.                 print filename   215.                 outfile = open(filename, 'wb')   216.                 outfile.write(cbin)   217.                 outfile.close()   218.                    219.                 self.processImage(timestamp)   220.                 print time.clock() - s   221.                222.             time.sleep(0.2)   223.                224.         if self.worker.is_alive():   225.             self.worker.join()   226.                227.     def processImage(self, timestamp):   228.         if self.worker == None or self.worker.is_alive() == False:   229.             print 'start new process'   230.             self.worker = multiprocessing.Process(target = self.processWorker, args = (self.pipe[0],))   231.             self.worker.start()   232.                233.         print 'send...', timestamp   234.         self.pipe[1].send(timestamp)   235.                236.     def processWorker(self, pipe):   237.         while pipe.poll(10):   238.             timestamp = pipe.recv()   239.             print 'processing... %s' % timestamp   240.    241.             if self.upload_mode != '':   242.                 if self.upload_mode.startswith('bcs:'):   243.                     _, ak, sk = self.upload_mode.split(':')   244.                     bcs = Bcs(ak, sk)   245.                        246.                     try:   247.                         filename = os.path.join(self.base_path, timestamp + '.jpg')   248.                         bcs.upload(, 'homepics')   249.                         os.remove(filename)   250.                         print 'uploaded ' + timestamp   251.                     except:   252.                         print 'upload failed: ' + timestamp   253.                254. if __name__ == '__main__':   255.     parser = argparse.ArgumentParser()   256.     parser.add_argument('-d', action = 'store', dest = 'device_index', default = 0, type = int, help = 'video device index, default is 0.')   257.     parser.add_argument('-D', action = 'store', dest = 'decrypt', default = '', help = 'decrypt file.')   258.     parser.add_argument('-i', action = 'store', dest = 'image_path', default = '', help = 'image storage directory.')   259.     parser.add_argument('-p', action = 'store', dest = 'pwd', default = '', help = 'the password for encrypt the image file. the file will not be encrypted if pwd is null.')   260.     parser.add_argument('-u', action = 'store', dest = 'upload_mode', default = '', help = '''''store the image to Internet storage service.   261. Baidu Cloud Storage. parame --> bcs:app_key(ak):screct_key(sk)  262. Baidu PCS. [unsupported]  263. Sina vdisk. [unsupported]  264. Huawei dbank. [unsupported]  265. ''')   266.     args = parser.parse_args()   267.        268.     motion = MotionDetect(args.device_index, args.image_path, args.pwd, args.upload_mode)   269.     if args.decrypt != '':   270.         if args.pwd != '':   271.             motion.decrypt(args.decrypt)   272.         else:   273.             print 'decrypt need a password(-p pwd)'   274.     else:   275.         motion.detect()   276.        277.       

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档