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
e349d6d0
Commit
e349d6d0
authored
Aug 18, 2014
by
tpietruszka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Deepflow - unfolded loops; faster, terrible code
parent
9181b2bd
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
246 additions
and
2 deletions
+246
-2
deepflow.cpp
modules/optflow/src/deepflow.cpp
+246
-2
No files found.
modules/optflow/src/deepflow.cpp
View file @
e349d6d0
...
...
@@ -83,6 +83,8 @@ private:
void
smoothnessTerm
(
const
Mat
W
,
const
Mat
weightsX
,
const
Mat
weightsY
,
Mat
b1
,
Mat
b2
);
void
sorSolve
(
const
Mat
a11
,
const
Mat
a12
,
const
Mat
a22
,
const
Mat
b1
,
const
Mat
b2
,
const
Mat
smoothX
,
const
Mat
smoothY
,
Mat
dW
);
void
sorUnfolded
(
const
Mat
a11
,
const
Mat
a12
,
const
Mat
a22
,
const
Mat
b1
,
const
Mat
b2
,
const
Mat
smoothX
,
const
Mat
smoothY
,
Mat
dW
);
std
::
vector
<
Mat
>
buildPyramid
(
const
Mat
&
src
);
int
interpolationType
;
...
...
@@ -461,6 +463,7 @@ void OpticalFlowDeepFlow::smoothnessTerm( const Mat W, const Mat weightsX, const
}
}
}
void
OpticalFlowDeepFlow
::
sorSolve
(
const
Mat
a11
,
const
Mat
a12
,
const
Mat
a22
,
const
Mat
b1
,
const
Mat
b2
,
const
Mat
smoothX
,
const
Mat
smoothY
,
Mat
dW
)
{
...
...
@@ -472,6 +475,12 @@ void OpticalFlowDeepFlow::sorSolve( const Mat a11, const Mat a12, const Mat a22,
CV_Assert
(
smoothX
.
isContinuous
());
CV_Assert
(
smoothY
.
isContinuous
());
if
(
dW
.
cols
>
2
&&
dW
.
rows
>
2
)
{
sorUnfolded
(
a11
,
a12
,
a22
,
b1
,
b2
,
smoothX
,
smoothY
,
dW
);
//more efficient version - this one is mostly for future reference and readability
return
;
}
std
::
vector
<
Mat
>
dWChannels
(
2
);
split
(
dW
,
dWChannels
);
...
...
@@ -580,23 +589,258 @@ void OpticalFlowDeepFlow::sorSolve( const Mat a11, const Mat a12, const Mat a22,
+
psmoothY
[
o
-
s
]
*
pdv
[
o
-
s
]
+
psmoothY
[
o
]
*
pdv
[
o
+
s
];
}
A22
=
*
pa11
+
dPsi
;
A11
=
*
pa22
+
dPsi
;
A12
=
-*
pa12
;
A22
=
*
pa11
+
dPsi
;
det
=
A11
*
A22
-
A12
*
A12
;
A22
/=
det
;
A11
/=
det
;
A12
/=
det
;
A22
/=
det
;
B1
=
*
pb1
+
sigmaU
;
B2
=
*
pb2
+
sigmaV
;
pdu
[
o
]
+=
omega
*
(
A11
*
B1
+
A12
*
B2
-
pdu
[
o
]);
pdv
[
o
]
+=
omega
*
(
A12
*
B1
+
A22
*
B2
-
pdv
[
o
]);
++
pa11
;
++
pa12
;
++
pa22
;
++
pb1
;
++
pb2
;
}
}
}
merge
(
dWChannels
,
dW
);
}
void
OpticalFlowDeepFlow
::
sorUnfolded
(
const
Mat
a11
,
const
Mat
a12
,
const
Mat
a22
,
const
Mat
b1
,
const
Mat
b2
,
const
Mat
smoothX
,
const
Mat
smoothY
,
Mat
dW
)
{
// the same effect as sorSolve(), but written more efficiently
std
::
vector
<
Mat
>
dWChannels
(
2
);
split
(
dW
,
dWChannels
);
Mat
*
du
=
&
(
dWChannels
[
0
]);
Mat
*
dv
=
&
(
dWChannels
[
1
]);
CV_Assert
(
du
->
isContinuous
());
CV_Assert
(
dv
->
isContinuous
());
const
float
*
pa11
,
*
pa12
,
*
pa22
,
*
pb1
,
*
pb2
,
*
psmoothX
,
*
psmoothY
;
float
*
pdu
,
*
pdv
;
float
sigmaU
,
sigmaV
,
dPsi
,
A11
,
A22
,
A12
,
B1
,
B2
,
det
;
int
cols
=
dW
.
cols
;
int
rows
=
dW
.
rows
;
int
s
=
dW
.
cols
;
// step between rows
int
j
,
i
,
o
;
//row, column, offset
for
(
int
iter
=
0
;
iter
<
sorIterations
;
++
iter
)
{
pa11
=
a11
.
ptr
<
float
>
(
0
);
pa12
=
a12
.
ptr
<
float
>
(
0
);
pa22
=
a22
.
ptr
<
float
>
(
0
);
pb1
=
b1
.
ptr
<
float
>
(
0
);
pb2
=
b2
.
ptr
<
float
>
(
0
);
psmoothX
=
smoothX
.
ptr
<
float
>
(
0
);
psmoothY
=
smoothY
.
ptr
<
float
>
(
0
);
pdu
=
du
->
ptr
<
float
>
(
0
);
pdv
=
dv
->
ptr
<
float
>
(
0
);
// first row
// first column
o
=
0
;
dPsi
=
psmoothX
[
o
]
+
psmoothY
[
o
];
sigmaU
=
psmoothX
[
o
]
*
pdu
[
o
+
1
]
+
psmoothY
[
o
]
*
pdu
[
o
+
s
];
sigmaV
=
psmoothX
[
o
]
*
pdv
[
o
+
1
]
+
psmoothY
[
o
]
*
pdv
[
o
+
s
];
A11
=
*
pa22
+
dPsi
;
A12
=
-*
pa12
;
A22
=
*
pa11
+
dPsi
;
det
=
A11
*
A22
-
A12
*
A12
;
A11
/=
det
;
A12
/=
det
;
A22
/=
det
;
B1
=
*
pb1
+
sigmaU
;
B2
=
*
pb2
+
sigmaV
;
pdu
[
o
]
+=
omega
*
(
A11
*
B1
+
A12
*
B2
-
pdu
[
o
]);
pdv
[
o
]
+=
omega
*
(
A12
*
B1
+
A22
*
B2
-
pdv
[
o
]);
++
pa11
;
++
pa12
;
++
pa22
;
++
pb1
;
++
pb2
;
// middle rows
for
(
o
=
1
;
o
<
cols
-
1
;
++
o
)
{
dPsi
=
psmoothX
[
o
-
1
]
+
psmoothX
[
o
]
+
psmoothY
[
o
];
sigmaU
=
psmoothX
[
o
-
1
]
*
pdu
[
o
-
1
]
+
psmoothX
[
o
]
*
pdu
[
o
+
1
]
+
psmoothY
[
o
]
*
pdu
[
o
+
s
];
sigmaV
=
psmoothX
[
o
-
1
]
*
pdv
[
o
-
1
]
+
psmoothX
[
o
]
*
pdv
[
o
+
1
]
+
psmoothY
[
o
]
*
pdv
[
o
+
s
];
A11
=
*
pa22
+
dPsi
;
A12
=
-*
pa12
;
A22
=
*
pa11
+
dPsi
;
det
=
A11
*
A22
-
A12
*
A12
;
A11
/=
det
;
A12
/=
det
;
A22
/=
det
;
B1
=
*
pb1
+
sigmaU
;
B2
=
*
pb2
+
sigmaV
;
pdu
[
o
]
+=
omega
*
(
A11
*
B1
+
A12
*
B2
-
pdu
[
o
]);
pdv
[
o
]
+=
omega
*
(
A12
*
B1
+
A22
*
B2
-
pdv
[
o
]);
++
pa11
;
++
pa12
;
++
pa22
;
++
pb1
;
++
pb2
;
}
// last column
dPsi
=
psmoothX
[
o
-
1
]
+
psmoothY
[
o
];
sigmaU
=
psmoothX
[
o
-
1
]
*
pdu
[
o
-
1
]
+
psmoothY
[
o
]
*
pdu
[
o
+
s
];
sigmaV
=
psmoothX
[
o
-
1
]
*
pdv
[
o
-
1
]
+
psmoothY
[
o
]
*
pdv
[
o
+
s
];
A11
=
*
pa22
+
dPsi
;
A12
=
-*
pa12
;
A22
=
*
pa11
+
dPsi
;
det
=
A11
*
A22
-
A12
*
A12
;
A11
/=
det
;
A12
/=
det
;
A22
/=
det
;
B1
=
*
pb1
+
sigmaU
;
B2
=
*
pb2
+
sigmaV
;
pdu
[
o
]
+=
omega
*
(
A11
*
B1
+
A12
*
B2
-
pdu
[
o
]);
pdv
[
o
]
+=
omega
*
(
A12
*
B1
+
A22
*
B2
-
pdv
[
o
]);
++
pa11
;
++
pa12
;
++
pa22
;
++
pb1
;
++
pb2
;
++
o
;
//middle rows
for
(
j
=
1
;
j
<
rows
-
1
;
++
j
)
{
// first column
dPsi
=
psmoothX
[
o
]
+
psmoothY
[
o
-
s
]
+
psmoothY
[
o
];
sigmaU
=
psmoothX
[
o
]
*
pdu
[
o
+
1
]
+
psmoothY
[
o
-
s
]
*
pdu
[
o
-
s
]
+
psmoothY
[
o
]
*
pdu
[
o
+
s
];
sigmaV
=
psmoothX
[
o
]
*
pdv
[
o
+
1
]
+
psmoothY
[
o
-
s
]
*
pdv
[
o
-
s
]
+
psmoothY
[
o
]
*
pdv
[
o
+
s
];
A11
=
*
pa22
+
dPsi
;
A12
=
-*
pa12
;
A22
=
*
pa11
+
dPsi
;
det
=
A11
*
A22
-
A12
*
A12
;
A11
/=
det
;
A12
/=
det
;
A22
/=
det
;
B1
=
*
pb1
+
sigmaU
;
B2
=
*
pb2
+
sigmaV
;
pdu
[
o
]
+=
omega
*
(
A11
*
B1
+
A12
*
B2
-
pdu
[
o
]);
pdv
[
o
]
+=
omega
*
(
A12
*
B1
+
A22
*
B2
-
pdv
[
o
]);
++
pa11
;
++
pa12
;
++
pa22
;
++
pb1
;
++
pb2
;
++
o
;
// middle columns
for
(
i
=
1
;
i
<
cols
-
1
;
++
i
)
{
dPsi
=
psmoothX
[
o
-
1
]
+
psmoothX
[
o
]
+
psmoothY
[
o
-
s
]
+
psmoothY
[
o
];
sigmaU
=
psmoothX
[
o
-
1
]
*
pdu
[
o
-
1
]
+
psmoothX
[
o
]
*
pdu
[
o
+
1
]
+
psmoothY
[
o
-
s
]
*
pdu
[
o
-
s
]
+
psmoothY
[
o
]
*
pdu
[
o
+
s
];
sigmaV
=
psmoothX
[
o
-
1
]
*
pdv
[
o
-
1
]
+
psmoothX
[
o
]
*
pdv
[
o
+
1
]
+
psmoothY
[
o
-
s
]
*
pdv
[
o
-
s
]
+
psmoothY
[
o
]
*
pdv
[
o
+
s
];
A11
=
*
pa22
+
dPsi
;
A12
=
-*
pa12
;
A22
=
*
pa11
+
dPsi
;
det
=
A11
*
A22
-
A12
*
A12
;
A11
/=
det
;
A12
/=
det
;
A22
/=
det
;
B1
=
*
pb1
+
sigmaU
;
B2
=
*
pb2
+
sigmaV
;
pdu
[
o
]
+=
omega
*
(
A11
*
B1
+
A12
*
B2
-
pdu
[
o
]);
pdv
[
o
]
+=
omega
*
(
A12
*
B1
+
A22
*
B2
-
pdv
[
o
]);
++
pa11
;
++
pa12
;
++
pa22
;
++
pb1
;
++
pb2
;
++
o
;
}
//last column
dPsi
=
psmoothX
[
o
-
1
]
+
psmoothY
[
o
-
s
]
+
psmoothY
[
o
];
sigmaU
=
psmoothX
[
o
-
1
]
*
pdu
[
o
-
1
]
+
psmoothY
[
o
-
s
]
*
pdu
[
o
-
s
]
+
psmoothY
[
o
]
*
pdu
[
o
+
s
];
sigmaV
=
psmoothX
[
o
-
1
]
*
pdv
[
o
-
1
]
+
psmoothY
[
o
-
s
]
*
pdv
[
o
-
s
]
+
psmoothY
[
o
]
*
pdv
[
o
+
s
];
A11
=
*
pa22
+
dPsi
;
A12
=
-*
pa12
;
A22
=
*
pa11
+
dPsi
;
det
=
A11
*
A22
-
A12
*
A12
;
A11
/=
det
;
A12
/=
det
;
A22
/=
det
;
B1
=
*
pb1
+
sigmaU
;
B2
=
*
pb2
+
sigmaV
;
pdu
[
o
]
+=
omega
*
(
A11
*
B1
+
A12
*
B2
-
pdu
[
o
]);
pdv
[
o
]
+=
omega
*
(
A12
*
B1
+
A22
*
B2
-
pdv
[
o
]);
++
pa11
;
++
pa12
;
++
pa22
;
++
pb1
;
++
pb2
;
++
o
;
}
//last row
//first column
dPsi
=
psmoothX
[
o
]
+
psmoothY
[
o
-
s
];
sigmaU
=
psmoothX
[
o
]
*
pdu
[
o
+
1
]
+
psmoothY
[
o
-
s
]
*
pdu
[
o
-
s
];
sigmaV
=
psmoothX
[
o
]
*
pdv
[
o
+
1
]
+
psmoothY
[
o
-
s
]
*
pdv
[
o
-
s
];
A11
=
*
pa22
+
dPsi
;
A12
=
-*
pa12
;
A22
=
*
pa11
+
dPsi
;
det
=
A11
*
A22
-
A12
*
A12
;
A11
/=
det
;
A12
/=
det
;
A22
/=
det
;
B1
=
*
pb1
+
sigmaU
;
B2
=
*
pb2
+
sigmaV
;
pdu
[
o
]
+=
omega
*
(
A11
*
B1
+
A12
*
B2
-
pdu
[
o
]);
pdv
[
o
]
+=
omega
*
(
A12
*
B1
+
A22
*
B2
-
pdv
[
o
]);
++
pa11
;
++
pa12
;
++
pa22
;
++
pb1
;
++
pb2
;
++
o
;
//middle columns
for
(
i
=
1
;
i
<
cols
-
1
;
++
i
)
{
dPsi
=
psmoothX
[
o
-
1
]
+
psmoothX
[
o
]
+
psmoothY
[
o
-
s
];
sigmaU
=
psmoothX
[
o
-
1
]
*
pdu
[
o
-
1
]
+
psmoothX
[
o
]
*
pdu
[
o
+
1
]
+
psmoothY
[
o
-
s
]
*
pdu
[
o
-
s
];
sigmaV
=
psmoothX
[
o
-
1
]
*
pdv
[
o
-
1
]
+
psmoothX
[
o
]
*
pdv
[
o
+
1
]
+
psmoothY
[
o
-
s
]
*
pdv
[
o
-
s
];
A11
=
*
pa22
+
dPsi
;
A12
=
-*
pa12
;
A22
=
*
pa11
+
dPsi
;
det
=
A11
*
A22
-
A12
*
A12
;
A11
/=
det
;
A12
/=
det
;
A22
/=
det
;
B1
=
*
pb1
+
sigmaU
;
B2
=
*
pb2
+
sigmaV
;
pdu
[
o
]
+=
omega
*
(
A11
*
B1
+
A12
*
B2
-
pdu
[
o
]);
pdv
[
o
]
+=
omega
*
(
A12
*
B1
+
A22
*
B2
-
pdv
[
o
]);
++
pa11
;
++
pa12
;
++
pa22
;
++
pb1
;
++
pb2
;
++
o
;
}
//last column
dPsi
=
psmoothX
[
o
-
1
]
+
psmoothY
[
o
-
s
];
sigmaU
=
psmoothX
[
o
-
1
]
*
pdu
[
o
-
1
]
+
psmoothY
[
o
-
s
]
*
pdu
[
o
-
s
];
sigmaV
=
psmoothX
[
o
-
1
]
*
pdv
[
o
-
1
]
+
psmoothY
[
o
-
s
]
*
pdv
[
o
-
s
];
A11
=
*
pa22
+
dPsi
;
A12
=
-*
pa12
;
A22
=
*
pa11
+
dPsi
;
det
=
A11
*
A22
-
A12
*
A12
;
A11
/=
det
;
A12
/=
det
;
A22
/=
det
;
B1
=
*
pb1
+
sigmaU
;
B2
=
*
pb2
+
sigmaV
;
pdu
[
o
]
+=
omega
*
(
A11
*
B1
+
A12
*
B2
-
pdu
[
o
]);
pdv
[
o
]
+=
omega
*
(
A12
*
B1
+
A22
*
B2
-
pdv
[
o
]);
++
pa11
;
++
pa12
;
++
pa22
;
++
pb1
;
++
pb2
;
}
merge
(
dWChannels
,
dW
);
}
void
OpticalFlowDeepFlow
::
collectGarbage
()
{
...
...
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