OpenPose C++实现多人姿态估计 - posePairs与mapIdx对应关系中同样的keypoint为什么是不同的值

OpenPose C++实现多人姿态估计

posePairs与mapIdx对应关系中同样的keypoint为什么是不同的值?

flyfish

//COCO的模型
const int kPoints = 18;
//为每个关键点命名,一共18个,不包含背景
//鼻子-0, 脖子-1,右肩-2,右肘-3,右手腕-4,左肩-5,左肘-6,左手腕-7,右臀-8,右膝盖-9,
//右脚踝-10,左臀-11,左膝盖-12,左脚踝-13,右眼-14,左眼-15,有耳朵-16,左耳朵-17
const std::string keypointsMapping[] = {
    "Nose", "Neck",
    "R-Sho", "R-Elb", "R-Wr",
    "L-Sho", "L-Elb", "L-Wr",
    "R-Hip", "R-Knee", "R-Ank",
    "L-Hip", "L-Knee", "L-Ank",
    "R-Eye", "L-Eye", "R-Ear", "L-Ear"
};
//posePairs看下一个结构,posePairs的输出索引 例如1,2 对应,31,32;1,5对应39,40
//一共19对
const std::vector<std::pair<int,int>> mapIdx = {
    {31,32}, {39,40}, {33,34}, {35,36}, {41,42}, {43,44},
    {19,20}, {21,22}, {23,24}, {25,26}, {27,28}, {29,30},
    {47,48}, {49,50}, {53,54}, {51,52}, {55,56}, {37,38},
    {45,46}
};

//0分别与1,14,15,16连接
//Nose分别与Neck,LAnkle,Right Eye,Left Eye连接
//一共19对
//多了耳朵和肩膀的pair,因为当人体是背对相机的,眼睛这个关键点是不可见的,为了更好的预测耳朵,引入这两个虚拟的pair
const std::vector<std::pair<int,int>> posePairs = {
    {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}, {2,17},
    {5,16}
};

看posePairs与mapIdx对应关系
1,2 对应31,32;
1,5对应 39,40
同样的1 ,为什么一个是31而另一个是39?

答:mapIdx一共是19个值,从19开始,0到17已经被posePairs占了,18背景,所以从19开始
19到56,相邻的数是一对,不重复。

关键点15可以连接到17,2也可以连接到17,但在PAF这样定义是不行的
PAFs里的连接只指向一个关键点到另一个关键点的连接,而且不能重复,所以同样的关键点1,在mapIdx是不同的值

Lucas-Kanade光流算法是一种基于局部区域的光流算法,它假设图像任意两帧之间的像素变化是平滑的,然后使用局部区域内的像素变化来估计每个像素的运动向量。在本文,我们将介绍如何在OpenCV实现Lucas-Kanade光流算法。 步骤一:读取图像 首先,我们需要读取两张待计算光流的图像。在本例,我们将使用名为“frame1”和“frame2”的两张图像。 Mat frame1 = imread("frame1.jpg"); Mat frame2 = imread("frame2.jpg"); 步骤二:提取关键点 接下来,我们需要从两个图像提取关键点。我们可以使用OpenCV的FAST或SIFT等算法来提取关键点。在本例,我们将使用FAST算法。 vector<KeyPoint> keypoints1, keypoints2; int threshold = 20; // 设置FAST算法的阈 bool nonmaxSuppression = true; // 设置是否进行非极大抑制 FAST(frame1, keypoints1, threshold, nonmaxSuppression); FAST(frame2, keypoints2, threshold, nonmaxSuppression); 步骤三:计算光流 现在我们已经提取了关键点,接下来我们需要计算这些关键点的光流向量。我们可以使用OpenCV的calcOpticalFlowPyrLK函数来计算光流向量。该函数使用金字塔表示法和Lucas-Kanade算法来计算光流向量。 vector<uchar> status; vector<float> err; Size winSize = Size(21, 21); // 设置光流计算窗口的大小 int maxLevel = 3; // 设置金字塔的最大层数 TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01); // 设置终止条件 calcOpticalFlowPyrLK(frame1, frame2, keypoints1, keypoints2, status, err, winSize, maxLevel, criteria); 步骤四:绘制光流 最后,我们可以将光流向量绘制在第一张图像上,以便我们可以观察到光流的效果。 for (int i = 0; i < keypoints1.size(); i++) { if (status[i]) { Point2f p1 = keypoints1[i].pt; Point2f p2 = keypoints2[i].pt; line(frame1, p1, p2, Scalar(0, 0, 255), 2); } } imshow("Optical Flow", frame1); 完整代码:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西笑生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值