ZBLOG

void poseDet::adjustCoordinatesToOriginalImage(TBodyList &bodies, const std::vector &trans_matrixs, const std::vector &origin_det_bo...

这是一个姿态检测类(poseDet)中的成员函数,用于将姿态估计结果的关键点坐标调整到原始图像中。

具体实现如下:

void poseDet::adjustCoordinatesToOriginalImage(TBodyList& bodies,
                                               const std::vector<cv::Mat>& trans_matrixs,
                                               const std::vector<person_box>& origin_det_boxs)
{
    float scale_x = INPUT_SIZE / HEATMAP_RESIZE_WIDTH;
    float scale_y = INPUT_SIZE / HEATMAP_RESIZE_HEIGHT;

    std::vector<cv::Rect> origin_crop_rects;
    for (const auto& origin_det_box : origin_det_boxs)
    {
        origin_crop_rects.emplace_back(origin_det_box.bbox);
    }
    std::vector<cv::Rect> crop_rects_scales = origin_crops_to_scale(trans_matrixs, origin_crop_rects);

    for (auto& body : bodies)
    {
        Point center(0.f, 0.f);
        for (int k = 0; k < KEYPOINT_2D_NUM; k++)
        {
            if (is_point_valid(body[k]))
            {
                center.x = (center.x + body[k].x * scale_x) / 2;
                center.y = (center.y + body[k].y * scale_y) / 2;
            }
        }

        cv::Rect origin_rect_matched;
        cv::Mat trans_matrix_matched;
        float distance = FLT_MAX;
        for (int i = 0; i < crop_rects_scales.size(); i++)
        {
            cv::Rect crop_rect_scale = crop_rects_scales[i];
            Point rect_center(crop_rect_scale.x + crop_rect_scale.width / 2,
                              crop_rect_scale.y + crop_rect_scale.height / 2);
            float dis = obs::distance(center, rect_center);
            if (dis < distance)
            {
                distance = dis;
                origin_rect_matched = origin_crop_rects[i];
                trans_matrix_matched = trans_matrixs[i];
            }
        }

        cv::Mat trans_matrix_inv;
        cv::invert(trans_matrix_matched, trans_matrix_inv);
        for (int k = 0; k < KEYPOINT_2D_NUM; k++)
        {
            if (is_point_valid(body[k]))
            {
                float points[] = {body[k].x * scale_x, body[k].y * scale_y, 1.f};
                cv::Mat_<float> m1(3, 1, points);
                cv::Mat points_ori = trans_matrix_inv * m1;
                body[k].x = points_ori.at<float>(0, 0);
                body[k].y = points_ori.at<float>(1, 0);
            }
            else
            {
                body[k].x = 0;
                body[k].y = 0;
                body[k].score = 0;
            }
            
            // 检查调整后的关键点坐标是否超出原始框范围
            if (body[k].x < origin_rect_matched.x || body[k].y < origin_rect_matched.y ||
                body[k].x >= origin_rect_matched.x + origin_rect_matched.width ||
                body[k].y >= origin_rect_matched.y + origin_rect_matched.height)
            {
                body[k].x = 0;
                body[k].y = 0;
                body[k].score = 0;
            }
        }
    }
}

该函数接受三个参数:bodies 是姿态估计结果,存储了一组人体的关键点坐标;trans_matrixs 是一组转换矩阵(类型为 cv::Mat),用于坐标转换;origin_det_boxs 是一组原始检测框(类型为 person_box)。

在函数内部,首先计算缩放比例 scale_xscale_y。然后根据输入参数生成原始裁剪框集合 origin_crop_rects,并通过调用之前提到的 origin_crops_to_scale 函数将其进行尺度调整得到 crop_rects_scales

接下来,对每个人体姿态进行处理。首先计算关键点的中心坐标 center。然后遍历所有尺度调整后的裁剪框,找到与中心坐标最匹配的裁剪框,并记录相关信息。

接着,根据找到的匹配裁剪框,计算其转换矩阵的逆矩阵,并使用逆矩阵将关键点坐标从缩放尺度调整回原始图像尺度。

最后,检查调整后的关键点是否超出原始检测框范围,并对超出范围的关键点进行置零操作。

请注意,在使用该函数之前需要先实现一些辅助函数和数据结构(如 coordinate_transformation()、常量定义等),并确保它们的正确性。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=17952

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?