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