C# opencvsharp 流程化-脚本化-(1)颜色空间和ROI

前奏就是我太懒了

来个前奏,我T------M------D有点太懒了 去年9月开的专栏 今年9月都还没写 damn!不过还是在当一个合格的打工人,吃着猪食当着牛马。

我准备用我正在做的项目 简单写一写opencv 图像部分,最后会完成并给出一个完整的项目代码!给自己记录,也帮帮小白,希望不会误导小白。大佬直接掉头上秋名山,或者指点一二。

图像是什么?

图像就是一个对象。对象是什么?反正我没有

opencvsharp里图像的对象就是Mat,Mat的公开属性和方法去看官网hh

Home · shimat/opencvsharp Wiki · GitHub

定义流程接口

这个接口你看着办,不想要就不要,反正不要钱。后期不再重复赘述

cs 复制代码
 public class ProcessingResult
 {
     public Mat Image { get; set; }
     public Size ImageSize { get; set; }
     public Point[][] Contours { get; set; }
     public ProcessingResult()
     {
         Contours = new Point[0][];
         Image = new Mat();
     }
     public ProcessingResult(Mat mat)
     {
         Contours = new Point[0][];
         Image = mat;
     }
     public ProcessingResult(Point[][] contours,Size size)
     {
         Contours = contours;
         Image = new Mat();
         ImageSize = size;
     }
     public ProcessingResult(Point[][] contours, Mat mat)
     {
         Contours = contours;
         Image = mat;
     }
 }
 public enum ImageProcessingStepType
 {
     Image, Contours,
     Preprocessing
 }
 public interface IImageProcessingStep
 {
     ImageProcessingStepType StepType { get; }
     string Name { get; }
     ProcessingResult ProcessImage(Mat src, Dictionary<string, object> parameters);
 }

颜色空间

颜色空间的组合有非常多种。此示例只是罗列几种常用的。

cs 复制代码
public class ColorSpaceStep : IImageProcessingStep
{
    public ImageProcessingStepType StepType => ImageProcessingStepType.Image;
    public static IList<string> sColorModes = new[] { "Gray", "BGR", "HSV", "HLS" };
    public string Name => "颜色空间";
    public ProcessingResult ProcessImage(Mat src, Dictionary<string, object> parameters)
    {
        var modeobj = parameters.GetValueOrDefault("Mode", 0).ToString();
        var channelobj = parameters.GetValueOrDefault("Channel", -1).ToString();
        var isIntobj = parameters.GetValueOrDefault("IsInv", false).ToString();
        if (bool.TryParse(isIntobj, out bool IsInv)&& IsInv)
        {
            Mat dst = new Mat();
            Cv2.BitwiseNot(src, dst);
            return new(dst);
        }
        else if (int.TryParse(modeobj, out int colorModeInd) && int.TryParse(channelobj, out int channel))
        {
            if (!src.Channels().Equals(1))
            {
                Mat dst = new Mat();
                dst = colorModeInd switch
                {
                    0 => src.CvtColor(ColorConversionCodes.BGR2GRAY),
                    1 => channel.Equals(0) ? src : src.Split()[channel - 1],
                    2 => channel.Equals(0) ? src : src.CvtColor(ColorConversionCodes.BGR2HSV).Split()[channel - 1],
                    3 => channel.Equals(0) ? src : src.CvtColor(ColorConversionCodes.BGR2HLS).Split()[channel - 1],
                    _ => src.Clone()
                };
                return new(dst);
            }
        }
        return new(src);
    }
}

但是说实话,我也用到很少这类的通道提取的方法,更多的是src.CvtColor(ColorConversionCodes.BGR2GRAY)

这个方法的使用。ColorConversionCodes里面有非常多的转换。你需要找到你对应需要的转换类型。我列举几个常用的转换

cs 复制代码
//BGR和Gray的互相转换
src.CvtColor(ColorConversionCodes.BGR2GRAY)
src.CvtColor(ColorConversionCodes.GRAY2BGR)

//RGB和Gray的互相转换
src.CvtColor(ColorConversionCodes.RGB2GRAY)
src.CvtColor(ColorConversionCodes.GRAY2RGB)

//BGR和HSV的互相转换
src.CvtColor(ColorConversionCodes.BGR2HSV)
src.CvtColor(ColorConversionCodes.HSV2BGR)

//BGR和HLS的互相转换
src.CvtColor(ColorConversionCodes.BGR2HLS)
src.CvtColor(ColorConversionCodes.HLS2BGR)

这段代码中有值得几处注意的地方,就是默认我们的图像传入是BGR的 通道顺序。

效果图

等等等等,自己去组合看看把

相关推荐
唐青枫1 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech2 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf3 天前
C#摸鱼实录——IoC与DI案例详解
c#
咕白m6253 天前
使用 C# 在 Excel 中应用多种字体样式
后端·c#
Artech3 天前
[MAF预定义的AIContextProvider-02]AgentSkillsProvider——将Agent Skills引入MAF
ai·c#·agent·agent skills·maf
LDR0064 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术4 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园4 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob4 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享4 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm