Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
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
Commits
efa0717d
Commit
efa0717d
authored
Apr 04, 2012
by
Alexey Spizhevoy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added support of homography estimation into videostab module
parent
ecb1f0e2
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
114 additions
and
34 deletions
+114
-34
global_motion.hpp
...les/videostab/include/opencv2/videostab/global_motion.hpp
+17
-10
inpainting.hpp
modules/videostab/include/opencv2/videostab/inpainting.hpp
+6
-0
stabilizer.hpp
modules/videostab/include/opencv2/videostab/stabilizer.hpp
+3
-3
global_motion.cpp
modules/videostab/src/global_motion.cpp
+32
-3
inpainting.cpp
modules/videostab/src/inpainting.cpp
+32
-7
precomp.hpp
modules/videostab/src/precomp.hpp
+1
-0
stabilizer.cpp
modules/videostab/src/stabilizer.cpp
+18
-6
videostab.cpp
samples/cpp/videostab.cpp
+5
-5
No files found.
modules/videostab/include/opencv2/videostab/global_motion.hpp
View file @
efa0717d
...
...
@@ -58,7 +58,9 @@ enum MotionModel
TRANSLATION
=
0
,
TRANSLATION_AND_SCALE
=
1
,
LINEAR_SIMILARITY
=
2
,
AFFINE
=
3
AFFINE
=
3
,
HOMOGRAPHY
=
4
,
UNKNOWN
=
5
};
CV_EXPORTS
Mat
estimateGlobalMotionLeastSquares
(
...
...
@@ -76,10 +78,11 @@ struct CV_EXPORTS RansacParams
RansacParams
(
int
size
,
float
thresh
,
float
eps
,
float
prob
)
:
size
(
size
),
thresh
(
thresh
),
eps
(
eps
),
prob
(
prob
)
{}
static
RansacParams
translationMotionStd
()
{
return
RansacParams
(
2
,
0.5
f
,
0.5
f
,
0.99
f
);
}
static
RansacParams
translation
2d
MotionStd
()
{
return
RansacParams
(
2
,
0.5
f
,
0.5
f
,
0.99
f
);
}
static
RansacParams
translationAndScale2dMotionStd
()
{
return
RansacParams
(
3
,
0.5
f
,
0.5
f
,
0.99
f
);
}
static
RansacParams
linearSimilarityMotionStd
()
{
return
RansacParams
(
4
,
0.5
f
,
0.5
f
,
0.99
f
);
}
static
RansacParams
linearSimilarity
2d
MotionStd
()
{
return
RansacParams
(
4
,
0.5
f
,
0.5
f
,
0.99
f
);
}
static
RansacParams
affine2dMotionStd
()
{
return
RansacParams
(
6
,
0.5
f
,
0.5
f
,
0.99
f
);
}
static
RansacParams
homography2dMotionStd
()
{
return
RansacParams
(
8
,
0.5
f
,
0.5
f
,
0.99
f
);
}
};
CV_EXPORTS
Mat
estimateGlobalMotionRobust
(
...
...
@@ -87,14 +90,22 @@ CV_EXPORTS Mat estimateGlobalMotionRobust(
int
model
=
AFFINE
,
const
RansacParams
&
params
=
RansacParams
::
affine2dMotionStd
(),
float
*
rmse
=
0
,
int
*
ninliers
=
0
);
class
CV_EXPORTS
IGlobalMotionEstimator
class
CV_EXPORTS
GlobalMotionEstimatorBase
{
public
:
virtual
~
IGlobalMotionEstimator
()
{}
GlobalMotionEstimatorBase
()
:
motionModel_
(
UNKNOWN
)
{}
virtual
~
GlobalMotionEstimatorBase
()
{}
virtual
void
setMotionModel
(
MotionModel
val
)
{
motionModel_
=
val
;
}
virtual
MotionModel
motionModel
()
const
{
return
motionModel_
;
}
virtual
Mat
estimate
(
const
Mat
&
frame0
,
const
Mat
&
frame1
)
=
0
;
protected
:
MotionModel
motionModel_
;
};
class
CV_EXPORTS
PyrLkRobustMotionEstimator
:
public
IGlobalMotionEstimator
class
CV_EXPORTS
PyrLkRobustMotionEstimator
:
public
GlobalMotionEstimatorBase
{
public
:
PyrLkRobustMotionEstimator
();
...
...
@@ -105,9 +116,6 @@ public:
void
setOptFlowEstimator
(
Ptr
<
ISparseOptFlowEstimator
>
val
)
{
optFlowEstimator_
=
val
;
}
Ptr
<
ISparseOptFlowEstimator
>
optFlowEstimator
()
const
{
return
optFlowEstimator_
;
}
void
setMotionModel
(
MotionModel
val
)
{
motionModel_
=
val
;
}
MotionModel
motionModel
()
const
{
return
motionModel_
;
}
void
setRansacParams
(
const
RansacParams
&
val
)
{
ransacParams_
=
val
;
}
RansacParams
ransacParams
()
const
{
return
ransacParams_
;
}
...
...
@@ -122,7 +130,6 @@ public:
private
:
Ptr
<
FeatureDetector
>
detector_
;
Ptr
<
ISparseOptFlowEstimator
>
optFlowEstimator_
;
MotionModel
motionModel_
;
RansacParams
ransacParams_
;
std
::
vector
<
uchar
>
status_
;
std
::
vector
<
KeyPoint
>
keypointsPrev_
;
...
...
modules/videostab/include/opencv2/videostab/inpainting.hpp
View file @
efa0717d
...
...
@@ -47,6 +47,7 @@
#include "opencv2/core/core.hpp"
#include "opencv2/videostab/optical_flow.hpp"
#include "opencv2/videostab/fast_marching.hpp"
#include "opencv2/videostab/global_motion.hpp"
#include "opencv2/photo/photo.hpp"
namespace
cv
...
...
@@ -66,6 +67,9 @@ public:
virtual
void
setRadius
(
int
val
)
{
radius_
=
val
;
}
virtual
int
radius
()
const
{
return
radius_
;
}
virtual
void
setMotionModel
(
MotionModel
val
)
{
motionModel_
=
val
;
}
virtual
MotionModel
motionModel
()
const
{
return
motionModel_
;
}
virtual
void
setFrames
(
const
std
::
vector
<
Mat
>
&
val
)
{
frames_
=
&
val
;
}
virtual
const
std
::
vector
<
Mat
>&
frames
()
const
{
return
*
frames_
;
}
...
...
@@ -82,6 +86,7 @@ public:
protected
:
int
radius_
;
MotionModel
motionModel_
;
const
std
::
vector
<
Mat
>
*
frames_
;
const
std
::
vector
<
Mat
>
*
motions_
;
const
std
::
vector
<
Mat
>
*
stabilizedFrames_
;
...
...
@@ -101,6 +106,7 @@ public:
bool
empty
()
const
{
return
inpainters_
.
empty
();
}
virtual
void
setRadius
(
int
val
);
virtual
void
setMotionModel
(
MotionModel
val
);
virtual
void
setFrames
(
const
std
::
vector
<
Mat
>
&
val
);
virtual
void
setMotions
(
const
std
::
vector
<
Mat
>
&
val
);
virtual
void
setStabilizedFrames
(
const
std
::
vector
<
Mat
>
&
val
);
...
...
modules/videostab/include/opencv2/videostab/stabilizer.hpp
View file @
efa0717d
...
...
@@ -72,8 +72,8 @@ public:
void
setFrameSource
(
Ptr
<
IFrameSource
>
val
)
{
frameSource_
=
val
;
}
Ptr
<
IFrameSource
>
frameSource
()
const
{
return
frameSource_
;
}
void
setMotionEstimator
(
Ptr
<
IGlobalMotionEstimator
>
val
)
{
motionEstimator_
=
val
;
}
Ptr
<
IGlobalMotionEstimator
>
motionEstimator
()
const
{
return
motionEstimator_
;
}
void
setMotionEstimator
(
Ptr
<
GlobalMotionEstimatorBase
>
val
)
{
motionEstimator_
=
val
;
}
Ptr
<
GlobalMotionEstimatorBase
>
motionEstimator
()
const
{
return
motionEstimator_
;
}
void
setDeblurer
(
Ptr
<
DeblurerBase
>
val
)
{
deblurer_
=
val
;
}
Ptr
<
DeblurerBase
>
deblurrer
()
const
{
return
deblurer_
;
}
...
...
@@ -104,7 +104,7 @@ protected:
Ptr
<
ILog
>
log_
;
Ptr
<
IFrameSource
>
frameSource_
;
Ptr
<
IGlobalMotionEstimator
>
motionEstimator_
;
Ptr
<
GlobalMotionEstimatorBase
>
motionEstimator_
;
Ptr
<
DeblurerBase
>
deblurer_
;
Ptr
<
InpainterBase
>
inpainter_
;
int
radius_
;
...
...
modules/videostab/src/global_motion.cpp
View file @
efa0717d
...
...
@@ -41,7 +41,6 @@
//M*/
#include "precomp.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/videostab/global_motion.hpp"
#include "opencv2/videostab/ring_buffer.hpp"
...
...
@@ -324,8 +323,38 @@ Mat PyrLkRobustMotionEstimator::estimate(const Mat &frame0, const Mat &frame1)
float
rmse
;
int
ninliers
;
Mat
M
=
estimateGlobalMotionRobust
(
pointsPrevGood_
,
pointsGood_
,
motionModel_
,
ransacParams_
,
&
rmse
,
&
ninliers
);
Mat_
<
float
>
M
;
if
(
motionModel_
!=
HOMOGRAPHY
)
M
=
estimateGlobalMotionRobust
(
pointsPrevGood_
,
pointsGood_
,
motionModel_
,
ransacParams_
,
&
rmse
,
&
ninliers
);
else
{
vector
<
uchar
>
mask
;
M
=
findHomography
(
pointsPrevGood_
,
pointsGood_
,
CV_RANSAC
,
ransacParams_
.
thresh
,
mask
);
ninliers
=
0
;
rmse
=
0
;
Point2d
p0
,
p1
;
float
x
,
y
,
z
;
for
(
size_t
i
=
0
;
i
<
pointsGood_
.
size
();
++
i
)
{
if
(
mask
[
i
])
{
p0
=
pointsPrevGood_
[
i
];
p1
=
pointsGood_
[
i
];
x
=
M
(
0
,
0
)
*
p0
.
x
+
M
(
0
,
1
)
*
p0
.
y
+
M
(
0
,
2
);
y
=
M
(
1
,
0
)
*
p0
.
x
+
M
(
1
,
1
)
*
p0
.
y
+
M
(
1
,
2
);
z
=
M
(
2
,
0
)
*
p0
.
x
+
M
(
2
,
1
)
*
p0
.
y
+
M
(
2
,
2
);
x
/=
z
;
y
/=
z
;
rmse
+=
sqr
(
x
-
p1
.
x
)
+
sqr
(
y
-
p1
.
y
);
ninliers
++
;
}
}
rmse
=
sqrt
(
rmse
/
static_cast
<
float
>
(
ninliers
));
}
if
(
rmse
>
maxRmse_
||
static_cast
<
float
>
(
ninliers
)
/
pointsGood_
.
size
()
<
minInlierRatio_
)
M
=
Mat
::
eye
(
3
,
3
,
CV_32F
);
...
...
modules/videostab/src/inpainting.cpp
View file @
efa0717d
...
...
@@ -70,6 +70,14 @@ void InpaintingPipeline::setFrames(const vector<Mat> &val)
}
void
InpaintingPipeline
::
setMotionModel
(
MotionModel
val
)
{
for
(
size_t
i
=
0
;
i
<
inpainters_
.
size
();
++
i
)
inpainters_
[
i
]
->
setMotionModel
(
val
);
InpainterBase
::
setMotionModel
(
val
);
}
void
InpaintingPipeline
::
setMotions
(
const
vector
<
Mat
>
&
val
)
{
for
(
size_t
i
=
0
;
i
<
inpainters_
.
size
();
++
i
)
...
...
@@ -361,17 +369,34 @@ void MotionInpainter::inpaint(int idx, Mat &frame, Mat &mask)
Mat
motion1to0
=
motions
[
radius_
+
neighbor
-
idx
].
inv
();
frame1_
=
at
(
neighbor
,
*
frames_
);
warpAffine
(
frame1_
,
transformedFrame1_
,
motion1to0
(
Rect
(
0
,
0
,
3
,
2
)),
frame1_
.
size
(),
INTER_LINEAR
,
borderMode_
);
// warp frame
frame1_
=
at
(
neighbor
,
*
frames_
);
if
(
motionModel_
!=
HOMOGRAPHY
)
warpAffine
(
frame1_
,
transformedFrame1_
,
motion1to0
(
Rect
(
0
,
0
,
3
,
2
)),
frame1_
.
size
(),
INTER_LINEAR
,
borderMode_
);
else
warpPerspective
(
frame1_
,
transformedFrame1_
,
motion1to0
,
frame1_
.
size
(),
INTER_LINEAR
,
borderMode_
);
cvtColor
(
transformedFrame1_
,
transformedGrayFrame1_
,
CV_BGR2GRAY
);
warpAffine
(
mask1_
,
transformedMask1_
,
motion1to0
(
Rect
(
0
,
0
,
3
,
2
)),
mask1_
.
size
(),
INTER_NEAREST
);
// warp mask
if
(
motionModel_
!=
HOMOGRAPHY
)
warpAffine
(
mask1_
,
transformedMask1_
,
motion1to0
(
Rect
(
0
,
0
,
3
,
2
)),
mask1_
.
size
(),
INTER_NEAREST
);
else
warpPerspective
(
mask1_
,
transformedMask1_
,
motion1to0
,
mask1_
.
size
(),
INTER_NEAREST
);
erode
(
transformedMask1_
,
transformedMask1_
,
Mat
());
// update flow
optFlowEstimator_
->
run
(
grayFrame_
,
transformedGrayFrame1_
,
flowX_
,
flowY_
,
flowErrors_
);
calcFlowMask
(
...
...
modules/videostab/src/precomp.hpp
View file @
efa0717d
...
...
@@ -54,6 +54,7 @@
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/calib3d/calib3d.hpp"
// some aux. functions
...
...
modules/videostab/src/stabilizer.cpp
View file @
efa0717d
...
...
@@ -71,6 +71,7 @@ void StabilizerBase::setUp(int cacheSize, const Mat &frame)
doInpainting_
=
dynamic_cast
<
NullInpainter
*>
(
inpainter
)
==
0
;
if
(
doInpainting_
)
{
inpainter_
->
setMotionModel
(
motionEstimator_
->
motionModel
());
inpainter_
->
setFrames
(
frames_
);
inpainter_
->
setMotions
(
motions_
);
inpainter_
->
setStabilizedFrames
(
stabilizedFrames_
);
...
...
@@ -176,15 +177,26 @@ void StabilizerBase::stabilizeFrame(const Mat &stabilizationMotion)
preProcessedFrame_
=
at
(
curStabilizedPos_
,
frames_
);
// apply stabilization transformation
warpAffine
(
preProcessedFrame_
,
at
(
curStabilizedPos_
,
stabilizedFrames_
),
stabilizationMotion_
(
Rect
(
0
,
0
,
3
,
2
)),
frameSize_
,
INTER_LINEAR
,
borderMode_
);
if
(
motionEstimator_
->
motionModel
()
!=
HOMOGRAPHY
)
warpAffine
(
preProcessedFrame_
,
at
(
curStabilizedPos_
,
stabilizedFrames_
),
stabilizationMotion_
(
Rect
(
0
,
0
,
3
,
2
)),
frameSize_
,
INTER_LINEAR
,
borderMode_
);
else
warpPerspective
(
preProcessedFrame_
,
at
(
curStabilizedPos_
,
stabilizedFrames_
),
stabilizationMotion_
,
frameSize_
,
INTER_LINEAR
,
borderMode_
);
if
(
doInpainting_
)
{
warpAffine
(
frameMask_
,
at
(
curStabilizedPos_
,
stabilizedMasks_
),
stabilizationMotion_
(
Rect
(
0
,
0
,
3
,
2
)),
frameSize_
,
INTER_NEAREST
);
if
(
motionEstimator_
->
motionModel
()
!=
HOMOGRAPHY
)
warpAffine
(
frameMask_
,
at
(
curStabilizedPos_
,
stabilizedMasks_
),
stabilizationMotion_
(
Rect
(
0
,
0
,
3
,
2
)),
frameSize_
,
INTER_NEAREST
);
else
warpPerspective
(
frameMask_
,
at
(
curStabilizedPos_
,
stabilizedMasks_
),
stabilizationMotion_
,
frameSize_
,
INTER_NEAREST
);
erode
(
at
(
curStabilizedPos_
,
stabilizedMasks_
),
at
(
curStabilizedPos_
,
stabilizedMasks_
),
Mat
());
...
...
samples/cpp/videostab.cpp
View file @
efa0717d
...
...
@@ -29,7 +29,7 @@ void run();
void
saveMotionsIfNecessary
();
void
printHelp
();
class
GlobalMotionReader
:
public
IGlobalMotionEstimator
class
GlobalMotionReader
:
public
GlobalMotionEstimatorBase
{
public
:
GlobalMotionReader
(
string
path
)
...
...
@@ -256,11 +256,11 @@ int main(int argc, const char **argv)
{
RansacParams
ransac
;
PyrLkRobustMotionEstimator
*
est
=
new
PyrLkRobustMotionEstimator
();
Ptr
<
IGlobalMotionEstimator
>
est_
(
est
);
Ptr
<
GlobalMotionEstimatorBase
>
est_
(
est
);
if
(
arg
(
"model"
)
==
"transl"
)
{
est
->
setMotionModel
(
TRANSLATION
);
ransac
=
RansacParams
::
translationMotionStd
();
ransac
=
RansacParams
::
translation
2d
MotionStd
();
}
else
if
(
arg
(
"model"
)
==
"transl_and_scale"
)
{
...
...
@@ -270,13 +270,13 @@ int main(int argc, const char **argv)
else
if
(
arg
(
"model"
)
==
"linear_sim"
)
{
est
->
setMotionModel
(
LINEAR_SIMILARITY
);
ransac
=
RansacParams
::
linearSimilarityMotionStd
();
ransac
=
RansacParams
::
linearSimilarity
2d
MotionStd
();
}
else
if
(
arg
(
"model"
)
==
"affine"
)
{
est
->
setMotionModel
(
AFFINE
);
ransac
=
RansacParams
::
affine2dMotionStd
();
}
}
else
throw
runtime_error
(
"unknown motion model: "
+
arg
(
"model"
));
ransac
.
eps
=
argf
(
"outlier-ratio"
);
...
...
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