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

C#使用OpenVinoSharp和PP-Mating进行人像抠图

效果

项目依赖

OpenCvSharp 4.11.0.20250507

OpenVINO.CSharp.Windows 2024.0.0.1

主要代码

using OpenCvSharp;
using OpenVinoSharp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace HelloPPMating
{public partial class FormMating : Form{public FormMating(){InitializeComponent();}private const int INPUT_WIDTH = 512;private const int INPUT_HEIGHT = 512;private const int INPUT_CHANNELS = 3;private Mat image;private void button1_Click(object sender, EventArgs e){var core = new Core();var model = core.read_model(@"./ppmattingv2-stdc1-human_512/model.pdmodel");  // 读取模型文件var compiled_model = core.compile_model(model, "CPU");var inferRequest = compiled_model.create_infer_request();Console.WriteLine("模型加载成功");foreach (var input in compiled_model.inputs()){Console.WriteLine(input.get_any_name());}var inputTensor = inferRequest.get_tensor("img");inputTensor.set_shape(new Shape(1, 3, INPUT_WIDTH, INPUT_WIDTH));float[] inputData = PreprocessImage();inputTensor.set_data(inputData);// 执行推理inferRequest.infer();// 获取输出 Tensor output_tensor = inferRequest.get_output_tensor(0); int output_length = (int)output_tensor.get_size();float[] outputData = output_tensor.get_data<float>(output_length);pictureBox1.Image = new Bitmap(image.ToMemoryStream()); Bitmap bitmap = new Bitmap(INPUT_WIDTH, INPUT_HEIGHT, PixelFormat.Format32bppRgb); for (int i = 0; i < INPUT_WIDTH* INPUT_HEIGHT; i++){Color color;if (outputData[i] > 0.05)color = Color.FromArgb(255, 255, 255);elsecolor = Color.FromArgb(0, 0, 0);bitmap.SetPixel(i % 512, i / 512, color);} pictureBox2.Image = bitmap;}private float[] PreprocessImage(){// 调整大小image = new Mat(@"human.jpg");var resizedImage = image.Resize(new OpenCvSharp.Size(INPUT_WIDTH, INPUT_HEIGHT));//image.SaveImage("640.bmp");// 转换为float数组并归一化int size = INPUT_WIDTH * INPUT_HEIGHT;float[] inputData = new float[size * INPUT_CHANNELS];for (int y = 0; y < INPUT_HEIGHT; y++){for (int x = 0; x < INPUT_WIDTH; x++){int index = y * INPUT_HEIGHT + x;Vec3b pixel = resizedImage.Get<Vec3b>(y, x);inputData[index] = pixel.Item0 / 255.0f;inputData[index + size] = pixel.Item1 / 255.0f;inputData[index + size + size] = pixel.Item2 / 255.0f;}}image = resizedImage;return inputData;}}
}

模型下载地址

PP-Mating


文章转载自:

http://aHSm8lh0.kdxzy.cn
http://PacdTaIi.kdxzy.cn
http://5Il7h9yw.kdxzy.cn
http://5TvNLbWA.kdxzy.cn
http://QTFRo7uQ.kdxzy.cn
http://BFdsWbce.kdxzy.cn
http://pLhzeXa8.kdxzy.cn
http://VXQUnFuz.kdxzy.cn
http://UiL4wjVn.kdxzy.cn
http://qTbYQBPj.kdxzy.cn
http://BgJbV92v.kdxzy.cn
http://HRXofFzS.kdxzy.cn
http://gjzTyC3r.kdxzy.cn
http://sFvk9UE5.kdxzy.cn
http://2VlVEqDF.kdxzy.cn
http://66WfrKTL.kdxzy.cn
http://hwuBfTcB.kdxzy.cn
http://58xicn2r.kdxzy.cn
http://ckR6c4pn.kdxzy.cn
http://rIB4VnK3.kdxzy.cn
http://d71f8PBB.kdxzy.cn
http://Ulc4FS3z.kdxzy.cn
http://WihAIjQc.kdxzy.cn
http://U6u0zD0L.kdxzy.cn
http://92vlTs4v.kdxzy.cn
http://n8E8yUWT.kdxzy.cn
http://31LqRJul.kdxzy.cn
http://ws6PjI4p.kdxzy.cn
http://vUMzhiFe.kdxzy.cn
http://2kTvu94u.kdxzy.cn
http://www.dtcms.com/a/384044.html

相关文章:

  • 初始QML
  • 贪心算法python
  • 淘宝客app的API网关设计:认证授权与流量控制策略
  • python快速使用mcp服务
  • 绑定方法与非绑定方法
  • 北科大2025研究生英语超星慕课第一单元标准答案
  • 人工智能方面的入门书籍有哪推荐?
  • STL之string类(C++)
  • 大模型原理的解析
  • Java 事务失效场景全解析
  • 简陋的进度条程序
  • SpringAOP中的通知类型
  • Python之文件读写 day9
  • 深度学习和神经网络之间有什么区别?
  • Linux驱动学习(SPI驱动)
  • 【MySQL|第七篇】DDL语句——数据库定义语言
  • 计算机毕设选题推荐:基于Java+SpringBoot物品租赁管理系统【源码+文档+调试】
  • Redis集群部署模式全解析:原理、优缺点与场景适配
  • ESP32的烧录和执行流程
  • ABP vNext + OpenXML / QuestPDF:复杂票据/发票模板与服务器端渲染
  • Java 注解入门:从认识 @Override 到写出第一个自定义注解
  • 网络层 -- IP协议
  • 社招面试BSP:BootROM知识一文通
  • Knockout.js DOM 操作模块详解
  • 面试题知识-NodeJS系列
  • 【层面一】C#语言基础和核心语法-02(反射/委托/事件)
  • Jmeter性能测试实战
  • CSP-S 2021 提高级 第一轮(初赛) 阅读程序(3)
  • TTC定时器中断——MPSOC实战3
  • [数据结构——lesson10.2堆排序以及TopK问题]