依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 93|回复: 0

基于opencv和onnxruntime的人脸融合用于Qt项目

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12016
发表于 2024-10-12 10:12:17 | 显示全部楼层 |阅读模式
基于opencv和onnxruntime的人脸融合用于Qt项目,其核心代码主要参考facefusion-onnxrun(附件源码中已经包含此源码),并在此基础上进行了一些小型修改以及封装。便于直接在项目中引用。
本项目主要依赖opencv和onnxruntime,因此在使用前需要安装这两个库。建议使用opencv-4.10.0和onnxruntime1.18.1版本。源码中包含宏USE_QT_WRAPPER,如果您不希望依赖Qt,可以取消该定义可以轻松使用facefusion_api.h封装的标准接口。如果您使用USE_QT_WRAPPER则可以获得更多适配Qt的API接口。
API非Qt版本
包含两种使用方式:
  • 您可以选择使用class FaceFusion(只加载一次模型),示例如下:
    1. FaceFusion *faceFusion = new FaceFusion("/path/MODEL_PATH");
    2. cv::Mat source_img = cv::imread("/path/source_path");
    3. cv::Mat target_img = cv::imread("/path/target_path");
    4. cv::Mat output_img;
    5. faceFusion->runSwap(source_img, target_img, output_img);
    复制代码

  • 您也可以分别设置source和target,这样可以同一个source进行多次融合,示例如下:
    1. FaceFusion *faceFusion = new FaceFusion("/path/MODEL_PATH");
    2. cv::Mat source_img = cv::imread("/path/source_path");
    3. faceFusion->setSource(source_img);
    4. cv::Mat target_img = cv::imread("/path/target_path");
    5. cv::Mat output_img;
    6. faceFusion->runSwap(target_img, output_img);
    复制代码

  • 您也可以直接使用静态函数接口(每次都调用会加载模型),示例如下:
    1. cv::Mat source_img = cv::imread("/path/source_path");
    2. cv::Mat target_img = cv::imread("/path/target_path");
    3. cv::Mat output_img;
    4. FaceFusion::faceSwap(source_img, target_img, output_img);
    复制代码
    1. FaceFusion::faceSwap("/path/source_path", "/path/target_path", "/path/output_path");
    复制代码

Qt版本
  • Qt版本在class FaceFusion上进一步封装,使用QImage和QString作为输入输出,示例如下:
    1. QFaceFusion *faceFusion = new QFaceFusion("/path/MODEL_PATH");
    2. QImage source_img("/path/source_path");
    3. QImage target_img("/path/target_path");
    4. QImage output_img;
    5. faceFusion->runSwap(source_img, target_img, output_img);
    复制代码
    1. QFaceFusion *faceFusion = new QFaceFusion("/path/MODEL_PATH");
    2. QImage source_img("/path/source_path");
    3. faceFusion->setSource(source_img);
    4. QImage target_img("/path/target_path");
    5. QImage output_img;
    6. faceFusion->runSwap(target_img, output_img);
    复制代码
    1. QImage source_img("/path/source_path");
    2. QImage target_img("/path/target_path");
    3. QImage output_img;
    4. QFaceFusion::faceSwap(source_img, target_img, output_img);
    复制代码
    1. QFaceFusion::faceSwap("/path/source_path", "/path/target_path", "/path/output_path");
    复制代码

  • 最后由于onnxruntime的推理时间较长,因此建议使用多线程进行推理,因此封装了QFaceFusionThread便于使用,示例如下:
    1. QFaceFusionThread *faceFusionThread = new QFaceFusionThread("/path/MODEL_PATH", this);
    2. connect(faceFusionThread, &QFaceFusionThread::swapFinished, this, [this](bool ok, const QImage& target, const QImage& output){
    3.     if(ok) {
    4.         QLabel *label = new QLabel(this);
    5.         label->setPixmap(QPixmap::fromImage(output));
    6.         label->show();
    7.     }
    8. });
    9. connect(faceFusionThread, &QFaceFusionThread::swapProgress, this, [this](uint64_t progress){
    10.     progressBar->setValue(progress);
    11. });
    12. //启动进程
    13. faceFusionThread->start();

    14. //添加任务,可连续添加,线程后台队列执行,每一帧完成后emit swapFinished
    15. faceFusionThread->setTarget(frameImage[0]);
    16. faceFusionThread->setTarget(frameImage[1]);
    17. faceFusionThread->setTarget(frameImage[2]);
    18. faceFusionThread->setTarget(frameImage[3]);
    复制代码

配置
  • 本项目使用QMake,因此在.pro文件中添加如下配置:
    1. include(./QFacefusion/qfacefusion.pri)
    复制代码

  • pri文件中包含以下宏定义,请根据您的硬件平台选择合适的选项,注释不需要的选项
    1. DEFINES += WINDOWS_FACEFUSION_BUILD
    2. DEFINES += LINUX_FACEFUSION_BUILD
    3. DEFINES += MACOS_FACEFUSION_BUILD
    4. DEFINES += CUDA_FACEFUSION_BUILD
    5. DEFINES += COREML_FACEFUSION_BUILD
    复制代码
    备注:不使用cuda或coreml加速则会使用cpu进行推理,耗时较大。

模型文件
请参考facefusion-onnxrun中提供的模型文件。
  1. 2dfan4.onnx            b6d33e0ab221bc9249d558cf0cbe44b0
  2. arcface_w600k_r50.onnx 80248d427976241cbd1343889ed132b3
  3. gfpgan_1.4.onnx        2f9d93ad985a8f45eb6dc32268a4576d
  4. inswapper_128.onnx     a3a155b90354160350efd66fed6b3d80
  5. yoloface_8n.onnx       bcd3728be297428848c809ae9fb4b701
复制代码


游客,本帖隐藏的内容需要积分高于 2 才可浏览,您当前积分为 0
提取码下载:
文件名称:提取码下载.txt 
下载次数:0  文件大小:12 Bytes  售价:39金钱 [记录]
下载权限: 不限 [购买VIP]   [充值]   [在线充值]   【VIP会员5折;永久VIP免费】
安全检测,请放心下载






相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-11-24 00:51

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表