Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv_contrib
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv_contrib
Commits
265a7ad1
Commit
265a7ad1
authored
Sep 09, 2014
by
Beat Küng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
seeds: add C++ and python samples
parent
770a8b59
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
665 additions
and
0 deletions
+665
-0
seeds.cpp
modules/ximgproc/samples/seeds.cpp
+155
-0
common.py
samples/python2/common.py
+220
-0
seeds.py
samples/python2/seeds.py
+91
-0
video.py
samples/python2/video.py
+199
-0
No files found.
modules/ximgproc/samples/seeds.cpp
0 → 100644
View file @
265a7ad1
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/core/utility.hpp>
#include <opencv2/ximgproc.hpp>
#include <ctype.h>
#include <stdio.h>
#include <iostream>
using
namespace
cv
;
using
namespace
cv
::
ximgproc
;
using
namespace
std
;
static
void
help
()
{
cout
<<
"
\n
This program demonstrates SEEDS superpixels using OpenCV class SuperpixelSEEDS
\n
"
"Use [space] to toggle output mode
\n
"
"
\n
"
"It captures either from the camera of your choice: 0, 1, ... default 0
\n
"
"Or from an input image
\n
"
"Call:
\n
"
"./seeds [camera #, default 0]
\n
"
"./seeds [input image file]
\n
"
<<
endl
;
}
static
const
char
*
window_name
=
"SEEDS Superpixels"
;
static
bool
init
=
false
;
void
trackbarChanged
(
int
pos
,
void
*
data
)
{
init
=
false
;
}
int
main
(
int
argc
,
char
**
argv
)
{
VideoCapture
cap
;
Mat
input_image
;
bool
use_video_capture
=
false
;
help
();
if
(
argc
==
1
||
(
argc
==
2
&&
strlen
(
argv
[
1
])
==
1
&&
isdigit
(
argv
[
1
][
0
]))
)
{
cap
.
open
(
argc
==
2
?
argv
[
1
][
0
]
-
'0'
:
0
);
use_video_capture
=
true
;
}
else
if
(
argc
>=
2
)
{
input_image
=
imread
(
argv
[
1
]);
}
if
(
use_video_capture
)
{
if
(
!
cap
.
isOpened
()
)
{
cout
<<
"Could not initialize capturing...
\n
"
;
return
-
1
;
}
}
else
if
(
input_image
.
empty
()
)
{
cout
<<
"Could not open image...
\n
"
;
return
-
1
;
}
namedWindow
(
window_name
,
0
);
int
num_iterations
=
4
;
int
prior
=
2
;
bool
double_step
=
false
;
int
num_superpixels
=
400
;
int
num_levels
=
4
;
int
num_histogram_bins
=
5
;
createTrackbar
(
"Number of Superpixels"
,
window_name
,
&
num_superpixels
,
1000
,
trackbarChanged
);
createTrackbar
(
"Smoothing Prior"
,
window_name
,
&
prior
,
5
,
trackbarChanged
);
createTrackbar
(
"Number of Levels"
,
window_name
,
&
num_levels
,
10
,
trackbarChanged
);
createTrackbar
(
"Iterations"
,
window_name
,
&
num_iterations
,
12
,
0
);
Mat
result
,
mask
;
Ptr
<
SuperpixelSEEDS
>
seeds
;
int
width
,
height
;
int
display_mode
=
0
;
for
(;;)
{
Mat
frame
;
if
(
use_video_capture
)
cap
>>
frame
;
else
input_image
.
copyTo
(
frame
);
if
(
frame
.
empty
()
)
break
;
if
(
!
init
)
{
width
=
frame
.
size
().
width
;
height
=
frame
.
size
().
height
;
seeds
=
createSuperpixelSEEDS
(
width
,
height
,
frame
.
channels
(),
num_superpixels
,
num_levels
,
prior
,
num_histogram_bins
,
double_step
);
init
=
true
;
}
Mat
converted
;
cvtColor
(
frame
,
converted
,
COLOR_BGR2HSV
);
double
t
=
(
double
)
getTickCount
();
seeds
->
iterate
(
converted
,
num_iterations
);
result
=
frame
;
t
=
((
double
)
getTickCount
()
-
t
)
/
getTickFrequency
();
printf
(
"SEEDS segmentation took %i ms with %3i superpixels
\n
"
,
(
int
)
(
t
*
1000
),
seeds
->
getNumberOfSuperpixels
());
/* retrieve the segmentation result */
Mat
labels
;
seeds
->
getLabels
(
labels
);
/* get the contours for displaying */
seeds
->
getLabelContourMask
(
mask
,
false
);
result
.
setTo
(
Scalar
(
0
,
0
,
255
),
mask
);
/* display output */
switch
(
display_mode
)
{
case
0
:
//superpixel contours
imshow
(
window_name
,
result
);
break
;
case
1
:
//mask
imshow
(
window_name
,
mask
);
break
;
case
2
:
//labels array
{
// use the last x bit to determine the color. Note that this does not
// guarantee that 2 neighboring superpixels have different colors.
const
int
num_label_bits
=
2
;
labels
&=
(
1
<<
num_label_bits
)
-
1
;
labels
*=
1
<<
(
16
-
num_label_bits
);
imshow
(
window_name
,
labels
);
}
break
;
}
int
c
=
waitKey
(
1
);
if
(
(
c
&
255
)
==
'q'
||
c
==
'Q'
||
(
c
&
255
)
==
27
)
break
;
else
if
(
(
c
&
255
)
==
' '
)
display_mode
=
(
display_mode
+
1
)
%
3
;
}
return
0
;
}
samples/python2/common.py
0 → 100755
View file @
265a7ad1
#!/usr/bin/env python
'''
This module contains some common routines used by other samples.
'''
import
numpy
as
np
import
cv2
# built-in modules
import
os
import
itertools
as
it
from
contextlib
import
contextmanager
image_extensions
=
[
'.bmp'
,
'.jpg'
,
'.jpeg'
,
'.png'
,
'.tif'
,
'.tiff'
,
'.pbm'
,
'.pgm'
,
'.ppm'
]
class
Bunch
(
object
):
def
__init__
(
self
,
**
kw
):
self
.
__dict__
.
update
(
kw
)
def
__str__
(
self
):
return
str
(
self
.
__dict__
)
def
splitfn
(
fn
):
path
,
fn
=
os
.
path
.
split
(
fn
)
name
,
ext
=
os
.
path
.
splitext
(
fn
)
return
path
,
name
,
ext
def
anorm2
(
a
):
return
(
a
*
a
)
.
sum
(
-
1
)
def
anorm
(
a
):
return
np
.
sqrt
(
anorm2
(
a
)
)
def
homotrans
(
H
,
x
,
y
):
xs
=
H
[
0
,
0
]
*
x
+
H
[
0
,
1
]
*
y
+
H
[
0
,
2
]
ys
=
H
[
1
,
0
]
*
x
+
H
[
1
,
1
]
*
y
+
H
[
1
,
2
]
s
=
H
[
2
,
0
]
*
x
+
H
[
2
,
1
]
*
y
+
H
[
2
,
2
]
return
xs
/
s
,
ys
/
s
def
to_rect
(
a
):
a
=
np
.
ravel
(
a
)
if
len
(
a
)
==
2
:
a
=
(
0
,
0
,
a
[
0
],
a
[
1
])
return
np
.
array
(
a
,
np
.
float64
)
.
reshape
(
2
,
2
)
def
rect2rect_mtx
(
src
,
dst
):
src
,
dst
=
to_rect
(
src
),
to_rect
(
dst
)
cx
,
cy
=
(
dst
[
1
]
-
dst
[
0
])
/
(
src
[
1
]
-
src
[
0
])
tx
,
ty
=
dst
[
0
]
-
src
[
0
]
*
(
cx
,
cy
)
M
=
np
.
float64
([[
cx
,
0
,
tx
],
[
0
,
cy
,
ty
],
[
0
,
0
,
1
]])
return
M
def
lookat
(
eye
,
target
,
up
=
(
0
,
0
,
1
)):
fwd
=
np
.
asarray
(
target
,
np
.
float64
)
-
eye
fwd
/=
anorm
(
fwd
)
right
=
np
.
cross
(
fwd
,
up
)
right
/=
anorm
(
right
)
down
=
np
.
cross
(
fwd
,
right
)
R
=
np
.
float64
([
right
,
down
,
fwd
])
tvec
=
-
np
.
dot
(
R
,
eye
)
return
R
,
tvec
def
mtx2rvec
(
R
):
w
,
u
,
vt
=
cv2
.
SVDecomp
(
R
-
np
.
eye
(
3
))
p
=
vt
[
0
]
+
u
[:,
0
]
*
w
[
0
]
# same as np.dot(R, vt[0])
c
=
np
.
dot
(
vt
[
0
],
p
)
s
=
np
.
dot
(
vt
[
1
],
p
)
axis
=
np
.
cross
(
vt
[
0
],
vt
[
1
])
return
axis
*
np
.
arctan2
(
s
,
c
)
def
draw_str
(
dst
,
(
x
,
y
),
s
):
cv2
.
putText
(
dst
,
s
,
(
x
+
1
,
y
+
1
),
cv2
.
FONT_HERSHEY_PLAIN
,
1.0
,
(
0
,
0
,
0
),
thickness
=
2
,
lineType
=
cv2
.
LINE_AA
)
cv2
.
putText
(
dst
,
s
,
(
x
,
y
),
cv2
.
FONT_HERSHEY_PLAIN
,
1.0
,
(
255
,
255
,
255
),
lineType
=
cv2
.
LINE_AA
)
class
Sketcher
:
def
__init__
(
self
,
windowname
,
dests
,
colors_func
):
self
.
prev_pt
=
None
self
.
windowname
=
windowname
self
.
dests
=
dests
self
.
colors_func
=
colors_func
self
.
dirty
=
False
self
.
show
()
cv2
.
setMouseCallback
(
self
.
windowname
,
self
.
on_mouse
)
def
show
(
self
):
cv2
.
imshow
(
self
.
windowname
,
self
.
dests
[
0
])
def
on_mouse
(
self
,
event
,
x
,
y
,
flags
,
param
):
pt
=
(
x
,
y
)
if
event
==
cv2
.
EVENT_LBUTTONDOWN
:
self
.
prev_pt
=
pt
elif
event
==
cv2
.
EVENT_LBUTTONUP
:
self
.
prev_pt
=
None
if
self
.
prev_pt
and
flags
&
cv2
.
EVENT_FLAG_LBUTTON
:
for
dst
,
color
in
zip
(
self
.
dests
,
self
.
colors_func
()):
cv2
.
line
(
dst
,
self
.
prev_pt
,
pt
,
color
,
5
)
self
.
dirty
=
True
self
.
prev_pt
=
pt
self
.
show
()
# palette data from matplotlib/_cm.py
_jet_data
=
{
'red'
:
((
0.
,
0
,
0
),
(
0.35
,
0
,
0
),
(
0.66
,
1
,
1
),
(
0.89
,
1
,
1
),
(
1
,
0.5
,
0.5
)),
'green'
:
((
0.
,
0
,
0
),
(
0.125
,
0
,
0
),
(
0.375
,
1
,
1
),
(
0.64
,
1
,
1
),
(
0.91
,
0
,
0
),
(
1
,
0
,
0
)),
'blue'
:
((
0.
,
0.5
,
0.5
),
(
0.11
,
1
,
1
),
(
0.34
,
1
,
1
),
(
0.65
,
0
,
0
),
(
1
,
0
,
0
))}
cmap_data
=
{
'jet'
:
_jet_data
}
def
make_cmap
(
name
,
n
=
256
):
data
=
cmap_data
[
name
]
xs
=
np
.
linspace
(
0.0
,
1.0
,
n
)
channels
=
[]
eps
=
1e-6
for
ch_name
in
[
'blue'
,
'green'
,
'red'
]:
ch_data
=
data
[
ch_name
]
xp
,
yp
=
[],
[]
for
x
,
y1
,
y2
in
ch_data
:
xp
+=
[
x
,
x
+
eps
]
yp
+=
[
y1
,
y2
]
ch
=
np
.
interp
(
xs
,
xp
,
yp
)
channels
.
append
(
ch
)
return
np
.
uint8
(
np
.
array
(
channels
)
.
T
*
255
)
def
nothing
(
*
arg
,
**
kw
):
pass
def
clock
():
return
cv2
.
getTickCount
()
/
cv2
.
getTickFrequency
()
@contextmanager
def
Timer
(
msg
):
print
msg
,
'...'
,
start
=
clock
()
try
:
yield
finally
:
print
"
%.2
f ms"
%
((
clock
()
-
start
)
*
1000
)
class
StatValue
:
def
__init__
(
self
,
smooth_coef
=
0.5
):
self
.
value
=
None
self
.
smooth_coef
=
smooth_coef
def
update
(
self
,
v
):
if
self
.
value
is
None
:
self
.
value
=
v
else
:
c
=
self
.
smooth_coef
self
.
value
=
c
*
self
.
value
+
(
1.0
-
c
)
*
v
class
RectSelector
:
def
__init__
(
self
,
win
,
callback
):
self
.
win
=
win
self
.
callback
=
callback
cv2
.
setMouseCallback
(
win
,
self
.
onmouse
)
self
.
drag_start
=
None
self
.
drag_rect
=
None
def
onmouse
(
self
,
event
,
x
,
y
,
flags
,
param
):
x
,
y
=
np
.
int16
([
x
,
y
])
# BUG
if
event
==
cv2
.
EVENT_LBUTTONDOWN
:
self
.
drag_start
=
(
x
,
y
)
if
self
.
drag_start
:
if
flags
&
cv2
.
EVENT_FLAG_LBUTTON
:
xo
,
yo
=
self
.
drag_start
x0
,
y0
=
np
.
minimum
([
xo
,
yo
],
[
x
,
y
])
x1
,
y1
=
np
.
maximum
([
xo
,
yo
],
[
x
,
y
])
self
.
drag_rect
=
None
if
x1
-
x0
>
0
and
y1
-
y0
>
0
:
self
.
drag_rect
=
(
x0
,
y0
,
x1
,
y1
)
else
:
rect
=
self
.
drag_rect
self
.
drag_start
=
None
self
.
drag_rect
=
None
if
rect
:
self
.
callback
(
rect
)
def
draw
(
self
,
vis
):
if
not
self
.
drag_rect
:
return
False
x0
,
y0
,
x1
,
y1
=
self
.
drag_rect
cv2
.
rectangle
(
vis
,
(
x0
,
y0
),
(
x1
,
y1
),
(
0
,
255
,
0
),
2
)
return
True
@property
def
dragging
(
self
):
return
self
.
drag_rect
is
not
None
def
grouper
(
n
,
iterable
,
fillvalue
=
None
):
'''grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx'''
args
=
[
iter
(
iterable
)]
*
n
return
it
.
izip_longest
(
fillvalue
=
fillvalue
,
*
args
)
def
mosaic
(
w
,
imgs
):
'''Make a grid from images.
w -- number of grid columns
imgs -- images (must have same size and format)
'''
imgs
=
iter
(
imgs
)
img0
=
imgs
.
next
()
pad
=
np
.
zeros_like
(
img0
)
imgs
=
it
.
chain
([
img0
],
imgs
)
rows
=
grouper
(
w
,
imgs
,
pad
)
return
np
.
vstack
(
map
(
np
.
hstack
,
rows
))
def
getsize
(
img
):
h
,
w
=
img
.
shape
[:
2
]
return
w
,
h
def
mdot
(
*
args
):
return
reduce
(
np
.
dot
,
args
)
def
draw_keypoints
(
vis
,
keypoints
,
color
=
(
0
,
255
,
255
)):
for
kp
in
keypoints
:
x
,
y
=
kp
.
pt
cv2
.
circle
(
vis
,
(
int
(
x
),
int
(
y
)),
2
,
color
)
samples/python2/seeds.py
0 → 100755
View file @
265a7ad1
#!/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
()
samples/python2/video.py
0 → 100755
View file @
265a7ad1
#!/usr/bin/env python
'''
Video capture sample.
Sample shows how VideoCapture class can be used to acquire video
frames from a camera of a movie file. Also the sample provides
an example of procedural video generation by an object, mimicking
the VideoCapture interface (see Chess class).
'create_capture' is a convinience function for capture creation,
falling back to procedural video in case of error.
Usage:
video.py [--shotdir <shot path>] [source0] [source1] ...'
sourceN is an
- integer number for camera capture
- name of video file
- synth:<params> for procedural video
Synth examples:
synth:bg=../cpp/lena.jpg:noise=0.1
synth:class=chess:bg=../cpp/lena.jpg:noise=0.1:size=640x480
Keys:
ESC - exit
SPACE - save current frame to <shot path> directory
'''
import
numpy
as
np
from
numpy
import
pi
,
sin
,
cos
import
cv2
# built-in modules
from
time
import
clock
# local modules
import
common
class
VideoSynthBase
(
object
):
def
__init__
(
self
,
size
=
None
,
noise
=
0.0
,
bg
=
None
,
**
params
):
self
.
bg
=
None
self
.
frame_size
=
(
640
,
480
)
if
bg
is
not
None
:
self
.
bg
=
cv2
.
imread
(
bg
,
1
)
h
,
w
=
self
.
bg
.
shape
[:
2
]
self
.
frame_size
=
(
w
,
h
)
if
size
is
not
None
:
w
,
h
=
map
(
int
,
size
.
split
(
'x'
))
self
.
frame_size
=
(
w
,
h
)
self
.
bg
=
cv2
.
resize
(
self
.
bg
,
self
.
frame_size
)
self
.
noise
=
float
(
noise
)
def
render
(
self
,
dst
):
pass
def
read
(
self
,
dst
=
None
):
w
,
h
=
self
.
frame_size
if
self
.
bg
is
None
:
buf
=
np
.
zeros
((
h
,
w
,
3
),
np
.
uint8
)
else
:
buf
=
self
.
bg
.
copy
()
self
.
render
(
buf
)
if
self
.
noise
>
0.0
:
noise
=
np
.
zeros
((
h
,
w
,
3
),
np
.
int8
)
cv2
.
randn
(
noise
,
np
.
zeros
(
3
),
np
.
ones
(
3
)
*
255
*
self
.
noise
)
buf
=
cv2
.
add
(
buf
,
noise
,
dtype
=
cv2
.
CV_8UC3
)
return
True
,
buf
def
isOpened
(
self
):
return
True
class
Chess
(
VideoSynthBase
):
def
__init__
(
self
,
**
kw
):
super
(
Chess
,
self
)
.
__init__
(
**
kw
)
w
,
h
=
self
.
frame_size
self
.
grid_size
=
sx
,
sy
=
10
,
7
white_quads
=
[]
black_quads
=
[]
for
i
,
j
in
np
.
ndindex
(
sy
,
sx
):
q
=
[[
j
,
i
,
0
],
[
j
+
1
,
i
,
0
],
[
j
+
1
,
i
+
1
,
0
],
[
j
,
i
+
1
,
0
]]
[
white_quads
,
black_quads
][(
i
+
j
)
%
2
]
.
append
(
q
)
self
.
white_quads
=
np
.
float32
(
white_quads
)
self
.
black_quads
=
np
.
float32
(
black_quads
)
fx
=
0.9
self
.
K
=
np
.
float64
([[
fx
*
w
,
0
,
0.5
*
(
w
-
1
)],
[
0
,
fx
*
w
,
0.5
*
(
h
-
1
)],
[
0.0
,
0.0
,
1.0
]])
self
.
dist_coef
=
np
.
float64
([
-
0.2
,
0.1
,
0
,
0
])
self
.
t
=
0
def
draw_quads
(
self
,
img
,
quads
,
color
=
(
0
,
255
,
0
)):
img_quads
=
cv2
.
projectPoints
(
quads
.
reshape
(
-
1
,
3
),
self
.
rvec
,
self
.
tvec
,
self
.
K
,
self
.
dist_coef
)
[
0
]
img_quads
.
shape
=
quads
.
shape
[:
2
]
+
(
2
,)
for
q
in
img_quads
:
cv2
.
fillConvexPoly
(
img
,
np
.
int32
(
q
*
4
),
color
,
cv2
.
LINE_AA
,
shift
=
2
)
def
render
(
self
,
dst
):
t
=
self
.
t
self
.
t
+=
1.0
/
30.0
sx
,
sy
=
self
.
grid_size
center
=
np
.
array
([
0.5
*
sx
,
0.5
*
sy
,
0.0
])
phi
=
pi
/
3
+
sin
(
t
*
3
)
*
pi
/
8
c
,
s
=
cos
(
phi
),
sin
(
phi
)
ofs
=
np
.
array
([
sin
(
1.2
*
t
),
cos
(
1.8
*
t
),
0
])
*
sx
*
0.2
eye_pos
=
center
+
np
.
array
([
cos
(
t
)
*
c
,
sin
(
t
)
*
c
,
s
])
*
15.0
+
ofs
target_pos
=
center
+
ofs
R
,
self
.
tvec
=
common
.
lookat
(
eye_pos
,
target_pos
)
self
.
rvec
=
common
.
mtx2rvec
(
R
)
self
.
draw_quads
(
dst
,
self
.
white_quads
,
(
245
,
245
,
245
))
self
.
draw_quads
(
dst
,
self
.
black_quads
,
(
10
,
10
,
10
))
classes
=
dict
(
chess
=
Chess
)
presets
=
dict
(
empty
=
'synth:'
,
lena
=
'synth:bg=../cpp/lena.jpg:noise=0.1'
,
chess
=
'synth:class=chess:bg=../cpp/lena.jpg:noise=0.1:size=640x480'
)
def
create_capture
(
source
=
0
,
fallback
=
presets
[
'chess'
]):
'''source: <int> or '<int>|<filename>|synth [:<param_name>=<value> [:...]]'
'''
source
=
str
(
source
)
.
strip
()
chunks
=
source
.
split
(
':'
)
# handle drive letter ('c:', ...)
if
len
(
chunks
)
>
1
and
len
(
chunks
[
0
])
==
1
and
chunks
[
0
]
.
isalpha
():
chunks
[
1
]
=
chunks
[
0
]
+
':'
+
chunks
[
1
]
del
chunks
[
0
]
source
=
chunks
[
0
]
try
:
source
=
int
(
source
)
except
ValueError
:
pass
params
=
dict
(
s
.
split
(
'='
)
for
s
in
chunks
[
1
:]
)
cap
=
None
if
source
==
'synth'
:
Class
=
classes
.
get
(
params
.
get
(
'class'
,
None
),
VideoSynthBase
)
try
:
cap
=
Class
(
**
params
)
except
:
pass
else
:
cap
=
cv2
.
VideoCapture
(
source
)
if
'size'
in
params
:
w
,
h
=
map
(
int
,
params
[
'size'
]
.
split
(
'x'
))
cap
.
set
(
cv2
.
CAP_PROP_FRAME_WIDTH
,
w
)
cap
.
set
(
cv2
.
CAP_PROP_FRAME_HEIGHT
,
h
)
if
cap
is
None
or
not
cap
.
isOpened
():
print
'Warning: unable to open video source: '
,
source
if
fallback
is
not
None
:
return
create_capture
(
fallback
,
None
)
return
cap
if
__name__
==
'__main__'
:
import
sys
import
getopt
print
__doc__
args
,
sources
=
getopt
.
getopt
(
sys
.
argv
[
1
:],
''
,
'shotdir='
)
args
=
dict
(
args
)
shotdir
=
args
.
get
(
'--shotdir'
,
'.'
)
if
len
(
sources
)
==
0
:
sources
=
[
0
]
caps
=
map
(
create_capture
,
sources
)
shot_idx
=
0
while
True
:
imgs
=
[]
for
i
,
cap
in
enumerate
(
caps
):
ret
,
img
=
cap
.
read
()
imgs
.
append
(
img
)
cv2
.
imshow
(
'capture
%
d'
%
i
,
img
)
ch
=
0xFF
&
cv2
.
waitKey
(
1
)
if
ch
==
27
:
break
if
ch
==
ord
(
' '
):
for
i
,
img
in
enumerate
(
imgs
):
fn
=
'
%
s/shot_
%
d_
%03
d.bmp'
%
(
shotdir
,
i
,
shot_idx
)
cv2
.
imwrite
(
fn
,
img
)
print
fn
,
'saved'
shot_idx
+=
1
cv2
.
destroyAllWindows
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment