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.
92 lines
2.4 KiB
92 lines
2.4 KiB
10 years ago
|
#!/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()
|