Мы пытаемся запустить исходный код на Python / C ++ / opencv, переведенный на NodeJS / opencv4nodejs.
Наш интерес связан только с позами для рук. Openposes обнаруживает 22 раздачи в разных позах.
Оригинальный источник по этой ссылке:
https://github.com/opencv/opencv/blob/master/samples/dnn/openpose.cpp
и
https://github.com/opencv/opencv/blob/master/samples/dnn/openpose.py
Наш источник:
import cv from 'opencv4nodejs';
import fs from 'fs';
import path from 'path';
function handDetect1(img) {
let POSE_PAIRS = [
[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] // smal
];
let nPoints = 22;
const [frameHeight, frameWidth] = img.sizes;
let threshold = 0.01;
let inHeight = 368;
let inWidth = 368;
const inputBlob = cv.blobFromImage(img, 1 / 255.0, new cv.Size(inWidth, inHeight),
new cv.Vec(0,0,0), false, false);
const ssdcocoModelPath = './data/dnn/handpose';
if (!cv.modules.dnn) {
throw new Error('exiting: opencv4nodejs compiled without dnn module');
}
const prototxt = path.resolve(ssdcocoModelPath, 'pose_deploy.prototxt');
const modelFile = path.resolve(ssdcocoModelPath, 'pose_iter_102000.caffemodel');
if (!fs.existsSync(prototxt) || !fs.existsSync(modelFile)) {
throw new Error('exiting: could not find ssd pesrson pose net model');
}
let net = cv.readNetFromCaffe(prototxt, modelFile);
net.setInput(inputBlob);
let output = this.net.forward();
/*
output.sizes[0] == 1;
output.sizes[1] == 22;
output.sizes[2] == 46;
output.sizes[3] == 46;
*/
let H = output.sizes[2];
let W = output.sizes[3];
let SX = img.cols / W;
let SY = img.rows / H;
let outArray = output.getDataAsArray();
let points = [];
for(let n=0;n<nPoints;n++) {
let probMap = new cv.Mat(Buffer.from(outArray[0][n]), H,W, cv.CV_32F );
// let probMap = new cv.Mat([outArray[0][n]], cv.CV_32F );
probMap = probMap.resize(new cv.Size(frameWidth, frameHeight));
let {minVal, maxVal, minLoc, maxLoc} = cv.minMaxLoc(probMap);
maxLoc = new cv.Point2(
(maxLoc.x*SX),
(maxLoc.y*SY)
);
if (maxVal > threshold) {
let point = maxLoc;
points.push(point);
img.drawCircle(point, 8, new cv.Vec(0,255,255));
img.putText(String(n), point, cv.FONT_HERSHEY_SIMPLEX, 1, new cv.Vec(0,0,255), 2);
}
else {
points.push(null);
}
}
return img;
}
На этом рисунке показан ожидаемый результат:
Ожидаемые очки рук
Реальный результат, который мы получили, неверен- показывает некоторые точки в случайных положениях в img.