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
4f597f6c
Commit
4f597f6c
authored
Mar 16, 2018
by
berak
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dnn: add an openpose.cpp sample
parent
24bed38c
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
168 additions
and
0 deletions
+168
-0
openpose.cpp
samples/dnn/openpose.cpp
+168
-0
No files found.
samples/dnn/openpose.cpp
0 → 100644
View file @
4f597f6c
//
// this sample demonstrates the use of pretrained openpose networks with opencv's dnn module.
//
// it can be used for body pose detection, using either the COCO model(18 parts):
// http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/coco/pose_iter_440000.caffemodel
// https://raw.githubusercontent.com/opencv/opencv_extra/master/testdata/dnn/openpose_pose_coco.prototxt
//
// or the MPI model(16 parts):
// http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/mpi/pose_iter_160000.caffemodel
// https://raw.githubusercontent.com/opencv/opencv_extra/master/testdata/dnn/openpose_pose_mpi_faster_4_stages.prototxt
//
// (to simplify this sample, the body models are restricted to a single person.)
//
//
// you can also try the hand pose model:
// http://posefs1.perception.cs.cmu.edu/OpenPose/models/hand/pose_iter_102000.caffemodel
// https://raw.githubusercontent.com/CMU-Perceptual-Computing-Lab/openpose/master/models/hand/pose_deploy.prototxt
//
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using
namespace
cv
;
using
namespace
cv
::
dnn
;
#include <iostream>
using
namespace
std
;
// connection table, in the format [model_id][pair_id][from/to]
// please look at the nice explanation at the bottom of:
// https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/output.md
//
const
int
POSE_PAIRS
[
3
][
20
][
2
]
=
{
{
// COCO body
{
1
,
2
},
{
1
,
5
},
{
2
,
3
},
{
3
,
4
},
{
5
,
6
},
{
6
,
7
},
{
1
,
8
},
{
8
,
9
},
{
9
,
10
},
{
1
,
11
},
{
11
,
12
},
{
12
,
13
},
{
1
,
0
},
{
0
,
14
},
{
14
,
16
},
{
0
,
15
},
{
15
,
17
}
},
{
// MPI body
{
0
,
1
},
{
1
,
2
},
{
2
,
3
},
{
3
,
4
},
{
1
,
5
},
{
5
,
6
},
{
6
,
7
},
{
1
,
14
},
{
14
,
8
},
{
8
,
9
},
{
9
,
10
},
{
14
,
11
},
{
11
,
12
},
{
12
,
13
}
},
{
// hand
{
0
,
1
},
{
1
,
2
},
{
2
,
3
},
{
3
,
4
},
// thumb
{
0
,
5
},
{
5
,
6
},
{
6
,
7
},
{
7
,
8
},
// pinkie
{
0
,
9
},
{
9
,
10
},
{
10
,
11
},
{
11
,
12
},
// middle
{
0
,
13
},
{
13
,
14
},
{
14
,
15
},
{
15
,
16
},
// ring
{
0
,
17
},
{
17
,
18
},
{
18
,
19
},
{
19
,
20
}
// small
}};
int
main
(
int
argc
,
char
**
argv
)
{
CommandLineParser
parser
(
argc
,
argv
,
"{ h help | false | print this help message }"
"{ p proto | | (required) model configuration, e.g. hand/pose.prototxt }"
"{ m model | | (required) model weights, e.g. hand/pose_iter_102000.caffemodel }"
"{ i image | | (required) path to image file (containing a single person, or hand) }"
"{ t threshold | 0.1 | threshold or confidence value for the heatmap }"
);
String
modelTxt
=
parser
.
get
<
string
>
(
"proto"
);
String
modelBin
=
parser
.
get
<
string
>
(
"model"
);
String
imageFile
=
parser
.
get
<
String
>
(
"image"
);
float
thresh
=
parser
.
get
<
float
>
(
"threshold"
);
if
(
parser
.
get
<
bool
>
(
"help"
)
||
modelTxt
.
empty
()
||
modelBin
.
empty
()
||
imageFile
.
empty
())
{
cout
<<
"A sample app to demonstrate human or hand pose detection with a pretrained OpenPose dnn."
<<
endl
;
parser
.
printMessage
();
return
0
;
}
// fixed input size for the pretrained network
int
W_in
=
368
;
int
H_in
=
368
;
// read the network model
Net
net
=
readNetFromCaffe
(
modelTxt
,
modelBin
);
// and the image
Mat
img
=
imread
(
imageFile
);
if
(
img
.
empty
())
{
std
::
cerr
<<
"Can't read image from the file: "
<<
imageFile
<<
std
::
endl
;
exit
(
-
1
);
}
// send it through the network
Mat
inputBlob
=
blobFromImage
(
img
,
1.0
/
255
,
Size
(
W_in
,
H_in
),
Scalar
(
0
,
0
,
0
),
false
,
false
);
net
.
setInput
(
inputBlob
);
Mat
result
=
net
.
forward
();
// the result is an array of "heatmaps", the probability of a body part being in location x,y
int
midx
,
npairs
;
int
nparts
=
result
.
size
[
1
];
int
H
=
result
.
size
[
2
];
int
W
=
result
.
size
[
3
];
// find out, which model we have
if
(
nparts
==
19
)
{
// COCO body
midx
=
0
;
npairs
=
17
;
nparts
=
18
;
// skip background
}
else
if
(
nparts
==
16
)
{
// MPI body
midx
=
1
;
npairs
=
14
;
}
else
if
(
nparts
==
22
)
{
// hand
midx
=
2
;
npairs
=
20
;
}
else
{
cerr
<<
"there should be 19 parts for the COCO model, 16 for MPI, or 22 for the hand one, but this model has "
<<
nparts
<<
" parts."
<<
endl
;
return
(
0
);
}
// find the position of the body parts
vector
<
Point
>
points
(
22
);
for
(
int
n
=
0
;
n
<
nparts
;
n
++
)
{
// Slice heatmap of corresponding body's part.
Mat
heatMap
(
H
,
W
,
CV_32F
,
result
.
ptr
(
0
,
n
));
// 1 maximum per heatmap
Point
p
(
-
1
,
-
1
),
pm
;
double
conf
;
minMaxLoc
(
heatMap
,
0
,
&
conf
,
0
,
&
pm
);
if
(
conf
>
thresh
)
p
=
pm
;
points
[
n
]
=
p
;
}
// connect body parts and draw it !
float
SX
=
float
(
img
.
cols
)
/
W
;
float
SY
=
float
(
img
.
rows
)
/
H
;
for
(
int
n
=
0
;
n
<
npairs
;
n
++
)
{
// lookup 2 connected body/hand parts
Point2f
a
=
points
[
POSE_PAIRS
[
midx
][
n
][
0
]];
Point2f
b
=
points
[
POSE_PAIRS
[
midx
][
n
][
1
]];
// we did not find enough confidence before
if
(
a
.
x
<=
0
||
a
.
y
<=
0
||
b
.
x
<=
0
||
b
.
y
<=
0
)
continue
;
// scale to image size
a
.
x
*=
SX
;
a
.
y
*=
SY
;
b
.
x
*=
SX
;
b
.
y
*=
SY
;
line
(
img
,
a
,
b
,
Scalar
(
0
,
200
,
0
),
2
);
circle
(
img
,
a
,
3
,
Scalar
(
0
,
0
,
200
),
-
1
);
circle
(
img
,
b
,
3
,
Scalar
(
0
,
0
,
200
),
-
1
);
}
imshow
(
"OpenPose"
,
img
);
waitKey
();
return
0
;
}
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