Advertisement
MrLunk

Motion Detection Basics - OpenCV and Python3

Dec 13th, 2020 (edited)
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.45 KB | None | 0 0
  1. # imports
  2. import os,sys,time
  3. import numpy as np
  4. import cv2
  5.  
  6. # init camera
  7. camera = cv2.VideoCapture(0) ### <<<=== SET THE CORRECT CAMERA NUMBER
  8. camera.set(3,1280) # set frame width
  9. camera.set(4,720) # set frame height
  10. time.sleep(0.5)
  11. print(camera.get(3),camera.get(4))
  12.  
  13. # master frame
  14. master = None
  15.  
  16. while 1:
  17.  
  18. # grab a frame
  19. (grabbed,frame0) = camera.read()
  20.  
  21. # end of feed
  22. if not grabbed:
  23. break
  24.  
  25. # gray frame
  26. frame1 = cv2.cvtColor(frame0,cv2.COLOR_BGR2GRAY)
  27.  
  28. # blur frame
  29. frame2 = cv2.GaussianBlur(frame1,(15,15),0)
  30.  
  31. # initialize master
  32. if master is None:
  33. master = frame2
  34. continue
  35.  
  36. # delta frame
  37. frame3 = cv2.absdiff(master,frame2)
  38.  
  39. # threshold frame
  40. frame4 = cv2.threshold(frame3,15,255,cv2.THRESH_BINARY)[1]
  41.  
  42. # dilate the thresholded image to fill in holes
  43. kernel = np.ones((2,2),np.uint8)
  44. frame5 = cv2.erode(frame4,kernel,iterations=4)
  45. frame5 = cv2.dilate(frame5,kernel,iterations=8)
  46.  
  47. # find contours on thresholded image
  48. nada,contours,nada = cv2.findContours(frame5.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
  49.  
  50. # make coutour frame
  51. frame6 = frame0.copy()
  52.  
  53. # target contours
  54. targets = []
  55.  
  56. # loop over the contours
  57. for c in contours:
  58.  
  59. # if the contour is too small, ignore it
  60. if cv2.contourArea(c) < 500:
  61. continue
  62.  
  63. # contour data
  64. M = cv2.moments(c)#;print( M )
  65. cx = int(M['m10']/M['m00'])
  66. cy = int(M['m01']/M['m00'])
  67. x,y,w,h = cv2.boundingRect(c)
  68. rx = x+int(w/2)
  69. ry = y+int(h/2)
  70. ca = cv2.contourArea(c)
  71.  
  72. # plot contours
  73. cv2.drawContours(frame6,[c],0,(0,0,255),2)
  74. cv2.rectangle(frame6,(x,y),(x+w,y+h),(0,255,0),2)
  75. cv2.circle(frame6,(cx,cy),2,(0,0,255),2)
  76. cv2.circle(frame6,(rx,ry),2,(0,255,0),2)
  77.  
  78. # save target contours
  79. targets.append((cx,cy,ca))
  80.  
  81. # make target
  82. mx = 0
  83. my = 0
  84. if targets:
  85.  
  86. # average centroid adjusted for contour size
  87. #area = 0
  88. #for x,y,a in targets:
  89. # mx += x*a
  90. # my += y*a
  91. # area += a
  92. #mx = int(round(mx/area,0))
  93. #my = int(round(my/area,0))
  94.  
  95. # centroid of largest contour
  96. area = 0
  97. for x,y,a in targets:
  98. if a > area:
  99. mx = x
  100. my = y
  101. area = a
  102.  
  103.  
  104. # plot target
  105. tr = 50
  106. frame7 = frame0.copy()
  107. if targets:
  108. cv2.circle(frame7,(mx,my),tr,(0,0,255,0),2)
  109. cv2.line(frame7,(mx-tr,my),(mx+tr,my),(0,0,255,0),2)
  110. cv2.line(frame7,(mx,my-tr),(mx,my+tr),(0,0,255,0),2)
  111.  
  112. # update master
  113. master = frame2
  114.  
  115. # display
  116. cv2.imshow("Frame0: Raw",frame0)
  117. cv2.imshow("Frame1: Gray",frame1)
  118. cv2.imshow("Frame2: Blur",frame2)
  119. cv2.imshow("Frame3: Delta",frame3)
  120. cv2.imshow("Frame4: Threshold",frame4)
  121. cv2.imshow("Frame5: Dialated",frame5)
  122. cv2.imshow("Frame6: Contours",frame6)
  123. cv2.imshow("Frame7: Target",frame7)
  124.  
  125. # key delay and action
  126. key = cv2.waitKey(1) & 0xFF
  127. if key == ord('q'):
  128. break
  129. elif key != 255:
  130. print('key:',[chr(key)])
  131.  
  132. # release camera
  133. camera.release()
  134.  
  135. # close all windows
  136. cv2.destroyAllWindows()
  137.  
  138. #Code Source: https://www.youtube.com/watch?v=BDt0-F3PL8U
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement