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

相关推荐
众链网络2 分钟前
你的Prompt还有很大提升
人工智能·prompt·ai写作·ai工具·ai智能体
汀沿河4 分钟前
2 大模型高效参数微调;prompt tunning
人工智能·深度学习·prompt
路溪非溪11 分钟前
机器学习之线性回归
人工智能·机器学习·线性回归
Chef_Chen12 分钟前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
搞笑的秀儿1 小时前
信息新技术
大数据·人工智能·物联网·云计算·区块链
阿里云大数据AI技术2 小时前
OpenSearch 视频 RAG 实践
数据库·人工智能·llm
XMAIPC_Robot2 小时前
基于ARM+FPGA的光栅尺精密位移加速度测试解决方案
arm开发·人工智能·fpga开发·自动化·边缘计算
加油吧zkf2 小时前
YOLO目标检测数据集类别:分类与应用
人工智能·计算机视觉·目标跟踪
Blossom.1182 小时前
机器学习在智能制造业中的应用:质量检测与设备故障预测
人工智能·深度学习·神经网络·机器学习·机器人·tensorflow·sklearn
天天扭码2 小时前
AI时代,前端如何处理大模型返回的多模态数据?
前端·人工智能·面试