#include <iostream>
const int POSE_PAIRS[3][20][2] = {
{
{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}
},
{
{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}
},
{
{0,1}, {1,2}, {2,3}, {3,4},
{0,5}, {5,6}, {6,7}, {7,8},
{0,9}, {9,10}, {10,11}, {11,12},
{0,13}, {13,14}, {14,15}, {15,16},
{0,17}, {17,18}, {18,19}, {19,20}
}};
int main(
int argc,
char **argv)
{
"{ h help | false | 打印此帮助消息 }"
"{ p proto | |(必需)模型配置,例如 hand/pose.prototxt }"
"{ m model | |(必需)模型权重,例如 hand/pose_iter_102000.caffemodel }"
"{ i image | |(必需)指向图像文件的路径(包含一个人或手部)}"
"{ d dataset | | 指定训练模型的类型。可以是(COCO、MPI、HAND),取决于数据集。}"
"{ width | 368 | 根据特定宽度调整输入图像大小进行预处理 }"
"{ height | 368 | 重新调整大小到特定高度对输入图像预处理 }"
"{ t threshold | 0.1 | 热图的阈值或置信度值 }"
"{ s scale | 0.003922 | blob 尺度 }"
);
String modelTxt = samples::findFile(parser.get<
string>(
"proto"));
String modelBin = samples::findFile(parser.get<
string>(
"model"));
String imageFile = samples::findFile(parser.get<
String>(
"image"));
int W_in = parser.get<int>("width");
int H_in = parser.get<int>("height");
float thresh = parser.get<float>("threshold");
float scale = parser.get<float>("scale");
if (parser.get<bool>("help") || modelTxt.empty() || modelBin.empty() || imageFile.empty())
{
cout << "用于演示使用训练好的 OpenPose dnn 进行人体或手势检测的示例应用。" << endl;
parser.printMessage();
return 0;
}
int midx, npairs, nparts;
if (!dataset.compare("COCO")) { midx = 0; npairs = 17; nparts = 18; }
else if (!dataset.compare("MPI")) { midx = 1; npairs = 14; nparts = 16; }
else if (!dataset.compare("HAND")) { midx = 2; npairs = 20; nparts = 22; }
else
{
std::cerr << "无法解释数据集参数:" << dataset << std::endl;
exit(-1);
}
{
std::cerr << "无法从该文件中读取图像:" << imageFile << std::endl;
exit(-1);
}
vector<Point> points(22);
for (int n=0; n<nparts; n++)
{
double conf;
if (conf > thresh)
p = pm;
points[n] = p;
}
float SX = float(img.
cols) / W;
float SY = float(img.
rows) / H;
for (int n=0; n<npairs; n++)
{
Point2f a = points[POSE_PAIRS[midx][n][0]];
Point2f b = points[POSE_PAIRS[midx][n][1]];
如果 (a.
x<=0 || a.
y<=0 || b.
x<=0 || b.
y<=0)
继续;
}
return 0;
}
设计用于命令行解析。
定义 utility.hpp:820
MatSize size
定义 mat.hpp:2160
uchar * ptr(int i0=0)
返回指向指定矩阵行的指针。
bool empty() const
如果数组没有元素,则返回 true。
int rows
行和列数或 (-1, -1),当矩阵的维度大于 2 时
定义 mat.hpp:2138
_Tp y
点的 y 坐标
定义 types.hpp:202
_Tp x
点的 x 坐标
定义 types.hpp:201
用于指定图像或矩形尺寸的模板类。
定义 types.hpp:335
此类允许创建和操作全面的人工神经网络。
定义 dnn.hpp:475
void setInput(InputArray blob, const String &name="", double scalefactor=1.0, const Scalar &mean=Scalar())
为网络设置新的输入值。
Mat forward(const String &outputName=String())
运行前向传播计算具有名称 outputName 的层的输出。
void minMaxLoc(InputArray src, double *minVal, double *maxVal=0, Point *minLoc=0, Point *maxLoc=0, InputArray mask=noArray())
查找数组中的全局最小值和最大值。
std::string String
定义 cvstd.hpp:151
#define CV_32F
定义 interface.h:78
@ circle
定义 gr_skig.hpp:62
Mat blobFromImage(InputArray image, double scalefactor=1.0, const Size &size=Size(), const Scalar &mean=Scalar(), bool swapRB=false, bool crop=false, int ddepth=CV_32F)
从图像创建4维blob。还可以从中心调整图像大小并剪裁图像,...
Net readNet(CV_WRAP_FILE_PATH const String &model, CV_WRAP_FILE_PATH const String &config="", const String &framework="")
读取使用一种受支持格式表示的深度学习网络。
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按下键。
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR)
从文件中加载图像。
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
绘制连接两个点的线段。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
与磁盘上文件相关联的文件存储的“黑匣子”表示。
定义 core.hpp:102