mediapipe0.8.9版本如何把holistic输出的2D坐标转化为归一坐标
时间: 2024-02-17 15:02:31 浏览: 131
在mediapipe0.8.9版本中,Holistic模型的输出结果包括身体关键点、面部关键点和手部关键点的2D坐标。这些2D坐标是相对于输入图像的像素坐标系的,它们的值通常是整数。为了将这些坐标转换为归一化坐标,需要进行如下操作:
1. 获取输入图像的宽度和高度。可以通过读取输入图像的shape属性来获取宽度和高度,例如:
```
input_image_height, input_image_width, _ = input_image.shape
```
2. 将2D坐标的x和y值分别除以输入图像的宽度和高度,得到的结果就是归一化坐标。具体来说,可以使用如下代码将2D坐标转换为归一化坐标:
```
normalized_x = x / input_image_width
normalized_y = y / input_image_height
```
3. 重复步骤2,对所有的关键点坐标进行归一化处理。
通过这种方式,Holistic模型输出的2D坐标就被转换为了归一化坐标。这些归一化坐标可以用于后续的处理,例如计算关键点之间的距离、角度等。
需要注意的是,在使用Holistic模型时,需要保证输入图像的宽度和高度与模型训练时使用的图像大小相同。否则,将会导致输出的归一化坐标不准确,从而影响关键点的位置估计。
相关问题
mediapipe 0.8.9 用holistic_tracking_cpu.pbtxt输出右肩坐标
在Mediapipe 0.8.9中,可以使用Holistic模型进行人体姿态估计和跟踪,并输出右肩的坐标。具体方法如下:
1. 配置Holistic模型:在Mediapipe中,需要使用Holistic模型进行人体姿态估计和跟踪,可以通过MediaPipe框架提供的HolisticCalculator类或者直接使用HolisticGraph.pbtxt来进行配置。
2. 处理输入图像:在运行Holistic模型之前,需要将输入图像进行处理,将图像数据转换为TensorFlow的输入格式,并将其传递给Holistic模型进行处理。
3. 解析输出结果:在Holistic模型处理完毕后,可以从输出结果中解析出右肩的坐标。
4. 输出右肩坐标:根据Holistic模型输出的关键点编号,可以获取右肩的坐标。
下面是在Python中使用Holistic模型输出右肩坐标的示例代码:
```python
import cv2
import mediapipe as mp
# 配置Holistic模型
mp_holistic = mp.solutions.holistic
holistic = mp_holistic.Holistic(static_image_mode=False, min_detection_confidence=0.5, min_tracking_confidence=0.5)
# 加载图像
image = cv2.imread('image.jpg')
# 处理输入图像
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = holistic.process(image)
# 解析输出结果
if results.pose_landmarks is not None:
# 获取右肩坐标
right_shoulder_x = results.pose_landmarks.landmark[mp_holistic.PoseLandmark.RIGHT_SHOULDER].x
right_shoulder_y = results.pose_landmarks.landmark[mp_holistic.PoseLandmark.RIGHT_SHOULDER].y
right_shoulder_z = results.pose_landmarks.landmark[mp_holistic.PoseLandmark.RIGHT_SHOULDER].z
# 输出右肩坐标
print('Right shoulder coordinate: ({}, {}, {})'.format(right_shoulder_x, right_shoulder_y, right_shoulder_z))
else:
print('No pose landmarks detected.')
```
需要注意的是,Holistic模型输出的坐标值是归一化的坐标值,范围在[0, 1]之间。如果需要将其转换为图像坐标或者其他坐标系的坐标值,需要进行相应的转换。
mediapipe 0.8.9 用holistic_tracking_cpu.pbtxt输出右肩坐标 c++
在 C++ 中使用 Holistic 模型输出右肩坐标的示例代码如下:
```c++
#include <iostream>
#include <vector>
#include "mediapipe/framework/formats/image_frame.h"
#include "mediapipe/framework/formats/landmark.pb.h"
#include "mediapipe/framework/formats/landmark_list.pb.h"
#include "mediapipe/framework/port/opencv_highgui_inc.h"
#include "mediapipe/framework/port/opencv_imgproc_inc.h"
#include "mediapipe/framework/port/status.h"
#include "mediapipe/framework/port/statusor.h"
#include "mediapipe/framework/tool/options_util.h"
#include "mediapipe/framework/tool/status_util.h"
#include "mediapipe/framework/calculator_framework.h"
#include "mediapipe/framework/calculator_graph.h"
#include "mediapipe/framework/formats/matrix.h"
#include "mediapipe/framework/formats/matrix_data.pb.h"
#include "mediapipe/framework/formats/rect.pb.h"
#include "mediapipe/framework/formats/rect.pb.h"
#include "mediapipe/framework/formats/classification.pb.h"
#include "mediapipe/framework/formats/detection.pb.h"
#include "mediapipe/framework/formats/image_frame_opencv.h"
#include "mediapipe/framework/formats/matrix.h"
#include "mediapipe/framework/formats/matrix_data.pb.h"
#include "mediapipe/framework/formats/matrix_opencv.h"
#include "mediapipe/framework/formats/rect.pb.h"
#include "mediapipe/framework/formats/rect.pb.h"
#include "mediapipe/framework/formats/classification.pb.h"
#include "mediapipe/framework/formats/detection.pb.h"
#include "mediapipe/framework/formats/image_frame_opencv.h"
#include "mediapipe/framework/formats/rect.pb.h"
#include "mediapipe/framework/formats/rect.pb.h"
#include "mediapipe/framework/formats/classification.pb.h"
#include "mediapipe/framework/formats/detection.pb.h"
#include "mediapipe/framework/formats/image_frame_opencv.h"
#include "mediapipe/framework/formats/rect.pb.h"
#include "mediapipe/framework/formats/rect.pb.h"
#include "mediapipe/framework/formats/classification.pb.h"
#include "mediapipe/framework/formats/detection.pb.h"
#include "mediapipe/framework/formats/image_frame_opencv.h"
#include "mediapipe/framework/port/opencv_highgui_inc.h"
#include "mediapipe/framework/port/opencv_imgcodecs_inc.h"
#include "mediapipe/framework/port/opencv_video_inc.h"
#include "mediapipe/framework/port/opencv_videoio_inc.h"
#include "mediapipe/util/resource_util.h"
constexpr char kInputStream[] = "input_video";
constexpr char kOutputStream[] = "output_video";
constexpr char kLandmarksStream[] = "pose_landmarks";
constexpr char kWindowName[] = "MediaPipe";
using namespace mediapipe;
int main() {
// 初始化计算图
CalculatorGraphConfig config =
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
input_stream: "input_video"
output_stream: "output_video"
node {
calculator: "HolisticTrackingCalculator"
input_stream: "IMAGE:input_video"
output_stream: "IMAGE:output_video"
output_stream: "POSE_LANDMARKS:pose_landmarks"
node_options: {
[type.googleapis.com/mediapipe.HolisticTrackingCalculatorOptions] {
min_detection_confidence: 0.5
min_tracking_confidence: 0.5
}
}
}
)");
CalculatorGraph graph;
MP_RETURN_IF_ERROR(graph.Initialize(config));
// 打开摄像头或者视频文件
cv::VideoCapture capture;
capture.open(0);
cv::namedWindow(kWindowName, cv::WINDOW_NORMAL);
cv::resizeWindow(kWindowName, 720, 480);
// 处理帧数据
while (capture.isOpened()) {
bool grabbed = capture.grab();
if (!grabbed) break;
cv::Mat input_frame;
capture.retrieve(input_frame, cv::CAP_PROP_CONVERT_RGB);
// 将 OpenCV 的 Mat 数据转换成 MediaPipe 的 ImageFrame 数据
auto input_frame_mat = absl::make_unique<cv::Mat>(input_frame);
auto input_frame_image =
absl::make_unique<ImageFrame>(ImageFormat::SRGB, input_frame.cols,
input_frame.rows, ImageFrame::kDefaultAlignmentBoundary);
cv::Mat input_frame_mat_bgr;
cv::cvtColor(input_frame, input_frame_mat_bgr, cv::COLOR_RGB2BGR);
cv::Mat input_frame_mat_bgr_flipped;
cv::flip(input_frame_mat_bgr, input_frame_mat_bgr_flipped, /*flipcode=*/1);
cv::Mat input_frame_mat_bgr_flipped_aligned;
cv::Mat temp_output_frame = cv::Mat::zeros(input_frame_mat_bgr_flipped.rows, input_frame_mat_bgr_flipped.cols, input_frame_mat_bgr_flipped.type());
cv::rotate(input_frame_mat_bgr_flipped, temp_output_frame, cv::ROTATE_90_COUNTERCLOCKWISE);
cv::rotate(temp_output_frame, input_frame_mat_bgr_flipped_aligned, cv::ROTATE_180);
cv::Mat input_frame_mat_aligned;
cv::cvtColor(input_frame_mat_bgr_flipped_aligned, input_frame_mat_aligned, cv::COLOR_BGR2RGB);
memcpy(input_frame_image->MutablePixelData(), input_frame_mat_aligned.data,
input_frame_mat_aligned.total() * input_frame_mat_aligned.elemSize());
input_frame_image->SetColorSpace(ImageFrame::ColorSpace::SRGB);
input_frame_image->set_timestamp(Timestamp(capture.get(cv::CAP_PROP_POS_MSEC) * 1000));
// 向计算图输入数据
MP_RETURN_IF_ERROR(graph.AddPacketToInputStream(
kInputStream, Adopt(input_frame_image.release()).At(Timestamp(capture.get(cv::CAP_PROP_POS_MSEC) * 1000))));
// 获取输出结果
mediapipe::Packet pose_landmarks_packet;
if (graph.GetOutputLandmarkList(kLandmarksStream, &pose_landmarks_packet)) {
auto& pose_landmarks = pose_landmarks_packet.Get<mediapipe::NormalizedLandmarkList>();
if (pose_landmarks.landmark_size() > 0) {
// 获取右肩坐标
auto right_shoulder = pose_landmarks.landmark(11);
std::cout << "Right shoulder coordinate: (" << right_shoulder.x() << ", " << right_shoulder.y() << ", " << right_shoulder.z() << ")" << std::endl;
}
}
// 获取输出图像
mediapipe::Packet output_packet;
if (graph.GetOutputPacket(&output_packet, kOutputStream) && !output_packet.IsEmpty()) {
auto& output_frame = output_packet.Get<mediapipe::ImageFrame>();
cv::Mat output_mat = mediapipe::formats::MatView(&output_frame);
cv::Mat output_mat_bgr;
cv::cvtColor(output_mat, output_mat_bgr, cv::COLOR_RGB2BGR);
cv::Mat output_mat_bgr_flipped;
cv::flip(output_mat_bgr, output_mat_bgr_flipped, /*flipcode=*/0);
cv::imshow(kWindowName, output_mat_bgr_flipped);
}
if (cv::waitKey(5) == 27) break;
}
// 关闭计算图
MP_RETURN_IF_ERROR(graph.CloseInputStream(kInputStream));
return graph.WaitUntilDone();
}
```
需要注意的是,Holistic 模型输出的坐标值是归一化的坐标值,范围在[0, 1]之间。如果需要将其转换为图像坐标或者其他坐标系的坐标值,需要进行相应的转换。
阅读全文