这是一个姿态检测类(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_x
和 scale_y
。然后根据输入参数生成原始裁剪框集合 origin_crop_rects
,并通过调用之前提到的 origin_crops_to_scale
函数将其进行尺度调整得到 crop_rects_scales
。
接下来,对每个人体姿态进行处理。首先计算关键点的中心坐标 center
。然后遍历所有尺度调整后的裁剪框,找到与中心坐标最匹配的裁剪框,并记录相关信息。
接着,根据找到的匹配裁剪框,计算其转换矩阵的逆矩阵,并使用逆矩阵将关键点坐标从缩放尺度调整回原始图像尺度。
最后,检查调整后的关键点是否超出原始检测框范围,并对超出范围的关键点进行置零操作。
请注意,在使用该函数之前需要先实现一些辅助函数和数据结构(如 coordinate_transformation()
、常量定义等),并确保它们的正确性。
内容由零声教学AI助手提供,问题来源于学员提问