欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > C# opencvsharp 流程化-脚本化-(2)ROI

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

2024/12/21 23:50:35 来源:https://blog.csdn.net/weixin_41440306/article/details/144521421  浏览:    关键词:C# opencvsharp 流程化-脚本化-(2)ROI

ROI

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

 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和Typeif (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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com