-
-
Save berak/eef67a1afb4b6445d117ea1a0135c8db to your computer and use it in GitHub Desktop.
import org.opencv.core.*; | |
import org.opencv.dnn.*; | |
import org.opencv.imgcodecs.Imgcodecs; | |
import org.opencv.imgproc.Imgproc; | |
import java.util.*; | |
public class SimpleSample { | |
public static void main(String[] args) { | |
// Load the native library. | |
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); | |
Mat img = Imgcodecs.imread("c:/data/img/persons/single2.png"); | |
// read the network model | |
//Net net = Dnn.readNetFromTensorflow("c:/data/mdl/body/tf_small.pb"); | |
Net net = Dnn.readNetFromCaffe("c:/data/mdl/body/openpose_pose_coco.prototxt", "c:/data/mdl/body/pose_iter_440000.caffemodel"); | |
// send it through the network | |
//Mat inputBlob = Dnn.blobFromImage(img, 1.0, new Size(368,368), new Scalar(0, 0, 0), false, false); | |
Mat inputBlob = Dnn.blobFromImage(img, 1.0 / 255, new Size(368,368), new Scalar(0, 0, 0), false, false); | |
net.setInput(inputBlob); | |
Mat result = net.forward().reshape(1,19); // 19 body parts | |
//Mat result = net.forward().reshape(1,57); // 19 body parts + 2 * 19 PAF maps | |
System.out.println(result); | |
// get the heatmap locations | |
ArrayList<Point> points = new ArrayList(); | |
for (int i=0; i<18; i++) { // skip background | |
Mat heatmap = result.row(i).reshape(1,46); // 46x46 | |
Core.MinMaxLocResult mm = Core.minMaxLoc(heatmap); | |
Point p = new Point(); | |
if (mm.maxVal>0.1f) { | |
p = mm.maxLoc; | |
} | |
points.add(p); | |
System.out.println(i + " " + p + " " + heatmap); | |
} | |
// 17 possible limb connections | |
int pairs[][] = { | |
{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} | |
}; | |
// connect body parts and draw it ! | |
float SX = (float)(img.cols()) / 46; | |
float SY = (float)(img.rows()) / 46; | |
for (int n=0; n<17; n++) | |
{ | |
// lookup 2 connected body/hand parts | |
Point a = points.get(pairs[n][0]).clone(); | |
Point b = points.get(pairs[n][1]).clone(); | |
// 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; | |
Imgproc.line(img, a, b, new Scalar(0,200,0), 2); | |
Imgproc.circle(img, a, 3, new Scalar(0,0,200), -1); | |
Imgproc.circle(img, b, 3, new Scalar(0,0,200), -1); | |
} | |
Imgcodecs.imwrite("pose.png", img); | |
} | |
} |
hi @abedshouman , 19 is hardcoded to the coco body model (using opencv's tailored prototxt)
what data do you try to use ?
hehe, perfect, pleasure ;)
Hi, berak. Your sample is very useful for a beginner like me.
Can you please explain furthermore on how should I change these value if I want to work with handPoseImage
Mat inputBlob = Dnn.blobFromImage(img, 1.0 / 255, new Size(368,368), new Scalar(0, 0, 0), false, false);
Mat heatmap = result.row(i).reshape(1,46);
How do you get 368 and 46?
Thank you so much.
sorry, but i never tried with the hand model. you'll have to adapt the pairs:
and number of limbs/pairs:
How do you get 368 and 46?
from the original code / paper. 368 = 46 * 8
. the heatmaps are 1/8 of the input size.
good luck ;)
Does this support multiple person?
@docete, no only single person
learnopencv.com has some code for multiple
@berak I rewrite the learnopencv.com's multi-person-openpose with Java API, but the key points of 'group.jpg' was all jumbled up.
I post my code at https://gist.github.com/docete/38bb39390da8e8c823c3211419b9a5ad
Is there any way you can have a look at it?
@berak I rewrite the learnopencv.com's multi-person-openpose with Java API, but the key points of 'group.jpg' was all jumbled up.
I post my code at https://gist.github.com/docete/38bb39390da8e8c823c3211419b9a5ad
Is there any way you can have a look at it?
Figure it out that I misuse the 'reshape' in splitNetOutputBlobToParts.
hello,
Im getting this error on line 22 "Mat result = net.forward().reshape(1,19);"
error: (-209:Sizes of input arguments do not match) Requested and source matrices have different count of elements in function 'reshape'