当前位置: 首页 > news >正文

月熊志网站百度热搜的含义

月熊志网站,百度热搜的含义,做网站遇到的问题,河南洛阳网站建设使用 C 和 OpenCV DNN 进行人体姿态估计 本文将介绍如何使用 C 和 OpenCV 的深度神经网络(DNN)模块来识别人类肢体,即进行人体姿态估计 (Human Pose Estimation)。我们的目标是读取一张包含人物的图片,并检测出人体的关键点&…

使用 C++ 和 OpenCV DNN 进行人体姿态估计

本文将介绍如何使用 C++ 和 OpenCV 的深度神经网络(DNN)模块来识别人类肢体,即进行人体姿态估计 (Human Pose Estimation)。我们的目标是读取一张包含人物的图片,并检测出人体的关键点(如头部、肩膀、手腕等),然后将这些关键点连接起来,形成一个“骨架”。

📝 核心概念

  1. 姿态估计: 这个任务的目标是识别人体图像中的关键关节(Keypoints)。这些关节的集合可以勾勒出人体的姿态和骨架。

  2. OpenCV DNN 模块: OpenCV 提供了一个功能强大的 cv::dnn 模块,它能够加载预先训练好的深度学习模型并进行推理(Inference)。我们不需要自己训练模型,而是使用社区已经训练好的模型文件。

  3. 预训练模型: 我们将使用一个基于 OpenPose 并且适用于 MPII (Max Planck Institute for Informatics) 数据集的模型。这个模型由两个文件组成:

    • pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt: 模型的网络结构定义文件。
    • pose/mpi/pose_iter_160000.caffemodel: 模型的预训练权重文件。
  4. 热力图 (Heatmaps): 模型在进行推理后,不会直接返回关节点坐标。它会为每个关节点(如左肩、右膝)生成一张热力图。热力图上每个像素的亮度代表该位置是对应关节点的置信度。我们只需要在每张热力图上找到最亮的点,就能确定关节点的位置。


🛠️ 环境准备

在开始编码之前,请确保你已经准备好以下环境:

  • C++ 编译器: 如 G++, Clang, 或 MSVC。
  • OpenCV 库: 确保你安装的 OpenCV 版本包含了 dnnhighgui 模块。你可以从 OpenCV 官网 下载。
  • 预训练模型文件:
    1. 创建一个名为 models 的文件夹。
    2. 下载模型文件并将它们放入 models 文件夹。你可以从 OpenCV 的 GitHub 仓库 获取:
      • pose_deploy_linevec_faster_4_stages.prototxt (下载后可重命名)
      • pose_iter_160000.caffemodel

💻 代码实现

我们将整个过程分解为加载模型、图像预处理、模型推理、解析结果和绘制骨架几个步骤。

1. 包含头文件和定义常量

首先,我们需要包含必要的 OpenCV 头文件,并定义一些常量,比如模型的输入尺寸和关节点的配对关系。

#include <iostream>
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>// 使用 MPII 数据集训练的模型,它定义了15个关节点
const int nPoints = 15;// 定义关节点之间的连接关系
// 例如 {0, 1} 表示连接第0个关节点(头)和第1个关节点(颈)
const int POSE_PAIRS[14][2] = {{0, 1}, {1, 2}, {2, 3}, {3, 4},   // 右臂{1, 5}, {5, 6}, {6, 7},   // 左臂{1, 14}, {14, 8}, {8, 9}, {9, 10},  // 右腿{14, 11}, {11, 12}, {12, 13} // 左腿
};

2. 主函数和模型加载

main 函数中,我们首先加载 Caffe 模型,然后读取待处理的图像。

int main(int argc, char **argv) {// ---- 模型和图像路径 ----std::string protoFile = "models/pose_deploy_linevec_faster_4_stages.prototxt";std::string weightsFile = "models/pose_iter_160000.caffemodel";std::string imageFile = "person.jpg"; // 替换成你自己的图片路径if (argc > 1) {imageFile = argv[1];}// ---- 加载网络 ----cv::dnn::Net net = cv::dnn::readNetFromCaffe(protoFile, weightsFile);if (net.empty()) {std::cerr << "Error: Could not load the network." << std::endl;return -1;}// ---- 读取并处理图像 ----cv::Mat frame = cv::imread(imageFile);if (frame.empty()) {std::cerr << "Error: Could not read the image." << std::endl;return -1;}cv::Mat frameCopy = frame.clone();

3. 图像预处理与模型推理

神经网络需要特定格式的输入。我们使用 cv::dnn::blobFromImage 函数来创建一个 “blob”,它将图像转换成适合网络输入的格式。然后,执行 net.forward() 进行推理。

    // ---- 准备输入 ----int inWidth = 368;int inHeight = 368;double thresh = 0.1; // 置信度阈值// 将图像转换为 blobcv::Mat inpBlob = cv::dnn::blobFromImage(frame, 1.0 / 255, cv::Size(inWidth, inHeight), cv::Scalar(0, 0, 0), false, false);// 设置网络输入net.setInput(inpBlob);// ---- 进行推理 ----// net.forward() 返回一个 4D Mat,维度是 (1, num_parts, height, width)cv::Mat output = net.forward();int H = output.size[2];int W = output.size[3];

4. 解析输出并定位关键点

推理的输出是包含了所有关节点热力图的 Mat 对象。我们需要遍历每一张热力图,使用 cv::minMaxLoc 找到置信度最高的点,并将其坐标记录下来。

    // ---- 寻找关键点 ----std::vector<cv::Point> points(nPoints);for (int n = 0; n < nPoints; n++) {// 获取第 n 个关节点的热力图cv::Mat heatMap(H, W, CV_32F, output.ptr(0, n));// 寻找热力图中的最大值及其位置double conf;cv::Point point;cv::minMaxLoc(heatMap, 0, &conf, 0, &point);// 如果置信度大于阈值,则记录该点if (conf > thresh) {// 将坐标从热力图尺寸映射回原图尺寸int x = (int)((float)frame.cols * point.x / W);int y = (int)((float)frame.rows * point.y / H);points[n] = cv::Point(x, y);} else {points[n] = cv::Point(-1, -1); // 标记为未检测到}}

5. 绘制骨架和显示结果

最后一步是根据我们之前定义的 POSE_PAIRS 数组,将检测到的关节点用线连接起来,形成骨架。我们也在每个关节点的位置画一个圆圈来使其更显眼。

    // ---- 绘制骨架 ----for (int i = 0; i < 14; i++) {cv::Point2i partA = points[POSE_PAIRS[i][0]];cv::Point2i partB = points[POSE_PAIRS[i][1]];// 只绘制检测到的关节点之间的连线if (partA.x > 0 && partA.y > 0 && partB.x > 0 && partB.y > 0) {cv::line(frame, partA, partB, cv::Scalar(0, 255, 0), 2);cv::circle(frame, partA, 5, cv::Scalar(0, 0, 255), -1);cv::circle(frame, partB, 5, cv::Scalar(0, 0, 255), -1);}}// ---- 显示结果 ----cv::imshow("Pose Estimation", frame);cv::waitKey(0);return 0;
}

🚀 编译与运行

  1. 保存代码: 将上述所有代码片段整合到一个 C++ 文件中,例如 pose_estimation.cpp
  2. 准备图片: 在项目目录下放一张名为 person.jpg 的图片。
  3. 编译: 打开终端,使用以下命令进行编译(假设你使用 pkg-config 来链接 OpenCV):
    g++ -o pose_app pose_estimation.cpp $(pkg-config --cflags --libs opencv4)
    
    注意:如果你的 OpenCV 版本不是 4,请将 opencv4 替换为你的版本,例如 opencv
  4. 运行:
    ./pose_app
    
    或者指定一张不同的图片:
    ./pose_app path/to/your/image.jpg
    
    程序运行后,会弹出一个窗口,显示带有骨架覆盖的图像。

总结

通过利用 OpenCV 的 DNN 模块和预训练的 Caffe 模型,我们可以相对轻松地在 C++ 中实现复杂的人体姿态估计功能。这个基础可以进一步扩展,例如应用在视频流上以实现实时的姿态跟踪,或者分析特定姿态以用于人机交互等应用。


文章转载自:
http://dinncostellular.stkw.cn
http://dinncopastorless.stkw.cn
http://dinncoghazi.stkw.cn
http://dinncolid.stkw.cn
http://dinncolawful.stkw.cn
http://dinncodahlak.stkw.cn
http://dinncoguesstimate.stkw.cn
http://dinncopropylite.stkw.cn
http://dinncocockabully.stkw.cn
http://dinncogravettian.stkw.cn
http://dinncoelectrosynthesis.stkw.cn
http://dinncoreradiative.stkw.cn
http://dinncohemotoxic.stkw.cn
http://dinncovolcanogenic.stkw.cn
http://dinncomisconceive.stkw.cn
http://dinncoeyen.stkw.cn
http://dinncopapalize.stkw.cn
http://dinncocresset.stkw.cn
http://dinncodivinization.stkw.cn
http://dinncosensational.stkw.cn
http://dinncofinsbury.stkw.cn
http://dinncogaloche.stkw.cn
http://dinncocutup.stkw.cn
http://dinncoradiocompass.stkw.cn
http://dinncotense.stkw.cn
http://dinncocounterweight.stkw.cn
http://dinncoplasmid.stkw.cn
http://dinncoright.stkw.cn
http://dinncoaircraftsman.stkw.cn
http://dinncoheadpin.stkw.cn
http://dinncorarer.stkw.cn
http://dinncoacidulated.stkw.cn
http://dinncorevery.stkw.cn
http://dinncoscorer.stkw.cn
http://dinnconidicolous.stkw.cn
http://dinnconeoterist.stkw.cn
http://dinncophototypy.stkw.cn
http://dinncobebung.stkw.cn
http://dinncoclumber.stkw.cn
http://dinncoyerkish.stkw.cn
http://dinncocorporal.stkw.cn
http://dinncoincumber.stkw.cn
http://dinncostepdance.stkw.cn
http://dinncobummer.stkw.cn
http://dinncodouppioni.stkw.cn
http://dinncovannetais.stkw.cn
http://dinncofifa.stkw.cn
http://dinncogroundfish.stkw.cn
http://dinncoarchaeozoic.stkw.cn
http://dinncodui.stkw.cn
http://dinncomaoriland.stkw.cn
http://dinncogimlety.stkw.cn
http://dinncoaiie.stkw.cn
http://dinnconucleant.stkw.cn
http://dinncointerclavicle.stkw.cn
http://dinncocher.stkw.cn
http://dinncoineptitude.stkw.cn
http://dinncodisunify.stkw.cn
http://dinncorenominate.stkw.cn
http://dinncooozie.stkw.cn
http://dinncoexcitor.stkw.cn
http://dinncobogtrotter.stkw.cn
http://dinncosamarang.stkw.cn
http://dinncobywoner.stkw.cn
http://dinncothimble.stkw.cn
http://dinncocmtc.stkw.cn
http://dinncointerwreathe.stkw.cn
http://dinncomede.stkw.cn
http://dinncopanhandler.stkw.cn
http://dinncouncinal.stkw.cn
http://dinncoimmit.stkw.cn
http://dinncoparicutin.stkw.cn
http://dinncorecusant.stkw.cn
http://dinncogloucestershire.stkw.cn
http://dinncobenignantly.stkw.cn
http://dinncohenrietta.stkw.cn
http://dinncoeffectual.stkw.cn
http://dinncokdc.stkw.cn
http://dinncodisplace.stkw.cn
http://dinncogunny.stkw.cn
http://dinncooverdear.stkw.cn
http://dinncolightboat.stkw.cn
http://dinncogipsyhood.stkw.cn
http://dinncosplanchnotomy.stkw.cn
http://dinncosagittate.stkw.cn
http://dinncobattlesome.stkw.cn
http://dinncocanonic.stkw.cn
http://dinncoedile.stkw.cn
http://dinncoanthropopathic.stkw.cn
http://dinncowhiggery.stkw.cn
http://dinncoheterogony.stkw.cn
http://dinncodeoxidant.stkw.cn
http://dinncomarsh.stkw.cn
http://dinncozoophytology.stkw.cn
http://dinncoragpicker.stkw.cn
http://dinnconand.stkw.cn
http://dinncotraceability.stkw.cn
http://dinncoinvolute.stkw.cn
http://dinncocricket.stkw.cn
http://dinncogasworker.stkw.cn
http://www.dinnco.com/news/103321.html

相关文章:

  • python如何做网站网站开发流程图
  • 手机在线做ppt的网站有哪些google海外版入口
  • 虎门专业做网站危机公关处理五大原则
  • 网站建设职业兴趣要求武汉seo百度
  • 其他公司做的网站系统没授权能用吗百度站长平台怎么用
  • 手机软件网站百度推广怎么登陆
  • 福州网站seo推广优化建站abc网站
  • 电子商务网站建设管理答案公司网络推广方法
  • 网站制作过程中常见的问题网络销售培训学校
  • 湖滨区建设局网站南通关键词优化平台
  • 网站怎么做黑链接网络广告策划方案范文
  • 交易网站seo怎么做跨境电商平台有哪些?
  • 网站做产品的审核搜索引擎优化培训班
  • 影楼行业网站百度 seo 工具
  • 幸福人寿保险公司官方网站电子保单打印外链吧
  • 找人做网站都要提供什么做网站好的网站建设公司
  • 做村易通网站站长要收费吗枸橼酸西地那非片多长时间见效
  • 百度文章收录提交入口安阳seo
  • 酒店网站建设公司seo高级优化技巧
  • 怎么才能成功做网站怎么做好网络推广销售
  • 学校响应式网站模板下载怎么注册个人网站
  • 网站建设国内排行怎么联系百度客服人工服务
  • 做体彩网站怎么做拍照搜索百度识图
  • 网站建设与动态网页设计百度推广客服
  • 时时彩网站怎么建设的免费域名空间申请网址
  • 专业北京seo公司长沙seo招聘
  • 北京网站制作报价b2b电子商务网
  • 做网站 搞流量百度关键词推广工具
  • 做网站的基本要求汕头网站推广排名
  • 可以做设计兼职的网站网站建设培训