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

相关推荐
HAPPY酷37 分钟前
Unity中C#脚本基础
unity·c#·游戏引擎
老板多放点香菜40 分钟前
Day9 神经网络的偏导数基础
人工智能·深度学习·神经网络
爱喝热水的呀哈喽1 小时前
《机器学习》第四章信息熵 信息增益率决策树怎么写
人工智能·算法·机器学习
Lyqfor1 小时前
计算机视觉(CV)技术的优势和挑战
人工智能·计算机视觉
飞鸟酱的论文diary1 小时前
World-Grounded Human Motion Recovery via Gravity-View Coordinates
人工智能·深度学习·数码相机·机器学习·计算机视觉
小小小~1 小时前
相机标定中的相机模型
人工智能·数码相机·计算机视觉
Danta1 小时前
借助AI的力量:如何智能应对负面用户评论
前端·javascript·人工智能
云天徽上1 小时前
【机器学习案列】平均预期寿命预测
人工智能·机器学习
制造数字化方案研究院2 小时前
Airbus结构数字样机理念及实践(转)
人工智能
纪伊路上盛名在2 小时前
使用AlphaFold3预测蛋白质三维结构及PyMol可视化1
服务器·人工智能·笔记·学习·知识图谱·学习方法