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

news/2024/12/22 3:31:10/

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


http://www.ppmy.cn/news/1557095.html

相关文章

9. 数列描述

题目描述&#xff1a; 有一个数列a[N] (N60)&#xff0c;从a[0]开始&#xff0c;每一项都是一个数字。数列中a[n1]都是a[n]的描述。其中a[0]1。 规则如下&#xff1a; a[0]:1 a[1]:11(含义&#xff1a;其前一项a[0]1是1个1&#xff0c;即“11”。表示a[0]从左到右&#xff0c;连…

electron-vite【实战系列教程】

创建项目 https://blog.csdn.net/weixin_41192489/article/details/144442262 安装必要的插件 UI 库 element-plus npm install element-plus --save安装 element-plus 图标 npm install element-plus/icons-vue安装插件 – 自动注册组件 vs 自动导入框架方法 npm install -…

HarmonyNext使用ListItemGroup添加头部 布局,头部布局底部留很大空白

今天使用ListItemGroup添加头部布局的时候&#xff0c;发现底部留下很多空白 头部布局使用的是相对布局RelativeContainer 错误代码如下&#xff1a; import { CommonConstants } from "ohos/utils/src/main/ets/common/CommonConstants"; import { DisPlayInfo } …

启动打印服务提示:Http端口已被使用,请修改

分销AV 10.0.0及其以上版本启动打印服务提示&#xff1a;Http端口已被使用&#xff0c;请修改。该如何处理&#xff1f; 一、先将打印服务退出,电脑桌面右下角任我打印服务操作退出。 二、到打印管理器安装目录\print下找到CONFIG文件&#xff0c;用记事本打开后&#xff0c;将…

ThreadLocal数据结构、内存泄漏分析

文章目录 ⚽ThreadLocal&#x1f389;入门案例&#x1f388;ThreadLocal在线程中怎么存储的&#x1f397;为什么会造成内存泄漏&#xff1f;&#x1f383;ThreadLocalMap的key使用强引用和弱引用有什么区别呢&#xff1f;&#x1f514;补充说明Java中引用类型分类内存泄漏和内存…

技术分享 —— JMeter接口与性能测试实战!

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…

Redis——缓存双写一致性问题

文章目录 1、情况描述2、缓存双写一致性2.1 情况讨论2.2 双检加锁2.3 数据库和缓存一致性的几种更新策略。 总结 1、情况描述 默认不存在缓存雪崩和缓存击穿情况。首先Java先查询redis&#xff0c;若redis中存在数据则直接返回数据。若redis中不存在数据&#xff0c;需要查询my…

包子凑数(2017年蓝桥杯试题H)

【问题描述】 小明几乎每天早晨都会在一家包子铺吃早餐&#xff0c;他发现这家包子铺有N种蒸笼&#xff0c;其中第i种蒸笼恰好能放Ai(i为下标)个包子。每种蒸笼都有非常多个&#xff0c;可以认为是无限笼。 每当有顾客想买X个包子。卖包子的大叔就会迅速选出若干笼包子&#xf…