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