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的 通道顺序。

效果图

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

相关推荐
LibraJM几秒前
一种适合程序员的 Agent 协作方式的实践
c#·copilot·agents
jason成都18 分钟前
RTKLIB Java 移植踩坑复盘:卡尔曼滤波核心逻辑修复与滑坡场景实测验证
java·开发语言
一次旅行31 分钟前
【AI工具】Rust-Based CLI:用 xargs 和并行加速你的 Linux 日常
linux·开发语言·rust
老毛肚44 分钟前
juc线程通信
java·开发语言·jvm
跨境数据猎手1 小时前
反向海淘实战|独立站搭建+国内电商API对接
开发语言·爬虫·架构
没钥匙的锁12 小时前
05-Java面向对象构造器与封装
java·开发语言
仙人球部落2 小时前
-python-LangGraph框架(3-31-LangGraph 「合并式状态管理」的原理与实践)
开发语言·javascript·python
2401_894915532 小时前
Geo搜索优化排名源码部署搭建全流程详解
android·开发语言·flask·php·精选
chouchuang3 小时前
day-025-面向对象-上
开发语言·python
sunfdf3 小时前
Next.js 新手从零部署到首跑实战指南
开发语言·javascript·ecmascript