예제 #1
0
def update_stationary_points(prev_histogram, new_features, learning_rate):
    new_distribution = np.zeros_like(prev_histogram)
    for point in new_features:
        cv.Circle(new_distribution, point, 2, cv.CV_RGB(255, 255, 255), -1)
    
    cv.RunningAvg(new_distribution, prev_histogram, learning_rate)
    return prev_histogram
예제 #2
0
    def run(self, params):
        """override: If there has been sufficient change in scene and the frame is not blurry return the frame. Else returns None"""
        # To get rid of camera artefacts
        frame1 = cv2.GaussianBlur(params[0][0], self.blurAmt, 0)
        frame1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)

        frame1 = cv.fromarray(frame1)

        if self.prevFrameRunningAvg == None:
            self.prevFrameRunningAvg = cv.CreateImage(
                cv.GetSize(frame1), 32, 1)  # image to store running avg

        cv.RunningAvg(frame1, self.prevFrameRunningAvg,
                      self.imgRunningAvgAlpha, None)

        meanDiff = np.mean(
            np.abs(
                np.asarray(frame1[:, :]).flatten() -
                np.asarray(self.prevFrameRunningAvg[:, :]).flatten()))

        # To study change levels
        # print "Mean Difference: ", meanDiff

        if meanDiff < self.changeThreshold:
            time.sleep(self.sleepTime)
            return None

        return params[0]
예제 #3
0
def average(*images):
    """Perform an averaging over the set of images
    count = len(images)
    for image in images:
        cv.addWeighted(average, 1, image, 1/count, 0, average)
    """
    if not len(images):
        return None

    fpath = images[0]
    first = Img(fpath)
    sz = first.size
    sizetup = sz.to_tuple()
    moving_average = cv.CreateImage(sizetup, 32, 1)
    result = cv.CreateImage(sizetup, 8, 1)
    count = 1
    result = first.cv_rep()
    for path in images:
        img = Img(path)
        rep = img.resize(sz)
        cv.RunningAvg(rep, moving_average, 1. / float(count), None)
        count += 1
    cv.ConvertScaleAbs(moving_average, result)
    out = new_name(fpath, 'average')
    cv.SaveImage(out, result)
    sys.stdout.write('%s\n' % out)
    return result
예제 #4
0
 def subtract(self, thres_chan):
     cv.RunningAvg(thres_chan, self.accumulator, self.adaptation_rate)
     cv.CvtScale(thres_chan, self.green32_img)
     cv.Sub(self.green32_img, self.accumulator, self.difference_img)
     cv.Threshold(self.difference_img, self.thresholded_img, self.threshold,
                  1, cv.CV_THRESH_BINARY)
     cv.Dilate(self.thresholded_img, self.thresholded_img, iterations=1)
     blob.remove_large_blobs(self.thresholded_img, max_area=self.max_area)
     return self.thresholded_img
예제 #5
0
    def run(self):
        global centroid
        frame = cv.QueryFrame(self.capture)
        while not frame:
            cv.WaitKey(10)
            frame = cv.QueryFrame(self.capture)

        frame_size = cv.GetSize(frame)

        # Capture the first frame from webcam for image properties
        display_image = cv.QueryFrame(self.capture)

        while not display_image:
            cv.WaitKey(10)
            display_image = cv.QueryFrame(self.capture)

        # Greyscale image, thresholded to create the motion mask:
        grey_image = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1)

        # The RunningAvg() function requires a 32-bit or 64-bit image...
        running_average_image = cv.CreateImage(cv.GetSize(frame),
                                               cv.IPL_DEPTH_32F, 3)
        # ...but the AbsDiff() function requires matching image depths:
        running_average_in_display_color_depth = cv.CloneImage(display_image)

        # RAM used by FindContours():
        mem_storage = cv.CreateMemStorage(0)

        # The difference between the running average and the current frame:
        difference = cv.CloneImage(display_image)

        target_count = 1
        last_target_count = 1
        last_target_change_t = 0.0
        k_or_guess = 1
        codebook = []
        frame_count = 0
        last_frame_entity_list = []

        t0 = time.time()

        # For toggling display:
        image_list = ["camera", "difference", "threshold", "display", "faces"]
        image_index = 0  # Index into image_list

        # Prep for text drawing:
        text_font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX, .5, .5, 0.0, 1,
                                cv.CV_AA)
        text_coord = (5, 15)
        text_color = cv.CV_RGB(255, 255, 255)

        ###############################
        ### Face detection stuff
        haar_cascade = cv.Load('haarcascades/haarcascade_frontalface_alt.xml')

        # Set this to the max number of targets to look for (passed to k-means):
        max_targets = 3

        while True:

            # Capture frame from webcam
            camera_image = cv.QueryFrame(self.capture)

            while not camera_image:
                cv.WaitKey(10)
                camera_image = cv.QueryFrame(self.capture)

            frame_count += 1
            print 'frame_count = ', frame_count
            frame_t0 = time.time()

            # Create an image with interactive feedback:
            display_image = cv.CloneImage(camera_image)

            # Create a working "color image" to modify / blur
            color_image = cv.CloneImage(display_image)

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

            # Use the Running Average as the static background
            # a = 0.020 leaves artifacts lingering way too long.
            # a = 0.320 works well at 320x240, 15fps.  (1/a is roughly num frames.)
            cv.RunningAvg(color_image, running_average_image, 0.320, None)

            # Convert the scale of the moving average.
            cv.ConvertScale(running_average_image,
                            running_average_in_display_color_depth, 1.0, 0.0)

            # Subtract the current frame from the moving average.
            cv.AbsDiff(color_image, running_average_in_display_color_depth,
                       difference)

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

            # Threshold the image to a black and white motion mask:
            cv.Threshold(grey_image, grey_image, 2, 255, cv.CV_THRESH_BINARY)
            # Smooth and threshold again to eliminate "sparkles"
            cv.Smooth(grey_image, grey_image, cv.CV_GAUSSIAN, 19, 0)
            cv.Threshold(grey_image, grey_image, 240, 255, cv.CV_THRESH_BINARY)

            grey_image_as_array = numpy.asarray(cv.GetMat(grey_image))
            non_black_coords_array = numpy.where(grey_image_as_array > 3)
            # Convert from numpy.where()'s two separate lists to one list of (x, y) tuples:
            non_black_coords_array = zip(non_black_coords_array[1],
                                         non_black_coords_array[0])

            points = [
            ]  # Was using this to hold either pixel coords or polygon coords.
            bounding_box_list = []

            # Now calculate movements using the white pixels as "motion" data
            contour = cv.FindContours(grey_image, mem_storage,
                                      cv.CV_RETR_CCOMP,
                                      cv.CV_CHAIN_APPROX_SIMPLE)

            while contour:

                bounding_rect = cv.BoundingRect(list(contour))
                point1 = (bounding_rect[0], bounding_rect[1])
                point2 = (bounding_rect[0] + bounding_rect[2],
                          bounding_rect[1] + bounding_rect[3])

                bounding_box_list.append((point1, point2))
                polygon_points = cv.ApproxPoly(list(contour), mem_storage,
                                               cv.CV_POLY_APPROX_DP)

                # To track polygon points only (instead of every pixel):
                #points += list(polygon_points)

                # Draw the contours:
                ###cv.DrawContours(color_image, contour, cv.CV_RGB(255,0,0), cv.CV_RGB(0,255,0), levels, 3, 0, (0,0) )
                cv.FillPoly(grey_image, [
                    list(polygon_points),
                ], cv.CV_RGB(255, 255, 255), 0, 0)
                cv.PolyLine(display_image, [
                    polygon_points,
                ], 0, cv.CV_RGB(255, 255, 255), 1, 0, 0)
                #cv.Rectangle( display_image, point1, point2, cv.CV_RGB(120,120,120), 1)

                contour = contour.h_next()

            # Find the average size of the bbox (targets), then
            # remove any tiny bboxes (which are prolly just noise).
            # "Tiny" is defined as any box with 1/10th the area of the average box.
            # This reduces false positives on tiny "sparkles" noise.
            box_areas = []
            for box in bounding_box_list:
                box_width = box[right][0] - box[left][0]
                box_height = box[bottom][0] - box[top][0]
                box_areas.append(box_width * box_height)

                #cv.Rectangle( display_image, box[0], box[1], cv.CV_RGB(255,0,0), 1)

            average_box_area = 0.0
            if len(box_areas):
                average_box_area = float(sum(box_areas)) / len(box_areas)

            trimmed_box_list = []
            for box in bounding_box_list:
                box_width = box[right][0] - box[left][0]
                box_height = box[bottom][0] - box[top][0]

                # Only keep the box if it's not a tiny noise box:
                if (box_width * box_height) > average_box_area * 0.1:
                    trimmed_box_list.append(box)

            # Draw the trimmed box list:
            bounding_box_list = merge_collided_bboxes(trimmed_box_list)

            # Draw the merged box list:
            for box in bounding_box_list:
                cv.Rectangle(display_image, box[0], box[1],
                             cv.CV_RGB(0, 255, 0), 1)

            # Here are our estimate points to track, based on merged & trimmed boxes:
            estimated_target_count = len(bounding_box_list)

            # Don't allow target "jumps" from few to many or many to few.
            # Only change the number of targets up to one target per n seconds.
            # This fixes the "exploding number of targets" when something stops moving
            # and the motion erodes to disparate little puddles all over the place.

            if frame_t0 - last_target_change_t < .350:  # 1 change per 0.35 secs
                estimated_target_count = last_target_count
            else:
                if last_target_count - estimated_target_count > 1:
                    estimated_target_count = last_target_count - 1
                if estimated_target_count - last_target_count > 1:
                    estimated_target_count = last_target_count + 1
                last_target_change_t = frame_t0

            # Clip to the user-supplied maximum:
            estimated_target_count = min(estimated_target_count, max_targets)

            # The estimated_target_count at this point is the maximum number of targets
            # we want to look for.  If kmeans decides that one of our candidate
            # bboxes is not actually a target, we remove it from the target list below.

            # Using the numpy values directly (treating all pixels as points):
            points = non_black_coords_array
            center_points = []

            if len(points):

                # If we have all the "target_count" targets from last frame,
                # use the previously known targets (for greater accuracy).
                k_or_guess = max(estimated_target_count,
                                 1)  # Need at least one target to look for.
                if len(codebook) == estimated_target_count:
                    k_or_guess = codebook

                #points = vq.whiten(array( points ))  # Don't do this!  Ruins everything.
                codebook, distortion = vq.kmeans(array(points), k_or_guess)

                # Convert to tuples (and draw it to screen)
                for center_point in codebook:
                    center_point = (int(center_point[0]), int(center_point[1]))
                    center_points.append(center_point)
                    #cv.Circle(display_image, center_point, 10, cv.CV_RGB(255, 0, 0), 2)
                    #cv.Circle(display_image, center_point, 5, cv.CV_RGB(255, 0, 0), 3)

            # Now we have targets that are NOT computed from bboxes -- just
            # movement weights (according to kmeans).  If any two targets are
            # within the same "bbox count", average them into a single target.
            #
            # (Any kmeans targets not within a bbox are also kept.)

            trimmed_center_points = []
            removed_center_points = []

            for box in bounding_box_list:
                # Find the centers within this box:
                center_points_in_box = []

                for center_point in center_points:
                    if  center_point[0] < box[right][0] and center_point[0] > box[left][0] and \
                        center_point[1] < box[bottom][1] and center_point[1] > box[top][1] :

                        # This point is within the box.
                        center_points_in_box.append(center_point)

                # Now see if there are more than one.  If so, merge them.
                if len(center_points_in_box) > 1:
                    # Merge them:
                    x_list = y_list = []
                    for point in center_points_in_box:
                        x_list.append(point[0])
                        y_list.append(point[1])

                    average_x = int(float(sum(x_list)) / len(x_list))
                    average_y = int(float(sum(y_list)) / len(y_list))

                    trimmed_center_points.append((average_x, average_y))

                    # Record that they were removed:
                    removed_center_points += center_points_in_box

                if len(center_points_in_box) == 1:
                    trimmed_center_points.append(
                        center_points_in_box[0])  # Just use it.

            # If there are any center_points not within a bbox, just use them.
            # (It's probably a cluster comprised of a bunch of small bboxes.)
            for center_point in center_points:
                if (not center_point in trimmed_center_points) and (
                        not center_point in removed_center_points):
                    trimmed_center_points.append(center_point)

            # Determine if there are any new (or lost) targets:
            actual_target_count = len(trimmed_center_points)
            last_target_count = actual_target_count

            # Now build the list of physical entities (objects)
            this_frame_entity_list = []

            # An entity is list: [ name, color, last_time_seen, last_known_coords ]
            for target in trimmed_center_points:
                # Is this a target near a prior entity (same physical entity)?
                entity_found = False
                entity_distance_dict = {}

                for entity in last_frame_entity_list:

                    entity_coords = entity[3]
                    delta_x = entity_coords[0] - target[0]
                    delta_y = entity_coords[1] - target[1]

                    distance = sqrt(pow(delta_x, 2) + pow(delta_y, 2))
                    entity_distance_dict[distance] = entity

                # Did we find any non-claimed entities (nearest to furthest):
                distance_list = entity_distance_dict.keys()
                distance_list.sort()

                for distance in distance_list:
                    # Yes; see if we can claim the nearest one:
                    nearest_possible_entity = entity_distance_dict[distance]

                    # Don't consider entities that are already claimed:
                    if nearest_possible_entity in this_frame_entity_list:
                        #print "Target %s: Skipping the one iwth distance: %d at %s, C:%s" % (target, distance, nearest_possible_entity[3], nearest_possible_entity[1] )
                        continue

                    #print "Target %s: USING the one iwth distance: %d at %s, C:%s" % (target, distance, nearest_possible_entity[3] , nearest_possible_entity[1])
                    # Found the nearest entity to claim:
                    entity_found = True
                    nearest_possible_entity[
                        2] = frame_t0  # Update last_time_seen
                    nearest_possible_entity[
                        3] = target  # Update the new location
                    this_frame_entity_list.append(nearest_possible_entity)
                    #log_file.write( "%.3f MOVED %s %d %d\n" % ( frame_t0, nearest_possible_entity[0], nearest_possible_entity[3][0], nearest_possible_entity[3][1]  ) )
                    break

                if entity_found == False:
                    # It's a new entity.
                    color = (random.randint(0, 255), random.randint(0, 255),
                             random.randint(0, 255))
                    name = hashlib.md5(str(frame_t0) +
                                       str(color)).hexdigest()[:6]
                    last_time_seen = frame_t0

                    new_entity = [name, color, last_time_seen, target]
                    this_frame_entity_list.append(new_entity)
                    #log_file.write( "%.3f FOUND %s %d %d\n" % ( frame_t0, new_entity[0], new_entity[3][0], new_entity[3][1]  ) )

            # Now "delete" any not-found entities which have expired:
            entity_ttl = 1.0  # 1 sec.

            for entity in last_frame_entity_list:
                last_time_seen = entity[2]
                if frame_t0 - last_time_seen > entity_ttl:
                    # It's gone.
                    #log_file.write( "%.3f STOPD %s %d %d\n" % ( frame_t0, entity[0], entity[3][0], entity[3][1]  ) )
                    pass
                else:
                    # Save it for next time... not expired yet:
                    this_frame_entity_list.append(entity)

            # For next frame:
            last_frame_entity_list = this_frame_entity_list

            # Draw the found entities to screen:
            for entity in this_frame_entity_list:
                center_point = entity[3]
                c = entity[1]  # RGB color tuple
                cv.Circle(display_image, center_point, 20,
                          cv.CV_RGB(c[0], c[1], c[2]), 1)
                cv.Circle(display_image, center_point, 15,
                          cv.CV_RGB(c[0], c[1], c[2]), 1)
                cv.Circle(display_image, center_point, 10,
                          cv.CV_RGB(c[0], c[1], c[2]), 2)
                cv.Circle(display_image, center_point, 5,
                          cv.CV_RGB(c[0], c[1], c[2]), 3)

            #print "min_size is: " + str(min_size)
            # Listen for ESC or ENTER key
            c = cv.WaitKey(7) % 0x100
            if c == 27 or c == 10:
                break

            # Toggle which image to show
            if chr(c) == 'd':
                image_index = (image_index + 1) % len(image_list)

            image_name = image_list[image_index]
            image_name = "display"
            # for black and white: Threshold
            #for colored = display

            # Display frame to user
            if image_name == "camera":
                image = camera_image
                cv.PutText(image, "Camera (Normal)", text_coord, text_font,
                           text_color)
            elif image_name == "difference":
                image = difference
                cv.PutText(image, "Difference Image", text_coord, text_font,
                           text_color)
            elif image_name == "display":
                image = display_image
                cv.PutText(image, "Targets (w/AABBs and contours)", text_coord,
                           text_font, text_color)
            elif image_name == "threshold":
                # Convert the image to color.
                cv.CvtColor(grey_image, display_image, cv.CV_GRAY2RGB)
                image = display_image  # Re-use display image here
                cv.PutText(image, "Motion Mask", text_coord, text_font,
                           text_color)
            elif image_name == "faces":
                # Do face detection
                detect_faces(camera_image, haar_cascade, mem_storage)
                image = camera_image  # Re-use camera image here
                cv.PutText(image, "Face Detection", text_coord, text_font,
                           text_color)

            cv.ShowImage("Target", image)

            if self.writer:
                cv.WriteFrame(self.writer, image)

            arr = numpy.asarray(image[:, :])
            move_thresh = 100
            counter = 0

            # If only using a camera, then there is no time.sleep() needed,
            # because the camera clips us to 15 fps.  But if reading from a file,
            # we need this to keep the time-based target clipping correct:
            frame_t1 = time.time()

            centroid = get_centroid(trimmed_center_points)
            print 'centroid = ', centroid

            # If reading from a file, put in a forced delay:
            if not self.writer:
                delta_t = frame_t1 - frame_t0
                if delta_t < (1.0 / 15.0): time.sleep((1.0 / 15.0) - delta_t)

        t1 = time.time()
        time_delta = t1 - t0
        processed_fps = float(frame_count) / time_delta
        print "Got %d frames. %.1f s. %f fps." % (frame_count, time_delta,
                                                  processed_fps)
예제 #6
0
    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 not self.kill_received:
            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:
                #print list(contour)
                bound_rect = cv.BoundingRect(list(contour))
                contour = contour.h_next()
                print bound_rect

                #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)
                #print pt1,pt2
                self.lock.acquire()
                time.sleep(0.5)
                #time.sleep(2)
                self.client.send(OSCMessage("/shast/beebox/x", bound_rect[0]))
                self.client.send(OSCMessage("/shast/beebox/y", bound_rect[1]))
                self.lock.release()
예제 #7
0
    def run(self):
        frame = cv.QueryFrame(self.capture)
        frame_size = cv.GetSize(frame)

        # Capture the first frame from webcam for image properties
        display_image = cv.QueryFrame(self.capture)

        # Greyscale image, thresholded to create the motion mask:
        grey_image = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1)

        # The RunningAvg() function requires a 32-bit or 64-bit image...
        running_average_image = cv.CreateImage(cv.GetSize(frame),
                                               cv.IPL_DEPTH_32F, 3)
        # ...but the AbsDiff() function requires matching image depths:
        running_average_in_display_color_depth = cv.CloneImage(display_image)

        # RAM used by FindContours():
        mem_storage = cv.CreateMemStorage(0)

        # The difference between the running average and the current frame:
        difference = cv.CloneImage(display_image)

        target_count = 1
        last_target_count = 1
        last_target_change_t = 0.0
        k_or_guess = 1
        codebook = []
        frame_count = 0
        last_frame_entity_list = []

        t0 = time.time()

        # For toggling display:
        image_list = ["display", "difference", "threshold", "camera", "faces"]
        image_index = 0  # Index into image_list

        # Prep for text drawing:
        text_font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX, .5, .5, 0.0, 1,
                                cv.CV_AA)
        text_coord = (5, 15)
        text_color = cv.CV_RGB(255, 255, 255)

        haar_cascade = cv.Load(
            '/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml'
        )

        max_targets = 3

        while True:

            camera_image = cv.QueryFrame(self.capture)

            frame_count += 1
            frame_t0 = time.time()

            # Create an image with interactive feedback:
            display_image = cv.CloneImage(camera_image)

            # Create a working "color image" to modify / blur
            color_image = cv.CloneImage(display_image)

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

            # Use the Running Average as the static background
            # a = 0.020 leaves artifacts lingering way too long.
            # a = 0.320 works well at 320x240, 15fps.  (1/a is roughly num frames.)
            cv.RunningAvg(color_image, running_average_image, 0.420, None)

            # Convert the scale of the moving average.
            cv.ConvertScale(running_average_image,
                            running_average_in_display_color_depth, 1.0, 0.0)

            # Subtract the current frame from the moving average.
            cv.AbsDiff(color_image, running_average_in_display_color_depth,
                       difference)

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

            # Threshold the image to a black and white motion mask:
            cv.Threshold(grey_image, grey_image, 2, 255, cv.CV_THRESH_BINARY)
            # Smooth and threshold again to eliminate "sparkles"
            cv.Smooth(grey_image, grey_image, cv.CV_GAUSSIAN, 19, 0)
            cv.Threshold(grey_image, grey_image, 240, 255, cv.CV_THRESH_BINARY)
            cv.Dilate(grey_image, grey_image, None, 18)
            cv.Erode(grey_image, grey_image, None, 20)

            grey_image_as_array = numpy.asarray(cv.GetMat(grey_image))
            non_black_coords_array = numpy.where(grey_image_as_array > 3)
            # Convert from numpy.where()'s two separate lists to one list of (x, y) tuples:
            non_black_coords_array = zip(non_black_coords_array[1],
                                         non_black_coords_array[0])

            points = [
            ]  # Was using this to hold either pixel coords or polygon coords.
            bounding_box_list = []

            # Now calculate movements using the white pixels as "motion" data
            contour = cv.FindContours(grey_image, mem_storage,
                                      cv.CV_RETR_CCOMP,
                                      cv.CV_CHAIN_APPROX_SIMPLE)

            while contour:

                bounding_rect = cv.BoundingRect(list(contour))
                point1 = (bounding_rect[0], bounding_rect[1])
                point2 = (bounding_rect[0] + bounding_rect[2],
                          bounding_rect[1] + bounding_rect[3])

                bounding_box_list.append((point1, point2))
                polygon_points = cv.ApproxPoly(list(contour), mem_storage,
                                               cv.CV_POLY_APPROX_DP)

                # To track polygon points only (instead of every pixel):
                #points += list(polygon_points)

                # Draw the contours:
                levels = 0
                cv.DrawContours(color_image, contour, cv.CV_RGB(255, 0, 0),
                                cv.CV_RGB(0, 255, 0), levels, 3, 0, (0, 0))
                cv.FillPoly(grey_image, [
                    list(polygon_points),
                ], cv.CV_RGB(255, 255, 255), 0, 0)
                cv.PolyLine(display_image, [
                    polygon_points,
                ], 0, cv.CV_RGB(255, 255, 255), 1, 0, 0)
                #cv.Rectangle( display_image, point1, point2, cv.CV_RGB(120,120,120), 1)

                contour = contour.h_next()

            # Find the average size of the bbox (targets), then
            # remove any tiny bboxes (which are prolly just noise).
            # "Tiny" is defined as any box with 1/10th the area of the average box.
            # This reduces false positives on tiny "sparkles" noise.
            box_areas = []
            for box in bounding_box_list:
                box_width = box[right][0] - box[left][0]
                box_height = box[bottom][0] - box[top][0]
                box_areas.append(box_width * box_height)

                #cv.Rectangle( display_image, box[0], box[1], cv.CV_RGB(255,0,0), 1)

            average_box_area = 0.0
            if len(box_areas):
                average_box_area = float(sum(box_areas)) / len(box_areas)

            trimmed_box_list = []
            for box in bounding_box_list:
                box_width = box[right][0] - box[left][0]
                box_height = box[bottom][0] - box[top][0]

                # Only keep the box if it's not a tiny noise box:
                if (box_width * box_height) > average_box_area * 0.1:
                    trimmed_box_list.append(box)

            # Draw the trimmed box list:
            #for box in trimmed_box_list:
            #	cv.Rectangle( display_image, box[0], box[1], cv.CV_RGB(0,255,0), 2 )

            bounding_box_list = merge_collided_bboxes(trimmed_box_list)

            # Draw the merged box list:
            for box in bounding_box_list:
                cv.Rectangle(display_image, box[0], box[1],
                             cv.CV_RGB(0, 255, 0), 1)

            # Here are our estimate points to track, based on merged & trimmed boxes:
            estimated_target_count = len(bounding_box_list)

            if frame_t0 - last_target_change_t < .650:  # 1 change per 0.35 secs
                estimated_target_count = last_target_count
            else:
                if last_target_count - estimated_target_count > 1:
                    estimated_target_count = last_target_count - 1
                if estimated_target_count - last_target_count > 1:
                    estimated_target_count = last_target_count + 1
                last_target_change_t = frame_t0

            # Clip to the user-supplied maximum:
            estimated_target_count = min(estimated_target_count, max_targets)
            points = non_black_coords_array
            center_points = []

            if len(points):

                k_or_guess = max(estimated_target_count,
                                 1)  # Need at least one target to look for.
                if len(codebook) == estimated_target_count:
                    k_or_guess = codebook

                #points = vq.whiten(array( points ))  # Don't do this!  Ruins everything.
                codebook, distortion = vq.kmeans(array(points), k_or_guess)

                # Convert to tuples (and draw it to screen)
                for center_point in codebook:
                    center_point = (int(center_point[0]), int(center_point[1]))
                    center_points.append(center_point)
            trimmed_center_points = []
            removed_center_points = []

            for box in bounding_box_list:
                # Find the centers within this box:
                center_points_in_box = []

                for center_point in center_points:
                    if center_point[0] < box[right][0] and center_point[0] > box[left][0] and \
                     center_point[1] < box[bottom][1] and center_point[1] > box[top][1] :

                        # This point is within the box.
                        center_points_in_box.append(center_point)

                # Now see if there are more than one.  If so, merge them.
                if len(center_points_in_box) > 1:
                    # Merge them:
                    x_list = y_list = []
                    for point in center_points_in_box:
                        x_list.append(point[0])
                        y_list.append(point[1])

                    average_x = int(float(sum(x_list)) / len(x_list))
                    average_y = int(float(sum(y_list)) / len(y_list))

                    trimmed_center_points.append((average_x, average_y))

                    # Record that they were removed:
                    removed_center_points += center_points_in_box

                if len(center_points_in_box) == 1:
                    trimmed_center_points.append(
                        center_points_in_box[0])  # Just use it.

            # If there are any center_points not within a bbox, just use them.
            # (It's probably a cluster comprised of a bunch of small bboxes.)
            for center_point in center_points:
                if (not center_point in trimmed_center_points) and (
                        not center_point in removed_center_points):
                    trimmed_center_points.append(center_point)

            # Determine if there are any new (or lost) targets:
            actual_target_count = len(trimmed_center_points)
            last_target_count = actual_target_count

            # Now build the list of physical entities (objects)
            this_frame_entity_list = []

            # An entity is list: [ name, color, last_time_seen, last_known_coords ]

            for target in trimmed_center_points:

                # Is this a target near a prior entity (same physical entity)?
                entity_found = False
                entity_distance_dict = {}

                for entity in last_frame_entity_list:

                    entity_coords = entity[3]
                    delta_x = entity_coords[0] - target[0]
                    delta_y = entity_coords[1] - target[1]

                    distance = sqrt(pow(delta_x, 2) + pow(delta_y, 2))
                    entity_distance_dict[distance] = entity

                # Did we find any non-claimed entities (nearest to furthest):
                distance_list = entity_distance_dict.keys()
                distance_list.sort()

                for distance in distance_list:

                    # Yes; see if we can claim the nearest one:
                    nearest_possible_entity = entity_distance_dict[distance]

                    if nearest_possible_entity in this_frame_entity_list:
                        continue

                    # Found the nearest entity to claim:
                    entity_found = True
                    nearest_possible_entity[
                        2] = frame_t0  # Update last_time_seen
                    nearest_possible_entity[
                        3] = target  # Update the new location
                    this_frame_entity_list.append(nearest_possible_entity)
                    break

                if entity_found == False:
                    # It's a new entity.
                    color = (random.randint(0, 255), random.randint(0, 255),
                             random.randint(0, 255))
                    name = hashlib.md5(str(frame_t0) +
                                       str(color)).hexdigest()[:6]
                    last_time_seen = frame_t0

                    new_entity = [name, color, last_time_seen, target]
                    this_frame_entity_list.append(new_entity)

            # Now "delete" any not-found entities which have expired:
            entity_ttl = 1.0  # 1 sec.

            ent_count = 0
            for entity in last_frame_entity_list:
                last_time_seen = entity[2]
                if frame_t0 - last_time_seen > entity_ttl:
                    pass
                else:
                    # Save it for next time... not expired yet:
                    this_frame_entity_list.append(entity)
                    ent_count += 1

            # For next frame:
            last_frame_entity_list = this_frame_entity_list

            # Draw the found entities to screen:
            count = 0
            if ent_count != 0:
                entity = this_frame_entity_list[0]
                center_point = entity[3]
                c = entity[1]  # RGB color tuple
                # print '%s %d %d %d' % (entity[0], count, center_point[0], center_point[1])
                cv.Circle(display_image, center_point, 20,
                          cv.CV_RGB(c[0], c[1], c[2]), 1)
                cv.Circle(display_image, center_point, 15,
                          cv.CV_RGB(c[0], c[1], c[2]), 1)
                cv.Circle(display_image, center_point, 10,
                          cv.CV_RGB(c[0], c[1], c[2]), 2)
                cv.Circle(display_image, center_point, 5,
                          cv.CV_RGB(c[0], c[1], c[2]), 3)

            text_font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX, .5, .5, 0.0, 1,
                                    cv.CV_AA)
            text_coord = (5, 15)
            text_color = cv.CV_RGB(255, 255, 255)

            x = 50 + (center_point[0] * 80 / 320)
            y = 20 + (center_point[1] * 80 / 240)
            if self.have_eye:
                self.ServoMove(0, int(x))
                self.ServoMove(1, int(y))

            s = '%3.0d %3.0d' % (x, y)
            cv.PutText(display_image, str(s), text_coord, text_font,
                       text_color)

            #print "min_size is: " + str(min_size)
            # Listen for ESC or ENTER key
            c = cv.WaitKey(7) % 0x100
            if c == 27 or c == 10:
                break

            # Toggle which image to show
            if chr(c) == 'd':
                image_index = (image_index + 1) % len(image_list)

            image_name = image_list[image_index]

            # Display frame to user
            if image_name == "display":
                image = display_image

# cv.PutText( image, "AABBs and contours", text_coord, text_font, text_color )
            elif image_name == "camera":
                image = camera_image
                cv.PutText(image, "No overlay", text_coord, text_font,
                           text_color)
            elif image_name == "difference":
                image = difference
                cv.PutText(image, "Difference Image", text_coord, text_font,
                           text_color)
            elif image_name == "faces":
                # Do face detection
                detect_faces(camera_image, haar_cascade, mem_storage)
                image = camera_image  # Re-use camera image here
                cv.PutText(image, "Face Detection", text_coord, text_font,
                           text_color)
            elif image_name == "threshold":
                # Convert the image to color.
                cv.CvtColor(grey_image, display_image, cv.CV_GRAY2RGB)
                image = display_image  # Re-use display image here
                cv.PutText(image, "Motion Mask", text_coord, text_font,
                           text_color)

            cv.ShowImage("Target", image)

            if self.writer:
                cv.WriteFrame(self.writer, image)

            frame_t1 = time.time()

        t1 = time.time()
        time_delta = t1 - t0
        processed_fps = float(frame_count) / time_delta
        print "Got %d frames. %.1f s. %f fps." % (frame_count, time_delta,
                                                  processed_fps)
예제 #8
0
파일: first.py 프로젝트: arjun001/project
    def detect_motion(self, sensitivity='medium'):

        #Finding Video Size from the first frame
        frame = cv.QueryFrame(self.video_handle)
        frame_size = cv.GetSize(frame)
        '''Initializing Image Variables(to be used in motion detection) with required types and sizes'''
        # Image containg instantaneous moving rectangles
        color_image = cv.CreateImage(frame_size, 8, 3)
        # Resizing to window size
        color_output = cv.CreateImage(self.window_size, 8, 3)
        # Grey Image used for contour detection
        grey_image = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1)
        # Image storing background (moving pixels are averaged over small time window)
        moving_average = cv.CreateImage(frame_size, cv.IPL_DEPTH_32F, 3)
        # Image for storing tracks resized to window size
        track_output = cv.CreateImage(self.window_size, cv.IPL_DEPTH_8U, 3)
        track_image, track_win = self.init_track_window(frame)

        def totuple(a):
            try:
                return tuple(totuple(i) for i in a)
            except TypeError:
                return a

        first = True
        # Infinite loop for continuous detection of motion
        while True:
            '''########## Pixelwise Detection of Motion in a frame ###########'''
            # Capturing Frame
            color_image = cv.QueryFrame(self.video_handle)

            ##### Sensitivity Control 1 #####
            if (sensitivity == 'medium') or (sensitivity == 'low'):
                # Gaussian Smoothing
                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, .020, None)

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

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

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

            ##### Sensitivity Control 2 #####
            sens_thres = 90 if (sensitivity == 'low') or (self.opt
                                                          == 'cam') else 40
            # Convert the image to black and white.
            cv.Threshold(grey_image, grey_image, sens_thres, 255,
                         cv.CV_THRESH_BINARY)
            '''### Blobing moved adjacent pixels, finding closed contours and bounding rectangles ###'''
            ##### Sensitivity Control 3 #####
            if (sensitivity == 'medium') or (sensitivity == 'low'):
                # Dilate and erode to get people blobs
                ker_size = 20 if self.opt == 'file' else 50
                cv.Dilate(grey_image, grey_image, None, ker_size)
                cv.Erode(grey_image, grey_image, None, 3)

            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))
                polygon_points = cv.ApproxPoly(list(contour), storage,
                                               cv.CV_POLY_APPROX_DP)

                pt1 = (bound_rect[0], bound_rect[1])
                pt2 = (bound_rect[0] + bound_rect[2],
                       bound_rect[1] + bound_rect[3])

                if (self.opt == 'file'):
                    points.append(pt1)
                    points.append(pt2)
                elif (bound_rect[0] - bound_rect[2] >
                      20) and (bound_rect[1] - bound_rect[3] > 20):
                    points.append(pt1)
                    points.append(pt2)

                box = cv.MinAreaRect2(polygon_points)
                box2 = cv.BoxPoints(box)
                box3 = np.int0(np.around(box2))
                box4 = totuple(box3)
                box5 = box4 + (box4[0], )

                # Filling the contours in the greyscale image (visual blobs instead of just contours)
                cv.FillPoly(grey_image, [
                    list(polygon_points),
                ], cv.CV_RGB(255, 255, 255), 0, 0)

                # Following line to draw detected contours as well
                #cv.PolyLine( color_image, [ polygon_points, ], 0, cv.CV_RGB(255,0,0), 1, 0, 0 )

                # Drawing Rectangle around the detected contour
                cv.PolyLine(color_image, [list(box5)], 0, (0, 255, 255), 2)

                if len(points):  # (self.opt == 'file') and
                    center1 = (pt1[0] + pt2[0]) / 2
                    center2 = (pt1[1] + pt2[1]) / 2
                    cv.Circle(color_image, (center1, center2), 5,
                              cv.CV_RGB(0, 255, 0), -1)
                    rad = 3 if self.opt == 'file' else 5
                    cv.Circle(track_image, (center1, center2), rad,
                              cv.CV_RGB(255, 128, 0), -1)

                contour = contour.h_next()

            # Uncomment to track centroid of all the moved boxes (only for WebCam)
            '''
            if (self.opt == 'cam') and len(points):
                center_point = reduce(lambda a, b: ((a[0] + b[0]) / 2, (a[1] + b[1]) / 2), points)
                cv.Circle(track_image, center_point, 15, cv.CV_RGB(255, 128, 0), -1)
            '''
            cv.Resize(color_image, color_output, cv.CV_INTER_AREA)
            cv.ShowImage("Original", color_output)

            cv.Resize(track_image, track_output, cv.CV_INTER_AREA)
            cv.ShowImage(track_win, track_output)

            # Listen for ESC key
            c = cv.WaitKey(7) % 0x100
            if (0xFF & c == 27):
                cv.SaveImage('Tracks_img_042_' + sensitivity + '.jpeg',
                             track_output)
                break
예제 #9
0
    def run(self):
        # Capture first frame to get size
        frame = cv.QueryFrame(self.capture)
        frame_size = cv.GetSize(frame)
        new_size = ( frame_size[0] / 2, frame_size[1] / 2)
        color_image = cv.CreateImage(new_size, 8, 3)
        grey_image = cv.CreateImage(new_size, cv.IPL_DEPTH_8U, 1)
        moving_average = cv.CreateImage(new_size, cv.IPL_DEPTH_32F, 3)
        font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX_SMALL, 1, 1, 0, 1, 1)
        first = True
        k = 0        
        while True:
            k+=1

            captured_image = cv.QueryFrame(self.capture)
            color_image = cv.CreateImage(new_size, captured_image.depth, captured_image.nChannels)
            cv.Resize(captured_image, color_image)
            # 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_TC89_KCOS)
            points = []
            #cv.DrawContours(color_image, contour, cv.CV_RGB(255,0,0), cv.CV_RGB(255,0,255), 2, 1, 8, (0, 0))
            i = 0
            while contour:
                self.observed_occupancy = True

                bound_rect = cv.BoundingRect(list(contour))

                center_x = bound_rect[0] + (bound_rect[2]/2)
                center_y = bound_rect[1] + (bound_rect[3]/2)
                #if center_y < 200:
                #    continue
                i+=1
                closest_distance = 10000
                closest_object = None
                for to in self.tracked_objects: 
                    current_distance = math.hypot(to.latest_position[0] - center_x, to.latest_position[1] - center_y)
                    closest_distance = min(closest_distance, current_distance)                    
                    #print "DISTANCES: ", str(closest_distance), str(current_distance)
                    if current_distance == closest_distance:
                        closest_object = to

                if closest_object is None:
                    #print "OBJECT IS NEW"
                    self.tracked_objects.append(TrackedObject((center_x, center_y), [(center_x, center_y)], "new"))
                else: 
                    #print "CLOSEST OBJECT: ", closest_object.latest_position
                    closest_object.movement_vector.append((center_x, center_y))
                    closest_object.latest_position = (center_x, center_y)
                #print "AMOUNT OF OBJECTS: ", str(len(self.tracked_objects))

                if closest_object is not None:
                    cv.Line(color_image, closest_object.latest_position, (center_x, center_y), cv.CV_RGB(0,255,0))
                   
                    #closest_x = min(closest_x, to.latest_position[0])
                    #closest_y = min(closest_y, to.latest_position[0])

                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(0,0,255), 1)
                cv.PutText(color_image, str(i), pt1, font, cv.CV_RGB(255,0,255))
                cv.Circle(color_image, (center_x, center_y), 2, cv.CV_RGB(255,0,255), 2, 8, 0)

            #print "LEN ", len(self.tracked_objects)
            #if len(self.tracked_objects) > 0 and self.tracked_objects[0] is not None:
            #    #print "ENTRE"
            #    obj_vector = self.tracked_objects[0].movement_vector
            #    print "MVV LEN ", len(obj_vector)
            #    for index in range(0, len(obj_vector)-2):
            #        try:
            #            print "Index ", index, "len(obj_vector) ", len(obj_vector)
            #            cv.Line(color_image, obj_vector[index], obj_vector[index+1], cv.CV_RGB(0,255,0))
            #
            #        except: print "oops"

            #print "Iteration ", k, " Vector: ", vectors["1"]
            cv.ShowImage("Target", color_image)

            time_passed = time.time() - self.last_request
            request_threshold = 60
            if time_passed > request_threshold:
                self.send_occupancy()
                self.send_image(color_image)
            
            
            #Listen for ESC key
            c = cv.WaitKey(10)
            #c = cv.WaitKey(7) % 0x100
            if c == 27:
                break  
예제 #10
0
    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)
                print center_point

            cv.ShowImage("Target", color_image)

            # Listen for ESC key
            c = cv.WaitKey(7) % 0x100
            if c == 27:
                break
예제 #11
0
    def run(self):
        template_filename = os.path.join(root, 'flash', 'fft2', 'processed', 'first_screen.png')
        template = cv2.imread(template_filename, cv2.CV_LOAD_IMAGE_GRAYSCALE)

        cv2.imshow('image', template)
        w, h = template.shape[::-1]

        #find starting image
        map_filename = os.path.join(root, 'flash', 'fft2', 'processed', 'aligned_localization_data_map.png')

        mapper = LocalizeMap(map_filename)

        map_box = mapper.localize(template, None)
        (x0, y0, x1, y1) = map_box
        reference = mapper.reference[y0:y1, x0:x1]
        cv2.imshow('image', reference)
        #blank_image = np.zeros(template.shape, np.uint8)
        
        cv2.waitKey(0)
        cv2.destroyAllWindows()

        return 

        # 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
예제 #12
0
    def run(self):
        frame = cv.QueryFrame(self.capture)  # Capture the first frame
        frame_size = cv.GetSize(
            frame)  # Get the size of the frame in pixels e.g. 640x480
        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)

                xangle = 0
                if center_point[0] < 320:
                    xangle = int(90 + ((center_point[0] - 320) / 22.857))
                elif center_point[0] == 320:
                    xangle = 90
                else:
                    xangle = int(90 + center_point[0] / 22.857)
                yangle = 0
                if center_point[1] < 240:
                    yangle = int(90 + center_point[1] / 12)
                elif center_point[1] == 240:
                    yangle = 93
                else:
                    yangle = int(90 - ((center_point[1] - 240) / 12))

                print "Xangle = ", xangle
                self.firecontrol.sendcoord(0xff, xangle, yangle)
                current_position = center_point
                self.firecontrol.fire(0xfe)
                print "Located at: ", current_position
                #               fire_control.engage()
                #               print "Fire: ", self.pos

                self.pos = center_point
            cv.ShowImage("Target", color_image)
            # Listen for ESC key
            c = cv.WaitKey(7) % 0x100
            if c == 27:
                break
예제 #13
0
    def run(self, args):
        # 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
        #closest_to_left = cv.GetSize(frame)[0]
        #closest_to_right = cv.GetSize(frame)[1]
        while True:


            color_image = cv.QueryFrame(self.capture)
            if not color_image:
                print "END OF FILE"
                break
        
            # 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, args.motiondelay, 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)
            if DEBUG_VISUAL:
                cv.ShowImage("Grey_image: Difference", grey_image)
            # Convert the image to black and white.
            cv.Threshold(grey_image, grey_image, args.threshold, 255, cv.CV_THRESH_BINARY)
            if DEBUG_VISUAL:
                cv.ShowImage("Grey_image: Black n White", grey_image)
#
            # Dilate and erode to get people blobs
            cv.Dilate(grey_image, grey_image, None, args.dilate)
            if DEBUG_VISUAL:
                cv.ShowImage("Dilate", grey_image)
            cv.Erode(grey_image, grey_image, None, args.erode)
            if DEBUG_VISUAL:
                cv.ShowImage("Erode", grey_image)

            storage = cv.CreateMemStorage(0)
            contour = cv.FindContours(grey_image, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
            
            counter = 0
            while contour:
                counter += 1
                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])
                cv.Rectangle(color_image, pt1, pt2, cv.CV_RGB(255,0,0), 1)
            print counter
            
            cv.ShowImage("Target", color_image)

            # Listen for ESC key
            c = cv.WaitKey(7) % 0x100
            if c == 27:
                break
예제 #14
0
    def run(self):
        frame = cv.QueryFrame(self.capture)
        frame_size = cv.GetSize(frame)
        grey_image = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1)
        run_mean = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_32F, 3)
        diff = None
        movement = []

        while True:
            # Capture frame from webcam
            color_image = cv.QueryFrame(self.capture)
            cv.Smooth(color_image, color_image, cv.CV_GAUSSIAN, 3, 0)

            if not diff:
                # Initialize
                diff = cv.CloneImage(color_image)
                temp = cv.CloneImage(color_image)
                cv.ConvertScale(color_image, run_mean, 1.0, 0.0)
            else:
                cv.RunningAvg(color_image, run_mean, 0.020, None)

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

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

            # Convert the image to grayscale.
            cv.CvtColor(diff, 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 object blobs
            cv.Dilate(grey_image, grey_image, None, 18)
            cv.Erode(grey_image, grey_image, None, 10)

            # Calculate movements
            store_movement = cv.CreateMemStorage(0)
            contour = cv.FindContours(grey_image, store_movement, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
            points = []

            while contour:
                # Draw rectangles
                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)

            num_points = len(points)

            if num_points:
                x = 0
                for point in points:
                    x += point[0]
                x /= num_points

                movement.append(x)

            if len(movement) > 0 and numpy.average(numpy.diff(movement[-30:-1])) > 0:
              print 'Left'
            else:
              print 'Right'

            # Display frame to user
            cv.ShowImage("Object Direction of Motion", color_image)

            # Listen for ESC or ENTER key
            c = cv.WaitKey(7) % 0x100
            if (0xFF & c == 27):
               break
예제 #15
0
    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), 3)

            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), 8)
                print center_point     

########################################  contour center  ####################################################################
                
                cx = ((bound_rect[2])/2)+bound_rect[0]              #(0,0)################
                cy = ((bound_rect[3])/2)+bound_rect[1]              ######################   
                print cx, cy                                        ######################<--160x120 pix
                                                                    ######################
                                                                    ############(160,120)#
######################################### servo motor ######################################################


                if cx < width*5/ 10 and cx > width*4/ 10 :                  
                     arduino.write('e')                
                     print 'e'
                if cx < width*4/ 10 and cx > width*3/ 10 :                  
                     arduino.write('d')                
                     print 'd'
                if cx < width*3/ 10 and cx > width*2/ 10 :                  
                     arduino.write('c')                
                     print 'c'                        
		if cx < width*2/ 10 and cx > width/ 10 :
                     arduino.write('b')
                     print 'b'
		if cx < width/ 10 :
                     arduino.write('a')
                     print 'a'

                if cx > width*6 / 10 and cx < width*7/ 10 :
                     arduino.write('f')
                     print 'f'
                if cx > width*7/ 10 and cx < width*8/ 10 :
                     arduino.write('g')
                     print 'g'
                if cx > width*8/ 10 and cx < width*9/ 10 :
                     arduino.write('h')
                     print 'h'
                if cx > width*9/ 10 :
                     arduino.write('i')
                     print 'i'

                if cy < height*5/ 10 and cy > height*4/ 10 :
                     arduino.write('n')
                     print 'n'
                if cy < height*4/ 10 and cy > height*3/ 10 :
                     arduino.write('m')
                     print 'm'
                if cy < height*3/ 10 and cy > height*2/ 10 :
                     arduino.write('l')
                     print 'l'
                if cy < height*2/ 10 and cy > height/ 10 :
                     arduino.write('k')
                     print 'k'
                if cy < height/ 10:
                     arduino.write('j')
                     print 'j'


                if cy > height*6 / 10 and cy < height*7 / 10 :
                     arduino.write('o')
                     print 'o'
                if cy > height*7 / 10 and cy < height*8 / 10 :
                     arduino.write('p')
                     print 'p'
                if cy > height*8 / 10 and cy < height*9 / 10 :
                     arduino.write('q')
                     print 'q'     
                if cy > height*9 / 10:
                     arduino.write('r')
                     print 'r'



####################################################################################################################### 


            cv.ShowImage("Target", color_image)

            # Listen for ESC key
            c = cv.WaitKey(7) % 0x100
            if c == 27:
                break
예제 #16
0
    def run(self):
        # Capture first frame to get size
        frame = cv.QueryFrame(self.capture)
        frame_size = cv.GetSize(frame)
        grey_image = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1)
        moving_average = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_32F, 3)
        difference = None

        while True:
            # Capture frame from webcam
            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 not difference:
                # Initialize
                difference = cv.CloneImage(color_image)
                temp = cv.CloneImage(color_image)
                cv.ConvertScale(color_image, moving_average, 1.0, 0.0)
            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.hsv
            cv.cvtColor(color_image, cv.hsv, CV_BGR2HSV)

            inRange(hsv, Scalar(0, 58, 89), Scalar(25, 173, 229), cv.bw)

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

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

            while contour:
                # Draw rectangles
                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)

            num_points = len(points)
            if num_points:
                # Draw bullseye in midpoint of all movements
                x = y = 0
                for point in points:
                    x += point[0]
                    y += point[1]
                x /= num_points
                y /= num_points
                center_point = (x, y)
                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), 5)

            # Display frame to user
            cv.ShowImage("Target", color_image)

            # Listen for ESC or ENTER key
            c = cv.WaitKey(7) % 0x100
            if c == 27 or c == 10:
                break
예제 #17
0
    def run(self):
        try:
            first = True

            while True:
                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)
                    grey_image = cv.CreateImage(cv.GetSize(color_image),
                                                cv.IPL_DEPTH_8U, 1)
                    moving_average = cv.CreateImage(cv.GetSize(color_image),
                                                    cv.IPL_DEPTH_32F, 3)
                    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 = []
                movementArea = 0

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

                    # Compute the bounding points to the boxes that will be drawn on the screen
                    pt1 = (bound_rect[0], bound_rect[1])
                    pt2 = (bound_rect[0] + bound_rect[2],
                           bound_rect[1] + bound_rect[3])

                    # Add this latest bounding box to the overall area that is being detected as movement
                    movementArea += ((pt2[0] - pt1[0]) * (pt2[1] - pt1[1]))
                    points.append(pt1)
                    points.append(pt2)
                    cv.Rectangle(color_image, pt1, pt2, cv.CV_RGB(255, 0, 0),
                                 1)

                if movementArea > 0:
                    print 'MA: ' + repr(movementArea)
                    #cv.SaveImage("/root/temp/samples/" + "photo" + "-" + datetime.datetime.now().strftime("%Y%m%d%H%M%S%f") + ".png", color_image)

                #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)

                self.server.setFrame(color_image)
                time.sleep(0.01)
        except KeyboardInterrupt:
            print '^C received, Shutting down server'
            self.server.shutdown()
            self.server.server_close()
예제 #18
0
파일: track.py 프로젝트: juherask/elfeyes
    def closest_point(self, pt):
        pos0, dpos = zip(*self.objects)
        est_pts = np.asarray(pos0)+np.asarray(dpos)
        min_dist = np.sum( est_pts

    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)
            
            objects = []

            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])
                cv.Rectangle(color_image, pt1, pt2, cv.CV_RGB(255,0,0), 1)

                center_point = ((pt1[0] + pt2[0]) / 2, (pt1[1] + pt2[1]) / 2), points)
                if len(objects):
                    closest
    time_start = time.time()
    color_image = cv.QueryFrame(capture)
    imdraw = cv.CreateImage(cv.GetSize(frame), 8, 3)
    cv.SetZero(imdraw)
    cv.Flip(color_image, color_image, 1)
    cv.Smooth(color_image, color_image, cv.CV_GAUSSIAN, 3, 0)

    #find movement

    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)
예제 #20
0
파일: track.py 프로젝트: Edsby/track
    # Get the camera image
    cameraImage = cv.QueryFrame(capture)

    frameCount += 1
    frameT0 = time.time()

    displayImage = cv.CloneImage(cameraImage)
    colourImage = cv.CloneImage(displayImage)

    cv.Smooth(colourImage, colourImage, cv.CV_GAUSSIAN, 19, 0)

    # Use the Running Average as the static background
    # a = 0.020 leaves artifacts lingering way too long.
    # a = 0.320 works well at 320x240, 15fps.  (1/a is roughly num frames.)
    cv.RunningAvg(colourImage, runningAverageImage, 0.64, None)
    cv.ConvertScale(runningAverageImage, runningAverageInDisplayColourDepth,
                    1.0, 0)

    #Get the difference between the content and the running average
    cv.AbsDiff(colourImage, runningAverageInDisplayColourDepth, difference)

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

    # Threshold to difference image to a black and whit motion mask
    cv.Threshold(greyImage, greyImage, 2, 255, cv.CV_THRESH_BINARY)
    # Smooth and Threshold again to eliminate artifacts
    cv.Smooth(greyImage, greyImage, cv.CV_GAUSSIAN, 19, 0)
    cv.Threshold(greyImage, greyImage, 240, 255, cv.CV_THRESH_BINARY)
예제 #21
0
    def run(self):
        try:
            counter = 0
            first = True

            while (self.NoOfFrames > 0
                   and counter < self.NoOfFrames) or self.NoOfFrames < 0:
                self.log()

                color_image = cv.QueryFrame(self.capture)
                self.log("QueryFrame", color_image)

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

                if first:
                    difference = cv.CloneImage(color_image)
                    self.log("CloneImage 1=difference", difference)

                    temp = cv.CloneImage(color_image)
                    self.log("CloneImage 2=temp", temp)

                    grey_image = cv.CreateImage(cv.GetSize(color_image),
                                                cv.IPL_DEPTH_8U, 1)
                    self.log("CreateImage=grey_image", grey_image)

                    moving_average = cv.CreateImage(cv.GetSize(color_image),
                                                    cv.IPL_DEPTH_32F, 3)
                    self.log("CreateImage=moving_average", moving_average)

                    cv.ConvertScale(color_image, moving_average, 1.0, 0.0)
                    self.log("ConvertScale=moving_average", moving_average)
                    first = False
                else:
                    cv.RunningAvg(color_image, moving_average, 0.020, None)
                    self.log("RunningAvg=moving_average", moving_average)

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

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

                # Convert the image to grayscale.
                cv.CvtColor(difference, grey_image, cv.CV_RGB2GRAY)
                self.log("CvtColor=grey_image", grey_image)

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

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

                storage = cv.CreateMemStorage(0)
                self.log("CreateMemStorage")
                contour = cv.FindContours(grey_image, storage,
                                          cv.CV_RETR_CCOMP,
                                          cv.CV_CHAIN_APPROX_SIMPLE)
                self.log("FindContours: " + str(len(list(contour))))

                points = []
                movementArea = 0

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

                    # Compute the bounding points to the boxes that will be drawn on the screen
                    pt1 = (bound_rect[0], bound_rect[1])
                    pt2 = (bound_rect[0] + bound_rect[2],
                           bound_rect[1] + bound_rect[3])

                    # Add this latest bounding box to the overall area that is being detected as movement
                    movementArea += ((pt2[0] - pt1[0]) * (pt2[1] - pt1[1]))
                    points.append(pt1)
                    points.append(pt2)
                    cv.Rectangle(color_image, pt1, pt2, cv.CV_RGB(255, 0, 0),
                                 1)
                    self.log("Draw contour")

                if movementArea > 0:
                    print 'MA: ' + repr(movementArea)
                    fname = "/tmp/" + "photo" + "-" + datetime.datetime.now(
                    ).strftime("%Y%m%d%H%M%S%f") + ".png"
                    cv.SaveImage(fname, color_image)
                    self.log("SaveImage")

                self.log("end")
                counter += 1
                time.sleep(0.1)
        except KeyboardInterrupt:
            print '^C received, Shutting down server'
            sys.exit(0)