【C++风云录】图形和动作捕捉库全面解析:从OpenPose到OpenCV

2024-05-04 13:28

本文主要是介绍【C++风云录】图形和动作捕捉库全面解析:从OpenPose到OpenCV,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

深入浅出:六大计算机视觉和动作捕捉库的教程和比较

前言

本文将为读者详细介绍六种在计算机视觉领域广泛使用的开源软件和SDK,包括OpenPose、Vicon SDK、Intel RealSense SDK、Microsoft Kinect SDK、PCL (Point Cloud Library)和OpenCV。我们会一一解析它们的主要特性以及如何进行安装和使用。

欢迎订阅专栏:C++风云录

文章目录

  • 深入浅出:六大计算机视觉和动作捕捉库的教程和比较
    • 前言
    • 1. OpenPose
      • 1.1 介绍
      • 1.2 主要特性
        • 1.2.1 动作捕捉
        • 1.2.2 姿势估计
      • 1.3 如何使用OpenPose
        • 1.3.1 安装
        • 1.3.2 示例代码
    • 2. Vicon SDK
      • 2.1 介绍
      • 2.2 主要特性
        • 2.2.1 高精度动作捕捉
        • 2.2.2 数据分析工具
      • 2.3 如何使用Vicon SDK
        • 2.3.1 安装
        • 2.3.2 示例代码
    • 3. Intel RealSense SDK
      • 3.1 介绍
      • 3.2 主要特性
        • 3.2.1 深度感知
        • 3.2.2 手势识别
      • 3.3 如何使用Intel RealSense SDK
        • 3.3.1 安装
        • 3.3.2 示例代码
    • 4. Microsoft Kinect SDK
      • 4.1 介绍
      • 4.2 主要特性
        • 4.2.1 跟踪和识别人体骨骼
        • 4.2.2 多媒体交互
      • 4.3 如何使用Kinect SDK
        • 4.3.1 安装
        • 4.3.2 示例代码
    • 5. PCL(Point Cloud Library)
      • 5.1 介绍
      • 5.2 主要特性
        • 5.2.1 三维图像处理
        • 5.2.2 点云数据处理
      • 5.3 如何使用PCL
        • 5.3.1 安装
        • 5.3.2 示例代码
    • 6. OpenCV (Open Source Computer Vision Library)
      • 6.1 介绍
      • 6.2 主要特性
        • 6.2.1 图像处理
        • 6.2.2 特征提取
      • 6.3 如何使用OpenCV
        • 6.3.1 安装
        • 6.3.2 示例代码
    • 总结

1. OpenPose

OpenPose 是一个开源的实时多人2D姿态估计库,使用C++编写,可以用于捕获人体姿势在视频中的关键点。

1.1 介绍

OpenPose是卡耐基梅隆大学(CMU)Perceptual Computing Lab开发的实时人体姿势识别库。它采用深度学习技术,能够识别并追踪图像和视频中人体的关键点。OpenPose不仅限于人体头部、手部、脚部的关键点追踪,还可以进行面部关键点以及足部关键点的检测。

OpenPose项目主页:https://github.com/CMU-Perceptual-Computing-Lab/openpose

1.2 主要特性

OpenPose具有以下几个主要特性:

1.2.1 动作捕捉

OpenPose可以捕捉和分析人体动作,包括但不限于行走、跑步、跳跃等基本运动,同时也可以精确判断出更复杂的动作,如瑜伽、舞蹈等。

1.2.2 姿势估计

OpenPose可以对人体各部位的姿势进行实时估计和追踪,无论是静态图像还是动态视频,都能够生成对应的关键点数据。

1.3 如何使用OpenPose

1.3.1 安装

首先,我们需要从GitHub上下载OpenPose的源码:

git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git
cd openpose 
mkdir build 
cd build 
cmake .. 
make -j`nproc`

通过以上命令,即可成功安装OpenPose。

1.3.2 示例代码

下面是一个简单的OpenPose使用示例,主要演示了如何使用OpenPose识别静态图片中的人体姿势。

#include <openpose/headers.hpp>int main()
{op::Wrapper opWrapper{op::ThreadManagerMode::Asynchronous};opWrapper.configure(op::WrapperStructInput{"/path/to/image.jpg"});opWrapper.start();const auto outputArray = opWrapper.emplaceAndPop(op::Datum{cv::imread("/path/to/image.jpg")});if (!outputArray.empty()){auto& datumProcessed = outputArray.at(0);cv::imshow("OpenPose", datumProcessed.cvOutputData);cv::waitKey(0);}return 0;
}

在上述代码中,我们首先创建一个op::Wrapper对象。然后,我们使用configure方法配置输入图片的路径。接着,我们用start方法启动OpenPose。

最后,我们将处理结果保存在 outputArray 中,并通过 cv::imshow 方法显示出识别结果。

更多使用示例和详细文档,请参考 OpenPose GitHub主页。

2. Vicon SDK

2.1 介绍

Vicon SDK是一款由知名传感器制造商Vicon开发的软件开发工具包,它提供了一系列用于与Vicon动作捕捉系统进行交互的接口。官方网站

2.2 主要特性

2.2.1 高精度动作捕捉

Vicon SDK使得我们能够获取到非常精确的动作数据,这对于需要高精度捕捉人体、动物或者机械运动等领域有着重要应用。

// C++ 示例代码
#include "ViconDataStreamSDK_CPP/DataStreamClient.h"
...
ViconDataStreamSDK::CPP::Output_GetSegmentGlobalTranslation _Output_GetSegmentGlobalTranslation;
...
_Output_GetSegmentGlobalTranslation = MyClient.GetSegmentGlobalTranslation( SubjectName, SegmentName );
2.2.2 数据分析工具

Vicon SDK还提供了一套完善的数据分析工具,使得用户能够对捕捉到的数据进行深入分析和研究。

// C++ 示例代码
#include "ViconDataStreamSDK_CPP/DataStreamClient.h"
...
ViconDataStreamSDK::CPP::Output_GetSegmentGlobalRotationEulerXYZ _Output_GetSegmentGlobalRotationEulerXYZ;
...
_Output_GetSegmentGlobalRotationEulerXYZ = MyClient.GetSegmentGlobalRotationEulerXYZ( SubjectName, SegmentName );

2.3 如何使用Vicon SDK

2.3.1 安装

你可以按照Vicon SDK官方文档上的指引安装并设置Vicon SDK。

2.3.2 示例代码

以下是一个简单的C++代码示例,演示了如何使用Vicon SDK获取动作数据。

// C++ 示例代码
#include "ViconDataStreamSDK_CPP/DataStreamClient.h"int main()
{// 创建客户端对象ViconDataStreamSDK::CPP::Client MyClient;// 连接到服务器std::string HostName = "localhost:801";MyClient.Connect( HostName );// 获取并打印主题数量size_t SubjectCount = MyClient.GetSubjectCount().SubjectCount;std::cout << "Number of subjects: " << SubjectCount << std::endl;return 0;
}

更多详细的示例代码和使用教程,你可以参考Vicon SDK官方文档。

3. Intel RealSense SDK

3.1 介绍

Intel RealSense SDK是一个强大的套件,用于通过Intel RealSense相机构建和优化深度感知应用程序。此SDK包含一系列API,可以帮助开发者轻松地访问硬件功能和数据流。

官方网站链接

3.2 主要特性

3.2.1 深度感知

Intel RealSense SDK支持深度感知技术,这使得相机可以感知三维空间的物体,并能够提取出深度图像。比如以下代码实例展示了如何获取深度图像:

// Include the RealSense library
#include <librealsense2/rs.hpp>int main(){// Declare depth colorizer for pretty visualization of depth datars2::colorizer color_map;// Create a pipeline to configure, start and stop camera streamsrs2::pipeline pipe;// Start streaming with default recommended configurationpipe.start();while(true){rs2::frameset data = pipe.wait_for_frames(); // Wait for next set of frames from the camerars2::frame depth = color_map(data.get_depth_frame()); // Find and colorize the depth data// Your code here}return 0;
}
3.2.2 手势识别

Intel RealSense SDK还支持手势识别技术,使得相机能够识别特定的手势。以下代码实例展示了如何使用手势识别:

// Include the RealSense library
#include <librealsense2/hpp/rs_processing.hpp>int main(){// Initialize hand modulers2::context ctx;rs2::device_list devices = ctx.query_devices();rs2::device dev = devices[0];rs2::pipeline p(dev);p.start();while(true){rs2::frameset frames = p.wait_for_frames();rs2::depth_frame depth = frames.get_depth_frame();// Call the hand processing methodrs2::hand_module hm;hm.process(depth);// Your code here}return 0;
}

3.3 如何使用Intel RealSense SDK

3.3.1 安装

在开始使用Intel RealSense SDK之前,你需要首先安装它。你可以直接从Intel RealSense官方网站下载并安装。

3.3.2 示例代码

Intel RealSense SDK提供了丰富的实例代码,你可以从其GitHub仓库中获取。下面是一个简单的示例,展示了如何初始化相机并获取一帧图像:

// Include the RealSense library
#include <librealsense2/rs.hpp>int main(){// Create a pipeline to configure, start and stop camera streamsrs2::pipeline pipe;// Start streaming with default recommended configurationpipe.start();// Block program until frames arrivers2::frameset frames = pipe.wait_for_frames();// Try to get a frame of a depth imagers2::depth_frame depth = frames.get_depth_frame();// Print the size of the depth framestd::cout << "Width: " << depth.get_width() << ", Height: " << depth.get_height() << std::endl;return 0;
}

以上代码首先创建了一个rs2::pipeline对象,并调用start()函数开始流式传输。然后,它等待一组帧(frameset)到达,尝试获取深度帧,并打印出深度帧的尺寸。

这只是使用Intel RealSense SDK的一种基本方式,更多功能和研究可以在官方API文档中找到。# Microsoft Kinect SDK教程

4. Microsoft Kinect SDK

4.1 介绍

Microsoft Kinect SDK是由微软公司开发的一种用于操控Kinect感应器的软件开发工具包。 Kinect感应器能够捕获人体骨架、声音以及深度图像等信息,因此被广泛应用在游戏、娱乐以及其他交互式应用中。

官方SDK链接:Microsoft Kinect SDK

4.2 主要特性

4.2.1 跟踪和识别人体骨骼

使用Kinect SDK可以实现对人体骨架的跟踪和识别。SDK可以提供主动跟踪的骨骼数据,如关键帧、关节旋转等。

NUI_SKELETON_FRAME SkeletonFrame;while ( true )
{// Get a frameHRESULT hr = Sensor->NuiSkeletonGetNextFrame( 0, &SkeletonFrame );if ( FAILED( hr ) ){cout << "Failed to get skeleton frame" << endl;continue;}// Find the skeletonfor ( int i = 0; i < NUI_SKELETON_COUNT; ++i ){if ( SkeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED ){// Do something with the skeleton}}
}
4.2.2 多媒体交互

Kinect SDK允许开发者利用Kinect感应器获取的数据创建丰富的多媒体交互应用,例如语音识别、手势控制等。

// Create an instance of a speech recognizer
ISpRecognizer* pRecognizer;
HRESULT hr = CoCreateInstance(CLSID_SpSharedRecognizer,NULL, CLSCTX_ALL, IID_ISpRecognizer,(void **)&pRecognizer);if (SUCCEEDED(hr))
{// Do something with the recognizer
}

4.3 如何使用Kinect SDK

4.3.1 安装

在使用Kinect SDK之前,需要先安装Kinect SDK。可以直接从微软官网下载安装程序。

4.3.2 示例代码

以下示例显示了如何使用Kinect SDK初始化Kinect设备:

INuiSensor* sensor;HRESULT hr = NuiCreateSensorByIndex(0, &sensor);if (FAILED(hr))
{cout << "Could not find a Kinect sensor" << endl;return hr;
}hr = sensor->NuiInitialize(NUI_INITIALIZE_FLAG_USES_SKELETON);if (FAILED(hr))
{cout << "Could not initialize the Kinect sensor" << endl;return hr;
}

参考资源:Microsoft Kinect SDK documentation

5. PCL(Point Cloud Library)

5.1 介绍

PCL,全称Point Cloud Library(点云库),是一个跨平台的开源C++库,主要用于处理三维对象的点云数据。它可以应用于多种领域,包括图像处理、机器视觉、机器学习等。

更多关于PCL的信息可参考其官方网站:http://pointclouds.org/

5.2 主要特性

PCL具有多种强大的功能和特性,下面就来看一下其中的两个主要特性。

5.2.1 三维图像处理

PCL支持对三维图像进行各种处理,例如滤波、特征提取、配准等。这对于处理大量三维图像数据非常有帮助。

#include <pcl/filters/passthrough.h>pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud (cloud);
pass.setFilterFieldName ("z");
pass.setFilterLimits (0.0, 1.0);
//pass.setFilterLimitsNegative (true);
pass.filter (*cloud_filtered);

上述代码展示如何使用PCL进行滤波处理。

5.2.2 点云数据处理

PCL还支持对点云数据进行处理,例如降采样、滤波、切割等。

#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud (cloud);
sor.setLeafSize (0.01f, 0.01f, 0.01f);
sor.filter (*cloud_filtered);

上述代码示例展示了如何使用PCL对点云进行降采样处理。

5.3 如何使用PCL

5.3.1 安装

在Ubuntu平台上安装PCL可以通过以下命令:

sudo apt-get install libpcl-dev

其他平台的安装方法可以参考官方文档:http://pointclouds.org/downloads/

5.3.2 示例代码

下面这段代码示例展示了如何使用PCL读取点云数据并进行可视化。

#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>int user_data;void
viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{viewer.setBackgroundColor (1.0, 0.5, 1.0);pcl::PointXYZ o;o.x = 1.0;o.y = 0;o.z = 0;viewer.addSphere (o, 0.25, "sphere", 0);std::cout << "i only run once" << std::endl;
}void
viewerPsycho (pcl::visualization::PCLVisualizer& viewer)
{static unsigned count = 0;std::stringstream ss;ss << "Once per viewer loop: " << count++;viewer.removeShape ("text", 0);viewer.addText (ss.str(), 200, 300, "text", 0);user_data++;
}int main ()
{pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);pcl::io::loadPCDFile ("my_point_cloud.pcd", *cloud);pcl::visualization::CloudViewer viewer("Cloud Viewer");viewer.showCloud(cloud);viewer.runOnVisualizationThreadOnce (viewerOneOff);viewer.runOnVisualizationThread (viewerPsycho);while (!viewer.wasStopped ()){user_data++;}return 0;
}

更多的PCL代码示例可参考其官方教程:http://pointclouds.org/documentation/tutorials/

6. OpenCV (Open Source Computer Vision Library)

6.1 介绍

OpenCV是一个开源的计算机视觉和机器学习库。它包含超过2500个优化的算法,能够处理图像和视频的分析以及识别任务。这一库非常适用于实时应用,并且已被广泛地运用在体育分析和运动科学中来提取并分析数据。

官网链接:OpenCV

6.2 主要特性

6.2.1 图像处理

OpenCV具有强大的图像处理功能,可以进行图像扩展、滤波、直方图等操作。此外,它还支持对图像进行几何变换、色彩空间转换等高级操作。

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>using namespace cv;int main(int argc, char** argv)
{// Load an imageMat src = imread(argv[1], 1);// Apply Gaussian BlurMat dst;GaussianBlur(src, dst, Size(15, 15), 0, 0);// Show the blurred imageimshow("Gaussian Blur", dst);waitKey(0);return 0;
}
6.2.2 特征提取

OpenCV还支持各种特征提取方法,比如SIFT、ORB、SURF等,这些都可以用于图像识别、跟踪等任务。

#include <opencv2/features2d.hpp>using namespace std;
using namespace cv;int main(int argc, char** argv)
{// Load an imageMat src = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);// Initiate SIFT detectorPtr<SIFT> sift = SIFT::create();// find the keypoints and descriptors with SIFTvector<KeyPoint> kp;Mat des;sift->detectAndCompute( src, Mat(), kp, des );// draw keypointMat img_kp;drawKeypoints( src, kp, img_kp, Scalar::all(-1), DrawMatchesFlags::DEFAULT );// Show the imageimshow("Keypoints", img_kp);waitKey(0);return 0;
}

6.3 如何使用OpenCV

6.3.1 安装

首先需要在你的机器上安装OpenCV。你可以访问其官方GitHub页面获取详细的安装指南。

6.3.2 示例代码

以下是一个简单的例子,演示了如何使用OpenCV在图像上检测和绘制角点。

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/features2d.hpp>using namespace std;
using namespace cv;int main(int argc, char** argv)
{// Load an imageMat src = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);// Apply corner detectionint maxCorners = 200;double qualityLevel = 0.01;double minDistance = 10;Mat corners;goodFeaturesToTrack(src, corners, maxCorners, qualityLevel, minDistance);// Draw cornersfor(int i = 0; i < corners.rows; i++){circle(src, corners.at<Point2f>(i,0), 3, Scalar(255), -1);}// Show the image with cornersimshow("Corners", src);waitKey(0);return 0;
}

这只是OpenCV库的一部分功能,它还包含了许多其他强大的函数和类,可以帮助你在体育分析和运动科学领域进行更深入的研究。

总结

经过详细解析和比较, OpenPose、Vicon SDK、Intel RealSense SDK、Microsoft Kinect SDK、PCL和OpenCV各有所长,供用户根据实际需求进行选择。通过学习并掌握这些工具的使用,可以极大提高在计算机视觉领域的研究和开发效率。

这篇关于【C++风云录】图形和动作捕捉库全面解析:从OpenPose到OpenCV的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959295

相关文章

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo