【人像抠图】使用vs2022,onnxruntime框架进行部署(视频和多图片处理)

news2024/11/30 4:58:51

一、人像抠图的应用场景

1. 图像编辑:在图像编辑软件中,人像抠图是常用操作之一。通过抠图可以将人物从原背景中分离出来,放到新背景中,实现人物换背景的效果。这在电影后期特效、游戏角色置换等领域有很广泛的应用。

2. 视频特效:在视频编辑与特效制作中,人像抠图也是关键技术之一。通过实时对视频帧中的人物进行抠图与追踪,可以实现人物消失、人物换衣等特效,大大丰富视频的视觉效果。3. AR特效:在AR(增强现实)与静止画面中的特效制作中,抠取人物或目标物体是非常重要的一步。只有准确抠取人物或物体,才能在现实场景中实时替换或跟踪,实现各种有趣的AR特效。这在很多手机AR美妆与界面中都有所体现。4. 人脸识别:在人脸识别系统中,检测和定位人脸是第一步,人像抠图技术 frequently 被用来辅助检测和定位过程,提高系统的性能与准确率。5. 虚拟化妆:通过人像抠图,可以分离出人物的脸部区域。然后在脸部区域上添加各种妆容与装饰,再融合回原图像,实现给人物戴上各种动态妆容与装饰的效果,这在现代化妆领域有较广泛需求。综上,人像抠图在图像处理、计算机视觉与人工智能等领域有着很重要的应用价值。随着相关技术的进步,人像抠图的效果不断提高,应用范围也在持续扩展,它作为基础技术将服务于更加多元化的应用场景。这也为从事相关行业的研究人员和开发者带来很多机会与挑战。

二、抠图效果

26bd5d2b20ebf743acabe03eb8c4295f.png

22195cc69aaaf7dc466d76ebae8d0eab.png

遍历文件夹抠图

视频人像抠图

三、部署

从参考网址1下载源码,按照Readme文件,下载onnxruntime-win-x64-gpu-1.9.0,添加(opencv4.5.5和onnxruntime-win-x64-gpu-1.9.0)的包含目录、库目录、windows运行库目录,链接器-输入-附加依赖项(opencv_world455.lib、onnxruntime.lib)。

配置属性-Vcpkg-Use Vcpkg设置为否

修改头文件里的 cuda引用

//#include <cuda_provider_factory.h> 
#include <tensorrt_provider_factory.h>

修改Detect_video.cpp文件

#include "Detect_video.h"
#include "Detect.h"


// 调用摄像头或者读取本地视频文件,进行抠图效果展示
void detect_video(float downsample_ratio, Ort::Session& session, string choose,
  std::vector<std::vector<int64_t>>& dynamic_input_node_dims,
  std::vector<float>& dynamic_src_value_handler,
  std::vector<float>& dynamic_r1i_value_handler,
  std::vector<float>& dynamic_r2i_value_handler,
  std::vector<float>& dynamic_r3i_value_handler,
  std::vector<float>& dynamic_r4i_value_handler,
  std::vector<float>& dynamic_dsr_value_handler,
  std::vector<const char*>& input_node_names,
  std::vector<const char*>& output_node_names,
  bool& context_is_update,
  unsigned int& num_inputs,
  unsigned int& num_outputs
)
{


  double inferenceTime = 0.0;


  cv::VideoCapture video_capture;
  cv:String outpath;
  // 选择视频地址抠图或者摄像头抠图
  if (choose == "movie") {
    cout << "视频地址:" << endl;
    cin >> choose;
    video_capture.open(choose);
    outpath = choose + "_out.mp4";
  }
  else
  {
    cout << "请输入调用摄像头的序号:" << endl;
    int num = 0;
    cin >> num;
    video_capture.open(num);
    outpath= cv::format("%d", num) + "_out.mp4";
  }


  if (!video_capture.isOpened())
  {
    std::cout << "Can not open video" << "\n";
    return;
  }
  // 获取视频信息 
  int fps = video_capture.get(cv::CAP_PROP_FPS);
  cv::Size size = cv::Size((int)video_capture.get(cv::CAP_PROP_FRAME_WIDTH),
    (int)video_capture.get(cv::CAP_PROP_FRAME_HEIGHT));
  // 创建视频写入对象 
  cv::VideoWriter outputVideo;
  //cv:String outpath = choose == "movie" ? choose + "_out.mp4" : cv::format("%d",num) + "_out.mp4";
  outputVideo.open(outpath,
    cv::VideoWriter::fourcc('M', 'J', 'P', 'G'),
    fps, size, true);


  if (!outputVideo.isOpened()) {
    printf("Failed to open video writer!");
    return ;
  }
  // 2. matting loop
  cv::Mat mat,dst1,dst2;


  while (video_capture.read(mat))
  {
    //开始时间
    double t1 = static_cast<double>(cv::getTickCount());
    cv::resize(mat, dst1, cv::Size(), 0.5, 0.5, cv::INTER_NEAREST);
    cv::imshow("原图", dst1);
    // 人像抠图
    mat = detect_human(mat, downsample_ratio, session,
      dynamic_input_node_dims,
      dynamic_src_value_handler,
      dynamic_r1i_value_handler,
      dynamic_r2i_value_handler,
      dynamic_r3i_value_handler,
      dynamic_r4i_value_handler,
      dynamic_dsr_value_handler,
      input_node_names,
      output_node_names,
      context_is_update,
      num_inputs,
      num_outputs
    );


    // 人像抠图显示mask
    /*mat = detect(mat,true, downsample_ratio, session,
      dynamic_input_node_dims,
      dynamic_src_value_handler,
      dynamic_r1i_value_handler,
      dynamic_r2i_value_handler,
      dynamic_r3i_value_handler,
      dynamic_r4i_value_handler,
      dynamic_dsr_value_handler,
      input_node_names,
      output_node_names,
      context_is_update,
      num_inputs,
      num_outputs
    );*/


    //结束时间,计算fps
    double t2 = static_cast<double>(cv::getTickCount());
    inferenceTime = (t2 - t1) / cv::getTickFrequency() * 1000;
    std::stringstream fpsSs;
    fpsSs << "FPS: " << int(1000.0f / inferenceTime * 100) / 100.0f;
    // 向每帧写入fps
    cv::putText(mat, fpsSs.str(), cv::Point(16, 32),
      cv::FONT_HERSHEY_COMPLEX, 0.8, cv::Scalar(0, 0, 255));
    //缩放显示
    cv::resize(mat, dst2, cv::Size(), 0.5, 0.5, cv::INTER_NEAREST);
    cv::imshow("抠图", dst2);
    // 写入该帧到视频  
    if (outputVideo.isOpened())
      outputVideo.write(mat);
    cv::waitKey(1);
    // 4. check context states.
    if (!context_is_update) break;


    if (_kbhit()) // 如果有按键被按下
    {
      if (_getch() == 'q') //如果按下了q键则跳出循环
      {
        break;
      }


    }
  }
  // 5. release
  video_capture.release();
  outputVideo.release();
  destroyAllWindows();
}

main.cpp

void showmenu()
{
  printf("----菜单----\n");
  printf("1-遍历文件夹抠图(保存对应抠图文件,默认选项)\n");
  printf("2-图片抠图展示(不保存)\n");
  printf("3-视频抠图展示(保存)\n");
  printf("4-摄像头抠图展示(保存)\n");
  printf("5-摄像头换背景展示(不保存)\n");
  printf("0-退出函数\n");
}

生成程序后,因为我的cuda路径有好几个版本

9f59ad460d77f08c6d6490ffd2ae1017.png

所以,根据缺少的dll提示,将C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1 下的所有dll拷贝到 Release 下。缺少的hdf5.dll 也从系统里找到(everything搜索在V:\vcpkg-master\installed\x64-windows\bin 里有个,别的地方也有),拷贝进来。

OK,这么整下来,不在vs环境下运行,直接双击生成的exe没问题了。

参考网址:

1. https://github.com/caip1299920300/RobustVideoMatting_onnxruntime (源码地址)

2. https://github.com/microsoft/onnxruntime/releases/tag/v1.9.0

fadfdd950116a6956894b5e50dfefef3.png

The End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python的标准库argparse讲解

argparse 是 Python 的标准库之一&#xff0c;用于解析命令行参数。通过 argparse&#xff0c;你可以轻松定义你的脚本或应用程序所需的命令行参数&#xff0c;并从命令行中获取这些参数的值。 import argparse# 创建解析器 parser argparse.ArgumentParser()# 添加命令行参数…

【react 全家桶】高级指引(下)

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录 13【react高级指引&#xff08;下&…

是哟Git时报错OpenSSL SSL_read: Connection was reset, errno 10054

文章目录 修改hosts的ip多尝试解除SSL验证 报错如下所示 遇到这个问题首先可以考虑开魔法或者开魔法加换个网比如开手机热点 解除SSL验证我没有试过, 我就在hosts文件中加上了ip的配置就好了 修改hosts的ip 根据网上的教程, 我试了试修改C盘中hosts文件的GitHub相关访问域名的…

QgsPoint类

在 QGIS 中&#xff0c;QgsPoint 类是用于表示二维或三维点的类。它由 X、Y 和 Z 坐标组成&#xff0c;并且可以带有一个可选的 M 值&#xff08;也称为测量值&#xff09;。以下是 QgsPoint 类的主要参数介绍&#xff1a; x&#xff1a;表示点的横向坐标值。y&#xff1a;表示…

在 Windows 上安装 scoop

一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡&#xff0c;让我们一起学习在在 Windows 上安装 scoop。如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连) 二、 scoop是什么 windows下的安装源搜索工具&#xff0c;有点类似centos下的yum和Ubuntu下的apt。用这个拉下来安装…

路径规划算法:基于粒子群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于粒子群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于粒子群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

100+套大数据可视化模板

由于公司项目里面用到一个数据可视化大屏页面&#xff0c;自己网上各种谷歌百度&#xff0c;发现资源良莠不齐&#xff0c;而且大多数都是收费的&#xff0c;甚至一个页面一收费的那种。 前前后后自己不管是付费的还是免费的收集了不少&#xff0c;于是自己打算整理下&#xf…

应届生如何在职场中提高竞争力?这些方法和策略不容错过!

当前就业形势严峻&#xff0c;对于即将步入职场的应届生来说&#xff0c;提高自己的竞争力显得尤为重要。那么&#xff0c;要如何提高自己的职场竞争力呢&#xff1f;本文将为你分享一些有效的方法和策略&#xff0c;帮助你在职场中获得更好的发展。 一、提高自身素质 职场中&…

JWT 入门

1.介绍 JSON Web Token&#xff08;JWT&#xff09;是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。该token被设计为紧凑且安全的&#xff0c;特别适用于分布式站点的单点登录&#xff08;SSO…

华为OD机试真题 Java 实现【猜字谜】【2023Q1 100分】

一、题目描述 小王设计了一人简单的清字谈游戏&#xff0c;游戏的迷面是一人错误的单词&#xff0c;比如nesw&#xff0c;玩家需要猜出谈底库中正确的单词。猜中的要求如 对于某个谜面和谜底单词&#xff0c;满足下面任一条件都表示猜中&#xff1a; 变换顺序以后一样的&…

115.【SpringBoot(IDEA)+Vue(Vscode)前后端交互】

SpringBootVue前后端分离 (一)、环境介绍(二)、Vscode部分1.静态资源2.配置route路由和axios异步3.配置跨域支持 (三)、IDEA部分1.创建SpringBoot项目2.创建两个实体类3.创建控制层4.配置后端响应的端口 (四)、Vue和SpringBoot交互1.同时运行IDEA和Vscode2.访问登入界面 (一)、…

C语言——操作符详解

哈喽&#xff0c;大家好&#xff0c;今天我们来学习C语言中的各中操作符。 目录 1.操作符的分类 2.算数操作符 整数的二进制表示 3.位移操作符 3.1左移操作符 3.2右移操作符 4.位操作符 5.赋值操作符 6.单目操作符 6.1 单目操作符介绍 ~ 的用法&#xff1a; 6.2 si…

冰点还原2023中文版最新电脑系统数据恢复软件

冰点还原是什么&#xff1f;对其不了解的用户可能会认为它是《冰雪奇缘》的番外篇或续篇之类的&#xff0c;其实它们俩没有半毛钱关系&#xff0c;它其实是一款系统还原备份软件。冰点还原精灵是一款强大的系统备份、还原、修复软件&#xff0c;可以在极短时间内将系统还原到初…

第十四届蓝桥杯青少组选拔赛Python真题 (2022年11月27日),包含答案

第十四届蓝桥杯青少组选拔赛Python真题 (2022年11月27日) 一、编程题 第 1 题 问答题 输入一个整数N (-100sNs100)输出N10的结果例如: N 5&#xff0c;510 的结果为15 (15-510)[输入描述] 输入一个整数N (-100sNs100) [输出描述] 输出一个整数&#xff0c;表示N10的结果 [样…

【C生万物】 指针篇 (进级) 下

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《C生万物 | 先来学C》&#x1f448; 前言&#xff1a; 承接上篇&#xff0c;这期继续C语言指针的学习。 目录 Part4:数组参数&指针参数 …

股票量价关系基础知识8----图解各阶段量价关系:价平量增

图解各阶段量价关系&#xff1a;价平量增 价平量增是指在成交量增加的情况下&#xff0c;股价几乎维持在一个价位附近波动。 一、上涨初期的价平量增 &#xff08;一&#xff09;形态分析 在股价上涨的初期&#xff0c;价平量增是筹码良性换手的现象&#xff0c;这可能是主力在…

企业如何提高销售对CRM的使用率

CRM销售管理系统是帮助企业管理销售和客户的工具。它使企业能够跟踪和分析客户行为&#xff0c;管理客户关系&#xff0c;从而提高销售线索转化率。尽管CRM系统有着诸多的好处&#xff0c;但CRM的使用率往往很低&#xff0c;尤其是在销售团队中。为什么CRM使用率低销售不爱用&a…

gradle插件分享-手把手教你写gradle插件

gradle插件分享-手把手教你写gradle插件 写在前面&#xff1a; 在基础熟练的基础上&#xff0c;完全可以考虑基于Booster、ByteX等框架来开发&#xff0c;效率应该会高一些。 修改字节码的插件不止asm一个&#xff0c;还有javaassist等&#xff0c;可以多做一些尝试&#xff…

双令牌机制(chatgpt)

先记录下 双令牌机制主要用于增加Web应用程序的安全性。这种机制通常包括两种类型的令牌&#xff1a;访问令牌&#xff08;Access Token&#xff09;和刷新令牌&#xff08;Refresh Token&#xff09;。 1&#xff0e;访问令牌:访问令牌是用户完成身份验证后接收的令 牌&…

Three.js 模型体素化原理及实现

在本文中&#xff0c;我们探索了 3D 模型的体素化过程&#xff0c;重点是使用导入的 glTF 模型创建 3D 像素艺术。 本文包括一个最终演示&#xff0c;涵盖了可以使用体素化实现的各种 3D 效果。 我们将提供涵盖以下主题的分步指南&#xff1a; 确定 XYZ 坐标是否在 3D 网格内的…