有賊出沒?看我用python來捉"賊"

  • 2019 年 11 月 3 日
  • 筆記

最近丟東西了,接二連三丟東西,很是糟心。是誰幹的?真想把他給揪出來。 自己用python搗鼓了個程式,看看效果。

最近自己的工位老是丟東西,關鍵只丟一樣東西,而且每天早上來,桌子上都是亂七八糟的。像是遭了賊。

本來上班心情就不是那麼愉快,這下心情更不爽了。 也沒丟啥值錢的東西,就是蘋果手機充電的線。本來測試的時候也要用,就插在電腦上沒拔,結果總是丟。

為這點破事跟人事說,也犯不著。也許誰拿去用用,說不定就還回來了。結果幾個星期過去了,沒有還的,只有丟的,接二連三,感覺是盯上我了。

丟到第四根的時候,扛不住了,害我自己的手機天天沒地方充電。測試機也沒法充電。

我得想辦法把他找出來,找他要回來。 我自己的電腦是一個macpro, 很大的屏,平時也不關機,它不有個攝影機么?我得從這上面下功夫。

import cv2    def make_photo():      """使用opencv拍照"""      cap = cv2.VideoCapture(0)  # 默認的攝影機      while True:          ret, frame = cap.read()          if ret:              cv2.imshow("capture", frame)  # 彈窗口              # 等待按鍵q操作關閉攝影機              if cv2.waitKey(1) & 0xFF == ord('q'):                  file_name = "theif.jpeg"                  cv2.imwrite(file_name, frame)                  break          else:              break        cap.release()      cv2.destroyAllWindows()      def make_video():      """使用opencv錄像"""      cap = cv2.VideoCapture(0)  # 默認的攝影機      # 指定影片程式碼      fourcc = cv2.VideoWriter_fourcc(*"DIVX")      out = cv2.VideoWriter('thief.mp4', fourcc, 20.0, (640, 480))      while (cap.isOpened()):          ret, frame = cap.read()          if ret:              out.write(frame)              #              cv2.imshow('frame', frame)              # 等待按鍵q操作關閉攝影機              if cv2.waitKey(1) & 0xFF == ord('q'):                  break          else:              break      cap.release()      out.release()      cv2.destroyAllWindows()      if __name__ == '__main__':      make_video()      make_photo()

運行起來似乎還可以。

但是有個問題,如果我一直開機,一直拍照或者錄製影片。感覺存儲空間會抗不住。如果鏡頭有變化,才錄製,這樣會減少很多無用的錄製,而且回放也簡單很多。 改進一下:

import cv2  import numpy, os, sys      def isPicChanged(dividePar, pointDelta, judgeTh):      '''      通過前後幀對比,判斷畫面是否改變      :param dividePar = 40 # 對比間隔點,減少計算量      :param pointDelta = 500 # 像素點的差異大於該值認為是差異點      :param judgeTh = 640 # 判斷變化畫面大小的閾值:畫面(1/judgeTh)      '''        capIdx = 0  # 截圖命名      camIdx = -1      while (int(camIdx) < 0 or int(camIdx) > 10):          print("enter camera index in 0 and 10:")          camIdx = int(input())        if not (os.path.isdir('cap')):  # 創建存放截圖的文件夾          os.system('mkdir -p {}'.format("cap"))        cap = cv2.VideoCapture(camIdx)  # 調整參數實現讀取影片或調用攝影機      ret, frameBak = cap.read()      for i in range(10):  # 剛打開相機時,曝光不穩定,清理10張          ret, frameBak = cap.read()        frameWidth = int(cap.get(cv2.WIDTH))      frameHeight = int(cap.get(cv2.HEIGHT))      print("frameWidth:{},frameHeight:{}".format(frameWidth, frameHeight))      if frameWidth == 0:          exit("camera is not available.")        while True:          frameBak = frame          ret, frame = cap.read()      cap.release()      cv2.destroyAllWindows()    if __name__ == "__main__":      isPicChanged(4, 50, 64)

測試一下,效果還真有。鏡頭變化了,才錄製。 後面想想,還有個問題,如果鏡頭變化很久,存儲也會吃緊。 於是又寫個程式,隔段時間,來檢測圖片的變化,如果相似度太高的,可以刪除一部分。 ssim對比:

from skimage.measure import compare_ssim  import cv2    class CompareImage():        def compare_image(self, path_image1, path_image2):            imageA = cv2.imread(path_image1)          imageB = cv2.imread(path_image2)            grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)          grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)            (score, diff) = compare_ssim(grayA, grayB, full=True)          print("SSIM: {}".format(score))          return score      compare_image = CompareImage()  compare_image.compare_image("1.jpg", "2.jpg")

直方圖對比:

import cv2  import numpy as py    img = cv2.imread("../image-030.png")  img1 = cv2.imread("../image-002.jpg")  # 計算圖img的直方圖  H1 = cv2.calcHist([img], [1], None, [256],[0,256])  H1 = cv2.normalize(H1, H1, 0, 1, cv2.NORM_MINMAX, -1) # 對圖片進行歸一化處理    # 計算圖img2的直方圖  H2 = cv2.calcHist([img1], [1], None, [256],[0,256])  H2 = cv2.normalize(H2, H2, 0, 1, cv2.NORM_MINMAX, -1)    # 利用compareHist()進行比較相似度  similarity = cv2.compareHist(H1, H2,0)  print(similarity)

還有哈希對比等。 這樣有可以節約一些空間。

後面還想深入一點,人臉識別。可是我沒那麼厚的功底,就沒費那大的勁。而且我的程式碼似乎也夠用了。 這種監控,還可以應用到家用攝影機。 當然,涉及到隱私問題。所以這也是一個很敏感的問題,所以上面的程式碼也不全,防止有人幹壞事。

最後我抓到「賊」了沒?請聽下回分解。

Tags: