You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.4 KiB
91 lines
2.4 KiB
#!/usr/bin/env python |
|
|
|
''' |
|
This sample demonstrates SEEDS Superpixels segmentation |
|
Use [space] to toggle output mode |
|
|
|
Usage: |
|
seeds.py [<video source>] |
|
|
|
''' |
|
|
|
import numpy as np |
|
import cv2 |
|
|
|
# relative module |
|
import video |
|
|
|
# built-in module |
|
import sys |
|
|
|
|
|
if __name__ == '__main__': |
|
print __doc__ |
|
|
|
try: |
|
fn = sys.argv[1] |
|
except: |
|
fn = 0 |
|
|
|
def nothing(*arg): |
|
pass |
|
|
|
cv2.namedWindow('SEEDS') |
|
cv2.createTrackbar('Number of Superpixels', 'SEEDS', 400, 1000, nothing) |
|
cv2.createTrackbar('Iterations', 'SEEDS', 4, 12, nothing) |
|
|
|
seeds = None |
|
display_mode = 0 |
|
num_superpixels = 400 |
|
prior = 2 |
|
num_levels = 4 |
|
num_histogram_bins = 5 |
|
|
|
cap = video.create_capture(fn) |
|
while True: |
|
flag, img = cap.read() |
|
converted_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) |
|
height,width,channels = converted_img.shape |
|
num_superpixels_new = cv2.getTrackbarPos('Number of Superpixels', 'SEEDS') |
|
num_iterations = cv2.getTrackbarPos('Iterations', 'SEEDS') |
|
|
|
if not seeds or num_superpixels_new != num_superpixels: |
|
num_superpixels = num_superpixels_new |
|
seeds = cv2.ximgproc.createSuperpixelSEEDS(width, height, channels, |
|
num_superpixels, num_levels, prior, num_histogram_bins) |
|
color_img = np.zeros((height,width,3), np.uint8) |
|
color_img[:] = (0, 0, 255) |
|
|
|
seeds.iterate(converted_img, num_iterations) |
|
|
|
# retrieve the segmentation result |
|
labels = seeds.getLabels() |
|
|
|
|
|
# labels output: use the last x bits to determine the color |
|
num_label_bits = 2 |
|
labels &= (1<<num_label_bits)-1 |
|
labels *= 1<<(16-num_label_bits) |
|
|
|
|
|
mask = seeds.getLabelContourMask(False) |
|
|
|
# stitch foreground & background together |
|
mask_inv = cv2.bitwise_not(mask) |
|
result_bg = cv2.bitwise_and(img, img, mask=mask_inv) |
|
result_fg = cv2.bitwise_and(color_img, color_img, mask=mask) |
|
result = cv2.add(result_bg, result_fg) |
|
|
|
if display_mode == 0: |
|
cv2.imshow('SEEDS', result) |
|
elif display_mode == 1: |
|
cv2.imshow('SEEDS', mask) |
|
else: |
|
cv2.imshow('SEEDS', labels) |
|
|
|
ch = cv2.waitKey(1) |
|
if ch == 27: |
|
break |
|
elif ch & 0xff == ord(' '): |
|
display_mode = (display_mode + 1) % 3 |
|
cv2.destroyAllWindows()
|
|
|