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

相关推荐
默默开发15 分钟前
完整版:本地电脑 + WiFi 搭建 AI 自动炒股 + 自我学习系统
人工智能·学习·电脑
zzh9407720 分钟前
2026年AI文件上传功能实战:聚合站处理图片、PDF、PPT全指南
人工智能·pdf·powerpoint
新缸中之脑5 小时前
Paperless-NGX实战文档管理
人工智能
似水明俊德6 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
无极低码7 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
grant-ADAS7 小时前
记录paddlepaddleOCR从环境到使用默认模型,再训练自己的数据微调模型再推理
人工智能·深度学习
炎爆的土豆翔7 小时前
OpenCV 阈值二值化优化实战:LUT 并行、手写 AVX2 与 cv::threshold 性能对比
人工智能·opencv·计算机视觉
智能相对论7 小时前
从AWE看到海尔智慧家庭步步引领
人工智能
云和数据.ChenGuang7 小时前
魔搭社区 测试AI案例故障
人工智能·深度学习·机器学习·ai·mindstudio
小锋学长生活大爆炸7 小时前
【工具】无需Token!WebAI2API将网页AI转为API使用
人工智能·深度学习·chatgpt·openclaw