How do I track motion using OpenCV in Python?

后端 未结 4 1560
轮回少年
轮回少年 2020-12-01 03:03

I can get frames from my webcam using OpenCV in Python. The camshift example is close to what I want, but I don\'t want human intervention to define the object. I want to ge

相关标签:
4条回答
  • 2020-12-01 03:44

    I've got some working code translated from the C version of code found in the blog post 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()
    
    0 讨论(0)
  • 2020-12-01 03:50
    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));
    

    This is the part of the code I tried to get the center of the moving object when tracked using a rectangular boundary.

    0 讨论(0)
  • 2020-12-01 03:52

    This following link tracks the moving vehicles as well as counting them. It is based on OpenCV and is written in Python 2.7.
    OpenCV and Python

    0 讨论(0)
  • 2020-12-01 03:56

    See the forum post Motion tracking using OpenCV.

    I believe you are capable of reading and translating the source code to Python, right?

    0 讨论(0)
提交回复
热议问题