栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

C# OpenCvSharp 抠证件照的人物图像,并生成透明背景

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C# OpenCvSharp 抠证件照的人物图像,并生成透明背景

依赖:

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
int threshold = 255 - 20;

        InitializeComponent();
        Bitmap dstBitmap = null;
        using (Image image = Image.FromFile(@"test2.bmp"))
        {
            using (Bitmap bitmap = new Bitmap(image))
            {
                using (Mat src = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap))//bitmap转 mat
                {
                    using (Mat matMask = new Mat(src.Rows, src.Cols, MatType.CV_8UC4))
                    {
                        //去除白色背景,得到人物的遮罩图
                        RenderMask(src, matMask, threshold);

                        //接下来使用上步骤的图做为遮罩对原始帧图像进行背景透明处理
                        using (Mat dst = new Mat(src.Rows, src.Cols, MatType.CV_8UC4))
                        {
                            MergeMask(src, dst, matMask);
                            dstBitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(dst); // mat 转 bitmap
                        }
                    }
                }
            }
        }
        panel2.BackgroundImage = dstBitmap;

    }

    /// 
    /// 生成遮罩层
    /// 
    /// 
    /// 
    /// 
    private unsafe void RenderMask(Mat src, Mat matMask, int threshold)
    {
        int rows = src.Rows;
        int cols = src.Cols;

        for (int x = 0; x < rows; x++)
        {
            Vec4b* srcRow = (Vec4b*)src.Ptr(x);
            Vec4b* maskRow = (Vec4b*)matMask.Ptr(x);
            for (int y = 0; y < cols; y++)
            {
                var pData = srcRow + y;
                var maskPData = maskRow + y;

                byte blue = pData->Item0;
                byte green = pData->Item1;
                byte red = pData->Item2;
                byte alpha = pData->Item3;

                //阀值判断
                if (blue <= threshold || green <= threshold || red <= threshold)
                {

                    //把没超过阀值的转换成白色
                    maskPData->Item0 = 255;
                    maskPData->Item1 = 255;
                    maskPData->Item2 = 255;
                    maskPData->Item3 = 255;
                }
                else
                {
                    //把超过阀值的转换成黑色
                    maskPData->Item0 = 0;
                    maskPData->Item1 = 0;
                    maskPData->Item2 = 0;
                    maskPData->Item3 = 0;
                }
            }
        }
    }

    /// 
    /// 合并遮罩
    /// 
    /// 原始帧图像
    /// 合并结果
    /// 透明遮罩
    public static void MergeMask(Mat src, Mat dst, Mat alpha)
    {
        using (ResourcesTracker t = new ResourcesTracker())
        {
            //split is used for splitting the channels separately
            var srcBgr = t.T(Cv2.Split(src));
            var alphaBgr = t.T(Cv2.Split(alpha));
            var bgra = new[] { srcBgr[0], srcBgr[1], srcBgr[2], alphaBgr[3] };
            Cv2.Merge(bgra, dst);
        }

    }
}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/984525.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号