【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

相关文章

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php