C# opencvsharp 流程化-脚本化-(2)ROI

ROI

ROI也是经常需要使用的方法。特别是在图像编辑中。ROI又称感兴趣的区域,但是图像是矩阵是矩形的,感兴趣的是乱八七糟的,所以还有一个Mask需要了解一下的。

cs 复制代码
 public class RoiStep : IImageProcessingStep
 {
     public ImageProcessingStepType StepType => ImageProcessingStepType.Preprocessing;
     public string Name => "ROI";
     public ProcessingResult ProcessImage(Mat src, Dictionary<string, object> parameters)
     {
         // 获取ROI参数
         object roiObj = parameters["ROI"];
         object typeObj = parameters["Type"];

         // 检查是否获取到了ROI和Type
         if (roiObj == null || typeObj == null)
         {
             throw new ArgumentException("Missing required parameters ROI or Type.");
         }
         Rect rect= new Rect();
         // 尝试将ROI对象转换为Rect,如果失败则抛出异常
         try
         {
             dynamic rectdy = roiObj as dynamic;
             if (rectdy == null)
             {
                 throw new ArgumentException("ROI parameter must be a Rect object or a compatible equivalent.");
             }
             rect = new Rect();
             rect.X = rectdy.X;
             rect.Y = rectdy.Y;
             rect.Width= rectdy.Width;
             rect.Height = rectdy.Height;
             // 检查ROI是否有效
             if (rect.Width <= 0 || rect.Height <= 0)
             {
                 throw new ArgumentException("ROI width and height must be positive values.");
             }
         }
         catch (Exception ex)
         {
             throw new ArgumentException("Error converting ROI to Rect: " + ex.Message);
         }

         string type = typeObj.ToString().ToUpper();

         // 根据Type参数执行相应的操作
         switch (type)
         {
             case "ROI":
                 return new(src[rect].Clone());
             case "MASK1":
                 return new(ProcessMask1(src, rect));
             case "MASK2":
                 return new(ProcessMask2(src, rect));
             default:
                 throw new ArgumentException("Type parameter is unknown or invalid.");
         }
     }
     private Mat ProcessMask1(Mat src, Rect rect)
     {
         Mat dst = new Mat();
         Mat mask = Mat.Zeros(src.Size(), MatType.CV_8UC1).ToMat();
         mask[rect].SetTo(255);
         src.CopyTo(dst, mask);
         return dst;
     }

     private Mat ProcessMask2(Mat src, Rect rect)
     {
         Mat dst = new Mat();
         Mat mask1 = Mat.Zeros(src.Size(), MatType.CV_8UC1).ToMat();
         mask1[rect].SetTo(255);
         src.CopyTo(dst);
         dst.SetTo(0, mask1); 
         return dst;
     }
     public static Mat GetRoi(Mat src, Rect rect)
     {
         return src[rect].Clone();
     }
 }

可以拿着代码去用用看。记得VS F12+ChatGPT

  1. Rect是opencvsharp中对矩形的定义 通过Mat[Rect] 就可以获得相应的区域。
  2. Mat.CopyTo(Mat m, InputArray? mask = null) 这个方法 直接中文翻译直接就是:我拷贝给你,你要哪些区域,就在mask的图像上给我标255。
  3. Mat.SetTo(InputArray value, Mat? mask = null)这个方法 直接中文翻译直接就是:设置图像颜色,你要哪些区域被设置颜色,就在mask的图像上给我标255。
  4. 不要看我的示例都是矩形的 你可以做圆形,梯形,三角形,人字拖形。Mask 是可以精确到像素点的哦!!所以你只需要在mask中给相应的像素点赋值,就能得到相应的形状。可以去参考官网像素赋值和Draw的方法。

效果图

放两张效果图睡觉了

原图

普通ROI

Mask1

Mask2

相关推荐
聚客AI1 小时前
🌟大模型为什么产生幻觉?预训练到推理的漏洞全揭秘
人工智能·llm·掘金·日新计划
Juchecar1 小时前
一文讲清 nn.Sequential 等容器类
人工智能
mudtools1 小时前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net
阿里云云原生2 小时前
如何快速看懂「祖传项目」?Qoder 强势推出新利器
人工智能
美团技术团队2 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
程序员小袁4 小时前
基于C-MTEB/CMedQAv2-rerankingv的Qwen3-1.7b模型微调-demo
人工智能
飞哥数智坊4 小时前
AI 编程一年多,我终于明白:比技巧更重要的,是熟练度
人工智能·ai编程
新智元5 小时前
收手吧 GPT-5-Codex,外面全是 AI 编程智能体!
人工智能·openai
IT_陈寒5 小时前
Java 性能优化:5个被低估的JVM参数让你的应用吞吐量提升50%
前端·人工智能·后端
阿里云云原生6 小时前
阿里云基础设施 AI Tech Day AI 原生,智构未来——AI 原生架构与企业实践专场
人工智能