C# OpenCVSharp图像入门_给绿幕图片视频加背景

这篇具有很好参考价值的文章主要介绍了C# OpenCVSharp图像入门_给绿幕图片视频加背景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司的IPP进行加速处理。

  OpenCVSharp是一个.Net平台使用的OpenCV封装库。现在网上关于openCV的教程基本都是c++和python,如果是C#方向,可以跟着这两个语言的步骤自己写demo。

  开始我们今天的课程。

一、分析

  这个功能只要是给绿幕人物加上背景,比如:在直播的时候,因为私密或者其他原因,不想透露出背景

  设想只需要购买一块绿幕,然后上网挑选一张自己喜欢的背景照片,就可以拥有一个好看的背景。

  如何替换视频背景呢?我们一步一步入门!!

  1)绿幕相片扣出人物

  2)人物放进背景图片

  3)操作视频帧图片,实现替换绿幕。

  需要安装的nuget包,注意查看依赖项选版本

OpenCvSharp4
OpenCvSharp4.runtime.win

二、绿幕相片扣出人物

  只展示核心代码

  1)识别绿幕函数(一般操作图片是使用指针的,为了更好理解,我们这里先At执行,后面会讲使用指针改进)

        //删除绿幕
        private unsafe void RemoveImageScreen(Mat src, Func<Vec3b, bool> func)
        {
            for (int i = 0; i < src.Rows; i++)
            {
                for (int j = 0; j < src.Cols; j++)
                {
                    if (func(src.At<Vec3b>(i, j)))
                    {
                        src.At<Vec3b>(i, j) = new Vec3b(0, 0, 0);
                    }
                }
            }
        }

  2)选择图片并清除绿幕

            using (ResourcesTracker t = new ResourcesTracker())
            {
                Bitmap bitmap = new Bitmap(pictBox_origin.Image);
                var mat = BitmapConverter.ToMat(bitmap);
                RemoveImageScreen(mat,
                    p =>
                    {
                        int max = Math.Max(p.Item0, Math.Max(p.Item1, p.Item2));
                        if (max == p.Item1 && p.Item1 > 30) //BGR,当G最大时且大于30时,可以根据实际调节这个阈值
                            return true;
                        return false;
                    });
                pictBox_result.Image = BitmapConverter.ToBitmap(mat_bg);
        }

  效果展示:(我是跟着杨神的思路写的这个程序,素材就直接用杨神了,这篇是入门级别,可以看完我这篇再去观摩杨神的)

  杨中科(就是下图这个帅哥):https://www.bilibili.com/read/cv8850462?spm_id_from=333.999.0.0

  C# OpenCVSharp图像入门_给绿幕图片视频加背景

 三、人物放进背景图片

  合并图片函数

        private unsafe void MergeImageAt(Mat bg, Mat src, Func<Vec3b, bool> func)
        {
            Cv2.Resize(bg, bg, src.Size());//以背景人物大小为准
            for (int i = 0; i < bg.Rows; i++)
            {
                for (int j = 0; j < bg.Cols; j++)
                {
                    if (func(src.At<Vec3b>(i, j)))
                    {
                        bg.At<Vec3b>(i, j) = src.At<Vec3b>(i, j);
                    }
                }
            }
        }

  续上上一步,加上合并图片的步骤

            using (ResourcesTracker t = new ResourcesTracker())
            {
                Bitmap bitmap = new Bitmap(pictBox_origin.Image);
                var mat = BitmapConverter.ToMat(bitmap);
                var mat_bg = t.T(Cv2.ImRead("images/bg2.jpg"));
                RemoveImageScreen(mat,
                    p =>
                    {
                        int max = Math.Max(p.Item0, Math.Max(p.Item1, p.Item2));
                        if (max == p.Item1 && p.Item1 > 30)
                            return true;
                        return false;
                    });
                MergeImageAt( mat_bg, mat,
                    p =>
                    {
                        if (p == new Vec3b(0, 0, 0))
                        {
                            return false;
                        }
                        return true;
                    }
                    );
                pictBox_result.Image = BitmapConverter.ToBitmap(mat_bg);
            }

  效果如图:

  C# OpenCVSharp图像入门_给绿幕图片视频加背景

 四、操作视频帧图片,实现替换绿幕

  和图片的区别,就是需要先逐帧获取 视频/摄像机 的图片,然后按上述操作进行

  直接附上完整Demo(已经将两个函数改为指针操作,大家可以先试试原来的At操作,可以明显看到视频是慢速播放)

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyOpenCV
{
    public static class RemoveGreenScreen
    {
        public static unsafe void Start()
        {
            //VideoCapture videoCapture = new VideoCapture(1, VideoCaptureAPIs.DSHOW);//摄像头
            VideoCapture videoCapture = new VideoCapture(@"images/绿幕视频.mp4");
            using (videoCapture)
            using (Mat frameMat = new Mat())
            using (Mat mat_bg = Cv2.ImRead("images/bg.png"))
            {
                if (videoCapture.CaptureType == CaptureType.Camera)//如果是摄像头
                {
                    videoCapture.FrameWidth = 800;
                    videoCapture.FrameHeight = 600;
                    videoCapture.FourCC = "MJPG";
                }
                while (true)
                {
                    if (!videoCapture.Read(frameMat))
                    {
                        //如果是视频文件,从头部开始播放
                        if (videoCapture.CaptureType == CaptureType.File)
                        {
                            videoCapture.PosFrames = 0;
                        }
                        continue;
                    }
                    RemoveImageScreen(frameMat,
                        p =>
                        {
                            int max = Math.Max(p.Item0, Math.Max(p.Item1, p.Item2));
                            if (max == p.Item1 && p.Item1 > 30)
                                return true;
                            return false;
                        });
                    var bg_clone = mat_bg.Clone();
                    MergeImage(bg_clone, frameMat,
                        p =>
                        {
                            if (p == new Vec3b(0, 0, 0))
                            {
                                return false;
                            }
                            return true;
                        });
                    Cv2.ImShow("press any key to quit", bg_clone);
                    if (Cv2.WaitKey(1) > 0)
                    {
                        break;
                    }
                }
            }
            Cv2.DestroyAllWindows();
        }

        private static unsafe void RemoveImageScreen(Mat src, Func<Vec3b, bool> func)
        {
            Vec3b* start = (Vec3b*)src.DataStart;
            Vec3b* end = (Vec3b*)src.DataEnd;
            for (Vec3b* p = start; p <= end; p++)
            {
                if (func(*p))
                {
                    *p = new Vec3b(0, 0, 0);
                }
            }
        }
        private static unsafe void MergeImage(Mat bg, Mat src, Func<Vec3b, bool> func)
        {
            Cv2.Resize(bg, bg, src.Size());
            Vec3b* bg_pointer = (Vec3b*)bg.DataStart;
            Vec3b* start = (Vec3b*)src.DataStart;
            Vec3b* end = (Vec3b*)src.DataEnd;
            for (Vec3b* p = start; p <= end; p++, bg_pointer++)
            {
                *bg_pointer = func(*p) ? *p : *bg_pointer;
            }
        }
    }
}

  素材:

  C# OpenCVSharp图像入门_给绿幕图片视频加背景    C# OpenCVSharp图像入门_给绿幕图片视频加背景

  效果展示:(这是视频的一张截图)

  C# OpenCVSharp图像入门_给绿幕图片视频加背景

  完成!!!

  图片去绿幕的效果还是很粗糙的,后续会持续更新改进方法,希望大家点赞+关注

  并欢迎大家留言...

  

 

 

 

 文章来源地址https://www.toymoban.com/news/detail-637917.html

到了这里,关于C# OpenCVSharp图像入门_给绿幕图片视频加背景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# OpenCvSharp 图片批量改名

    目录 效果 项目 代码 下载 C# OpenCvSharp 图片批量改名 using NLog; using OpenCvSharp; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; namespace OpenCvSharp_Demo {     public partial class Form1 : Form     {         public Form1()         {             InitializeCo

    2024年03月12日
    浏览(31)
  • C# OpenCvSharp 图像校正

    目录 效果 代码 下载 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Extensions; namespace OpenCvSharp_图像校正 {     public partial class Form1 : Form     {         pu

    2024年02月15日
    浏览(26)
  • C#图像处理-OpenCVSharp教程:OpenCVSharp与EmguCV的比较与介绍

    C#图像处理-OpenCVSharp教程:OpenCVSharp与EmguCV的比较与介绍 图像处理在计算机视觉和计算机图形学等领域发挥着至关重要的作用。本教程将介绍在C#中使用OpenCVSharp和EmguCV这两个流行的图像处理库,它们提供了丰富的功能和强大的性能。 一、OpenCVSharp介绍与特点 OpenCVSharp是OpenCV的

    2024年02月21日
    浏览(28)
  • C#结合OpenCVSharp4图片相似度识别

    需求背景:需要计算两个图片的相似度,然后将相似的图片进行归纳 由于我是CRUD后端仔,对图像处理没什么概念。因此网上调研了几种相似度算法分析其适用场景。 直方图算法 获取要比较的2个图片的直方图数据,然后再将直方图数据归一化比较,最终得到一个相似指数,

    2024年02月09日
    浏览(34)
  • c# OpenCvSharp读取、显示和写入图像(二)

            读取、显示和写入图像是图像处理和计算机视觉的基础。即使在裁剪、调整大小、旋转或应用不同的滤镜来处理图像时,您也需要先读取图像。因此,掌握这些基本操作非常重要。 imread()读取图像 imshow()在窗口中显示图像 imwrite()将图像保存到文件目录里 我们将使

    2024年02月02日
    浏览(51)
  • C#图像处理-使用OpenCVSharp读取或修改图像像素值

    图像处理是计算机视觉领域的重要应用之一,而OpenCV是一个强大且广泛使用的开源计算机视觉库。在C#中,我们可以通过OpenCVSharp库来实现图像处理的各种功能,包括读取和修改图像像素值。本文将介绍如何使用OpenCVSharp来读取和修改图像像素值,并提供相应的源代码。 首先,

    2024年04月28日
    浏览(21)
  • 测试C#使用OpenCvSharp从摄像头获取图片

      OpenCvSharp也支持获取摄像头数据,不同于之前测试AForge时使用AForge控件显示摄像头数据流并从中截图图片,OpenCvSharp中显示摄像头数据流需要周期性地从摄像头中截取图片并显示在指定控件中。本文学习C#使用OpenCvSharp从摄像头获取图片的基本方式。   新建基于.net core的

    2024年01月18日
    浏览(21)
  • c# OpenCvSharp图像裁剪、调整大小、旋转、透视(三)

    图像裁剪、调整大小、旋转、透视图像处理基本操作。 croppedImage 图像裁剪 Cv2.Resize() 调整图像大小 图像旋转 Cv2.Rotate()旋转 Cv2.Flip()翻转 Cv2.WarpAffine()任意角度旋转 Cv2.GetAffineTransform()透视 Rect rect = new Rect(x, y, width, height); // x, y 为起始坐标,width, height 为裁剪宽高 参数 说明

    2024年02月04日
    浏览(20)
  • C# OpenCvSharp Yolov8 Cls 图像分类

    目录 效果 项目 模型信息 代码 下载  Model Properties ------------------------- date:2023-09-07T17:11:37.011156 description:Ultralytics YOLOv8n-cls model trained on ../datasets/imagenet author:Ultralytics task:classify license:AGPL-3.0 https://ultralytics.com/license version:8.0.172 stride:1 batch:1 imgsz:[640, 640] names:{0:

    2024年02月07日
    浏览(30)
  • C#图像处理-OpenCVSharp教程:安装配置与简单实例

    C#图像处理-OpenCVSharp教程:安装配置与简单实例 在本教程中,我们将学习如何在C#中使用OpenCVSharp进行图像处理。首先,我们会介绍OpenCVSharp的安装和配置过程,然后我们将展示一些简单实例来演示图像处理的基本功能。 一、安装与配置OpenCVSharp 下载OpenCVSharp库文件 首先,我们

    2024年03月09日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包