2010-07-30 39 views
12

Tôi có thể tải khung hình từ webcam của mình bằng cách sử dụng OpenCV bằng Python. Ví dụ chuyển hướng gần với những gì tôi muốn, nhưng tôi không muốn can thiệp của con người để xác định đối tượng. Tôi muốn lấy điểm trung tâm của tổng số điểm ảnh đã thay đổi trong quá trình nhiều khung, tức là trung tâm của đối tượng chuyển động.Làm cách nào để theo dõi chuyển động bằng OpenCV bằng Python?

+0

http://stackoverflow.com/questions/3374422/how-do-i-track-a-blob-using-opencv-and-python cho câu hỏi bối cảnh –

Trả lời

30

Tôi đã có một số mã làm việc dịch từ phiên bản C mã được tìm thấy trong các bài viết trên blog Motion Detection using OpenCV:

#!/usr/bin/env python 

import cv 

class Target: 

    def __init__(self): 
     self.capture = cv.CaptureFromCAM(0) 
     cv.NamedWindow("Target", 1) 

    def run(self): 
     # Capture first frame to get size 
     frame = cv.QueryFrame(self.capture) 
     frame_size = cv.GetSize(frame) 
     color_image = cv.CreateImage(cv.GetSize(frame), 8, 3) 
     grey_image = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1) 
     moving_average = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_32F, 3) 

     first = True 

     while True: 
      closest_to_left = cv.GetSize(frame)[0] 
      closest_to_right = cv.GetSize(frame)[1] 

      color_image = cv.QueryFrame(self.capture) 

      # Smooth to get rid of false positives 
      cv.Smooth(color_image, color_image, cv.CV_GAUSSIAN, 3, 0) 

      if first: 
       difference = cv.CloneImage(color_image) 
       temp = cv.CloneImage(color_image) 
       cv.ConvertScale(color_image, moving_average, 1.0, 0.0) 
       first = False 
      else: 
       cv.RunningAvg(color_image, moving_average, 0.020, None) 

      # Convert the scale of the moving average. 
      cv.ConvertScale(moving_average, temp, 1.0, 0.0) 

      # Minus the current frame from the moving average. 
      cv.AbsDiff(color_image, temp, difference) 

      # Convert the image to grayscale. 
      cv.CvtColor(difference, grey_image, cv.CV_RGB2GRAY) 

      # Convert the image to black and white. 
      cv.Threshold(grey_image, grey_image, 70, 255, cv.CV_THRESH_BINARY) 

      # Dilate and erode to get people blobs 
      cv.Dilate(grey_image, grey_image, None, 18) 
      cv.Erode(grey_image, grey_image, None, 10) 

      storage = cv.CreateMemStorage(0) 
      contour = cv.FindContours(grey_image, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE) 
      points = [] 

      while contour: 
       bound_rect = cv.BoundingRect(list(contour)) 
       contour = contour.h_next() 

       pt1 = (bound_rect[0], bound_rect[1]) 
       pt2 = (bound_rect[0] + bound_rect[2], bound_rect[1] + bound_rect[3]) 
       points.append(pt1) 
       points.append(pt2) 
       cv.Rectangle(color_image, pt1, pt2, cv.CV_RGB(255,0,0), 1) 

      if len(points): 
       center_point = reduce(lambda a, b: ((a[0] + b[0])/2, (a[1] + b[1])/2), points) 
       cv.Circle(color_image, center_point, 40, cv.CV_RGB(255, 255, 255), 1) 
       cv.Circle(color_image, center_point, 30, cv.CV_RGB(255, 100, 0), 1) 
       cv.Circle(color_image, center_point, 20, cv.CV_RGB(255, 255, 255), 1) 
       cv.Circle(color_image, center_point, 10, cv.CV_RGB(255, 100, 0), 1) 

      cv.ShowImage("Target", color_image) 

      # Listen for ESC key 
      c = cv.WaitKey(7) % 0x100 
      if c == 27: 
       break 

if __name__=="__main__": 
    t = Target() 
    t.run() 
+1

Nhận một số video về nó tại http://appdelegateinc.com/blog/2010/08/02/motion-tracking-with-a-webcam/ –

+0

Cảm ơn bạn cho mã của bạn. Nó hoạt động, và nó có thể phát hiện tất cả các đối tượng chuyển động. Tuy nhiên, nó không thể theo dõi đối tượng chuyển động. Có cách nào tốt hơn để theo dõi đối tượng chuyển động không? Tôi đang tính toán trung tâm của mỗi đường bao, có thể so sánh vị trí thay đổi giữa 2 khung hình, nhưng phần cứng là, nếu có nhiều đường viền trong một khung, và có rất gần, thật khó để nói cho một đường viền, là đường viền tiếp theo trong khung tiếp theo. – qkzhu

+0

Đã một thời gian kể từ khi tôi sử dụng OpenCV, nhưng tôi nhớ lại bằng cách sử dụng bản trình diễn đi kèm với nguồn, nơi bạn kéo một hình vuông xung quanh một đối tượng bằng chuột để theo dõi. Nó lấy biểu đồ màu của vùng lựa chọn và tìm kiếm nó. Tôi tin rằng đó là đoạn mã này: https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/python/camshift.py?rev=2136 –

1

Xem bài đăng trên diễn đàn Motion tracking using OpenCV.

Tôi tin rằng bạn có khả năng đọc và dịch mã nguồn thành Python, phải không?

+0

tôi sẽ cung cấp cho nó một thử và cho bạn biết. –

+0

Tôi đã chuyển đổi nó sang Python, nhưng tôi e rằng tôi nhận được cùng một điểm mỗi lần sau khi gọi CalcOpticalFlowPyrLK. Bất kỳ ý tưởng? Đây là mã của tôi: http://friendpaste.com/7lM9Cmiyif1fIVwrgKBJnG –

0
if faces: 
    for ((x, y, w, h), n) in faces: 
     pt1 = (int(x * image_scale), int(y * image_scale)) 
     pt2 = (int((x + w) * image_scale), int((y + h) * image_scale)) 
     ptcx=((pt1[0]+pt2[0])/2)/128 
     ptcy=((pt1[1]+pt2[1])/2)/96 
     cv.Rectangle(gray, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0) 
     print ptcx; 
     print ptcy; 
     b=('S'+str(ptcx)+str(ptcy)); 

Đây là một phần của mã tôi đã cố gắng để có được trung tâm đối tượng chuyển động khi được theo dõi bằng ranh giới hình chữ nhật.

0

Liên kết sau theo dõi các phương tiện di chuyển cũng như đếm chúng. Nó dựa trên OpenCV và được viết bằng Python 2.7.
OpenCV and Python

Các vấn đề liên quan