OpenCV绘制ROI区域(五)

鼠标绘制矩形

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _01_绘制矩形
{internal class Program{//宏  常量public static string WINDOW_NAME = "程序窗口";//Scalar.All(0)  矩阵  像素点 多个通道  Scalar.All(0)设置每个通道都为空public static Mat scrImage = new Mat(600, 800, MatType.CV_8UC3,Scalar.All(0));public static Rect g_rectange;//矩形类public static bool g_bDrawingBox=false;//是否开始绘制public static Random g_rng = new Random();//随机颜色static void Main(string[] args){//1.准备参数g_rectange = new Rect(-1,-1,0,0);Mat tempImage = new Mat();//2.设置鼠标操作的事件Cv2.NamedWindow(WINDOW_NAME);//委托MouseCallback GetRBMouseCallback = new MouseCallback(on_MonuseHandle);//绑定事件Cv2.SetMouseCallback(WINDOW_NAME, GetRBMouseCallback);//3.监听    while (true){scrImage.CopyTo(tempImage);// 拷贝原图到临时变量if (g_bDrawingBox){DrawRectangle(ref tempImage, g_rectange);}Cv2.ImShow(WINDOW_NAME, tempImage);if (Cv2.WaitKey(10)==27)//按下了ESC  程序推出{break;}}}//委托类型的事件处理函数//参数1:事件对象  里面包含当前事件的一系列参数  如:鼠标按下的位置  移动的位置 事件的类型 .......// x ,y 鼠标的 坐标public static void on_MonuseHandle(MouseEventTypes @event,int x,int y,MouseEventFlags flages,IntPtr userdate){//鼠标移动//MouseEventTypes  委托类型   //MouseEventTypes.MouseMove  移动//MouseEventTypes.LButtonDown 鼠标左键按下//MouseEventTypes.LButtonUp 鼠标左键抬起if (@event== MouseEventTypes.MouseMove){if (g_bDrawingBox)//判断鼠标是否按下  鼠标按下才能开始绘制{// 把鼠标的坐标记录到 Rect 变量中g_rectange.Width= x - g_rectange.X;g_rectange.Height = y - g_rectange.Y;}}//鼠标左键按下if (@event == MouseEventTypes.LButtonDown){g_bDrawingBox=true;g_rectange=new Rect(x,y,0,0);//记录起始点}//鼠标左键抬起if (@event == MouseEventTypes.LButtonUp){g_bDrawingBox=false;//对宽高小于0的处理if (g_rectange.Width<0){g_rectange.X += g_rectange.Width;g_rectange.Width*=-1;}if (g_rectange.Height < 0){g_rectange.Y += g_rectange.Height;g_rectange.Height *= -1;}//绘制图形DrawRectangle(ref scrImage, g_rectange);}}public static void DrawRectangle(ref Mat img,Rect box){if ((box.BottomRight.X > box.TopLeft.X) && (box.BottomRight.Y > box.TopLeft.Y)){Cv2.Rectangle(img, box.TopLeft, box.BottomRight, new Scalar(g_rng.Next(255), g_rng.Next(255), g_rng.Next(255)), 2);//随机颜色}}}
}

脚本绘制

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _02_脚本绘制
{internal class Program{public static string WINDOW_NAME1 = "【绘制图1】";// 为窗口标题定义的宏 public static string WINDOW_NAME2 = "【绘制图2】";// 为窗口标题定义的宏 public static int WINDOW_WIDTH = 600;             // 定义窗口大小的宏static void Main(string[] args){// 创建空白的Mat图像Mat atomImage = new Mat(WINDOW_WIDTH, WINDOW_WIDTH, MatType.CV_8UC3);Mat rookImage = new Mat(WINDOW_WIDTH, WINDOW_WIDTH, MatType.CV_8UC3);// --------------<1>绘制化学中的原子示例图--------------// 先绘制出椭圆DrawEllipse(atomImage, 90);DrawEllipse(atomImage, 0);DrawEllipse(atomImage, 45);DrawEllipse(atomImage, -45);// 再绘制圆心DrawFilledCircle(atomImage, new Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2));// --------------<2>绘制组合图--------------//先绘制出椭圆DrawPolygon(rookImage);// 绘制矩形Cv2.Rectangle(rookImage,new Point(0, 7 * WINDOW_WIDTH / 8),new Point(WINDOW_WIDTH, WINDOW_WIDTH),new Scalar(0, 255, 255), -1, LineTypes.Link8);// 绘制一些线段DrawLine(rookImage, new Point(0, 15 * WINDOW_WIDTH / 16), new Point(WINDOW_WIDTH, 15 * WINDOW_WIDTH / 16));DrawLine(rookImage, new Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), new Point(WINDOW_WIDTH / 4, WINDOW_WIDTH));DrawLine(rookImage, new Point(WINDOW_WIDTH / 2, 7 * WINDOW_WIDTH / 8), new Point(WINDOW_WIDTH / 2, WINDOW_WIDTH));DrawLine(rookImage, new Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), new Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH));// 显示绘制出的图像Cv2.ImShow(WINDOW_NAME1, atomImage);Cv2.MoveWindow(WINDOW_NAME1, 0, 200);Cv2.ImShow(WINDOW_NAME2, rookImage);Cv2.MoveWindow(WINDOW_NAME2, WINDOW_WIDTH, 200);Cv2.WaitKey(0);}// 自定义的绘制函数,实现了绘制不同角度、相同尺寸的椭圆public static void DrawEllipse(Mat img, double angle){Cv2.Ellipse(img,new Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2),new Size(WINDOW_WIDTH / 4, WINDOW_WIDTH / 16),angle, 0, 360, new Scalar(255, 129, 0), 2, LineTypes.Link8);}// 自定义的绘制函数,实现了实心圆的绘制public static void DrawFilledCircle(Mat img, Point center){Cv2.Circle(img, center.X, center.Y, WINDOW_WIDTH / 32, new Scalar(0, 0, 255), -1, LineTypes.Link8);}// 自定义的绘制函数,实现了凹多边形的绘制public static void DrawPolygon(Mat img){//创建一些点List<List<Point>> pts = new List<List<Point>>(){new List<Point>{new Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8),new Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8),new Point(3 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16),new Point(11 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16),new Point(19 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8),new Point(3 * WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8),new Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH / 8),new Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8),new Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4),new Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4),new Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8),new Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8),new Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4),new Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4),new Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8),new Point(WINDOW_WIDTH / 4, WINDOW_WIDTH / 8),new Point(WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8),new Point(13 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8),new Point(5 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16),new Point(WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16)}};// 绘制多边形填充Cv2.FillPoly(img, pts, new Scalar(255, 255, 255), LineTypes.Link8);}// 自定义的绘制函数,实现了线的绘制public static void DrawLine(Mat img, Point start, Point end){Cv2.Line(img, start.X, start.Y, end.X, end.Y, new Scalar(0, 0, 0), 2, LineTypes.Link8);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1541186.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式】UML类图

目录 前言 一、类图概述 二、类图的作用 三、类图表示法 四、类之间关系的表示方法 1. 关联关系 1.1 单向关联 1.2 双向关联 1.3 自关联 2. 聚合关系 3. 组合关系 4. 依赖关系 5. 继承关系 6. 实现关系 总结 前言 统一建模语言&#xff08; Unified Modeling La…

ClickHouse 的第一篇 研究论文:如何让现代数据分析数据库实现超高速性能?

本文字数&#xff1a;3245&#xff1b;估计阅读时间&#xff1a;9 分钟 作者&#xff1a;ClickHouse Team 本文在公众号【ClickHouseInc】首发 我们非常激动地宣布&#xff0c;第一篇关于 ClickHouse 的研究论文【chrome-extension://mhnlakgilnojmhinhkckjpncpbhabphi/pages/p…

基于ACMEv2协议的免费SSL证书申请-支持Let‘s Encrypt/Google/ZeroSSL

项目&#xff1a;https://github.com/cook-code-jazor/acmex 非开源&#xff0c;使用webui管理证书的申请&#xff0c;所有文件本地化存储&#xff0c;支持windows/linux/osx。 证书申请直连ACMEv2服务商&#xff0c;没有任何中间接口&#xff0c;支持Lets Encrypt/Google/Ze…

Inf-MLLM:单个 4090D 实现 4M Token 长序列问答

一、背景 本文中我们简单介绍一个新的解决长序列推理效率的新方案 Inf-MLLM&#xff0c;也是基于 Token 稀疏化。有关 Token 稀疏化的方案通常可以从如下几个方面了解&#xff1a; 怎么识别关键 Token&#xff0c;包括静态识别或动态识别&#xff0c;比如 Streaming LLM 里 At…

从观《中国数据库前世今生》纪录片谈起:云数据库的未来发展与挑战

从观《中国数据库前世今生》纪录片谈起&#xff1a;云数据库的未来发展与挑战 前言 作为一名资深程序员&#xff0c;我在职业生涯中始终密切关注数据库技术的发展动态。近日&#xff0c;我观看了《中国数据库前世今生》这部纪录片&#xff0c;深受触动。这部纪录片不仅记录了…

Ubuntu 安装和使用 Fcitx 中文输入法;截图软件flameshot

一、Ubuntu 安装和使用 Fcitx 中文输入法 在 Ubuntu 上安装和使用 Fcitx 输入法框架是一个常见的选择&#xff0c;特别是对于需要中文输入的用户。以下是详细的步骤来安装和配置 Fcitx 输入法&#xff1a; 1. 安装 Fcitx 和相关输入法 首先&#xff0c;更新你的包列表并安装…

经济下行,这个AI美女短视频带货副业赛道,为什么不来试一试?

经济下行&#xff0c;普通人应该尽早认清一个事实&#xff0c;没有一技之长&#xff0c;没有核心竞争力&#xff0c;即便是打工皇帝&#xff0c;年入百万也只是浮云。 一定要保证主业的稳定&#xff0c;再探索新的机会&#xff0c;要多从”1-10"&#xff0c;而不是反复”…

昇思量子计算系列教程-Grover搜索算法

基于MindSpore Quantum的Grover搜索算法 概述 如果你听过量子计算&#xff0c;那么你一定听说过Grover搜索算法。1996年&#xff0c;Lov Grover [1] 提出了Grover搜索算法&#xff0c;它是一种利用量子状态的叠加性进行并行计算并实现加速的算法。Grover搜索算法被公认为是继…

《让手机秒变超级电脑!ToDesk云电脑、易腾云、青椒云移动端评测》

前言 科技发展到如今2024年&#xff0c;可以说每一年都在发生翻天覆地的变化。而云上这个词时常都被大家提起&#xff0c;从个人设备连接到云端在如今在也不是梦了。而云电脑这个市场近年来迅速发展&#xff0c;无需购买和维护额外的硬件就可以体验到电脑端顶配的性能和体验&am…

ESP32本地大模型对话机器人制作教程

整体架构 在本地电脑部署好Ollama服务&#xff0c;安装qwen大模型和llama3.1大模型。 ESP32接入局域网&#xff0c;用户通过串口给esp32发送问题&#xff0c;esp32打包json后向ollama服务发送请求&#xff0c;ollama返回响应&#xff0c;esp32解析结果并通过串口打印出来。 …

详解ChatBI Agent架构:打造高效数据统计系统

随着人工智能技术的迅猛发展&#xff0c;智能对话系统在各行各业中的应用越来越广泛。本文将介绍一种名为ChatBI Agent的架构设计&#xff0c;并以电信运营商系统的经分数据统计Agent为案例&#xff0c;结合具体的代码实现&#xff0c;帮助读者了解这一系统的设计理念和实现方式…

2024年开放式蓝牙耳机十大排名震撼揭晓!哪款开放式耳机是音质王者?

​耳机市场上&#xff0c;有线入耳式、无线蓝牙入耳式和开放式耳机三足鼎立&#xff0c;各展风采。有线入耳式耳机虽然连接稳定&#xff0c;但线缆易缠绕&#xff0c;佩戴不够稳固&#xff1b;无线入耳式耳机虽然剪断了线的束缚&#xff0c;但长时间使用可能会引起耳朵不适。相…

FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频

Android早期的MediaPlayer控件对于网络视频的兼容性很差&#xff0c;所以后来单独推出了Exoplayer库增强支持网络视频&#xff0c;在《Android Studio开发实战&#xff1a;从零基础到App上线(第3版)》一书第14章的“14.3.3 新型播放器ExoPlayer”就详细介绍了Exoplayer库的详细…

信息安全工程师(10)网络信息安全法律与政策文件

前言 网络信息安全法律与政策文件是保障网络安全、维护网络空间秩序、保护公民和组织合法权益的重要基石。 一、主要法律文件 《中华人民共和国网络安全法》 发布时间&#xff1a;2016年11月7日&#xff0c;由第十二届全国人民代表大会常务委员会第二十四次会议通过。主要内容&…

打工人必看!AI 编程助手让你轻松应对任务!

在当今科技飞速发展的时代&#xff0c;我们作为开发者面临着前所未有的挑战。技术栈频繁迭代&#xff0c;项目周期逐渐缩短&#xff0c;但对代码质量和的要求却不断提升这样的环境下&#xff0c;如何有效提升编程效率成为了一个永恒的议题。 最近&#xff0c;我找到了一位强大…

华为地图服务 - 如何在地图上绘制圆? -- HarmonyOS自学17

场景介绍 本章节将向您介绍如何在地图上绘制圆形。 接口说明 添加圆形功能主要由MapCircleOptions、addCircle和MapCircle提供&#xff0c;更多接口及使用方法请参见接口文档。 接口名 描述 MapCircleOptions 用于描述MapCircle属性。 addCircle(options: mapCommon.MapC…

Linux文件IO(三)-Linux系统如何管理文件

1.静态文件与 inode 文件在没有被打开的情况下一般都是存放在磁盘中的&#xff0c;譬如电脑硬盘、移动硬盘、U 盘等外部存储设备&#xff0c;文件存放在磁盘文件系统中&#xff0c;并且以一种固定的形式进行存放&#xff0c;我们把他们称为静态文件。 文件储存在硬盘上&#…

《DevOps实践指南》笔记-Part 1

前言 Infrastructure as Code&#xff1a;基础设施即代码&#xff0c;IaC。 Kanban&#xff1a;看板管理&#xff0c;丰田生产模式中的重要概念&#xff0c;指为了达到及时生产方式控制现场生产流程的工具。及时生产方式中的拉式生产系统可以使信息的流程缩短&#xff0c;并配…

unix中的进程标识以及使用场景

一、前言 本文将介绍unix系统中的进程标识以及使用场景。进程标识和用户标识类似&#xff0c;只不过其指代的对象是一个进程。我们常把进程标识称为进程ID&#xff0c;本文将讨论如下内容&#xff1a; 1.什么是进程标识&#xff1f; 2.特殊的进程标识 3.如果获取以及使用进程标…

神经网络推理加速入门——一个例子看懂流水

之前的两篇文章介绍了流水这一技术&#xff0c;它用来进行程序的性能加速&#xff0c;本篇通过一个生活中的小例子&#xff0c;让大家更直观的了解什么是流水。 举个例子 早晨从起床到上班出门&#xff0c;我们一般会做以下几件事&#xff1a;刷牙、烧水、喝水、出门。 如果…