movenet モデル。入力サイズは 192x192 です。
人物の姿勢を検出するためのベース クラス。
入力はイメージ (cv:Mat) です。
出力は MovenetResult です。
サンプル コード:
auto image = cv::imread(argv[2]);
if (image.empty()) {
std::cerr << "cannot load " << argv[2] << std::endl;
abort();
}
auto det = vitis::ai::Movenet::create(argv[1]);
vector<vector<int>> limbSeq = {{0, 1}, {0, 2},{0, 3},{0, 4},{0, 5},{0, 6},
{5, 7}, {7, 9}, {6, 8}, {8, 10},
{5, 11}, {6, 12}, {11, 13}, {13, 15},
{12, 14}, {14, 16}};
auto results = det->run(image.clone());
for (size_t i = 0; i < results.poses.size(); ++i) {
cout<< results.poses[i]<<endl;
if (results.poses[i].y >0 && results.poses[i].x > 0) {
cv::putText(image, to_string(i),results.poses[i],
cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 255, 255), 1, 1, 0);
cv::circle(image, results.poses[i], 5, cv::Scalar(0, 255, 0),
-1);
}
}
for (size_t i = 0; i < limbSeq.size(); ++i) {
auto a = results.poses[limbSeq[i][0]];
auto b = results.poses[limbSeq[i][1]];
if (a.x >0 && b.x > 0) {
cv::line(image, a, b, cv::Scalar(255, 0, 0), 3, 4);
}
}
width=400px の場合の movenet モデルの結果を次に示します。
図 1. movenet の結果イメージ。
宣言
typedef struct
{
int width;
int height;
std::vector< cv::Point2f > poses;
} vitis::ai::MovenetResult;
メンバー | 説明 |
---|---|
width | 入力イメージの幅。 |
height | 入力イメージの高さ。 |
poses |
姿勢のベクター。姿勢は Point のベクターによって表されます。関節点の順番は次のとおりです。0: 'nose'、1: 'left_eye'、2: 'right_eye'、3: 'left_ear'、4: 'right_ear'、5: 'left_shoulder'、6: 'right_shoulder'、7: 'left_elbow'、8: 'right_elbow'、9: 'left_wrist'、10: 'right_wrist'、11: 'left_hip'、12: 'right_hip'、13: 'left_knee'、14: 'right_knee'、15: 'left_ankle'、16: 'right_ankle'] |