OpenCV绘制ROI地区(五)

打印 上一主题 下一主题

主题 815|帖子 815|积分 2445

鼠标绘制矩形

  1. using OpenCvSharp;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace _01_绘制矩形
  8. {
  9.     internal class Program
  10.     {
  11.         //宏  常量
  12.         public static string WINDOW_NAME = "程序窗口";
  13.         //Scalar.All(0)  矩阵  像素点 多个通道  Scalar.All(0)设置每个通道都为空
  14.         public static Mat scrImage = new Mat(600, 800, MatType.CV_8UC3,Scalar.All(0));
  15.         public static Rect g_rectange;//矩形类
  16.         public static bool g_bDrawingBox=false;//是否开始绘制
  17.         public static Random g_rng = new Random();//随机颜色
  18.         
  19.         static void Main(string[] args)
  20.         {
  21.             //1.准备参数
  22.             g_rectange = new Rect(-1,-1,0,0);
  23.             Mat tempImage = new Mat();
  24.             //2.设置鼠标操作的事件
  25.             Cv2.NamedWindow(WINDOW_NAME);
  26.             //委托
  27.             MouseCallback GetRBMouseCallback = new MouseCallback(on_MonuseHandle);
  28.             //绑定事件
  29.             Cv2.SetMouseCallback(WINDOW_NAME, GetRBMouseCallback);
  30.             //3.监听   
  31.             while (true)
  32.             {
  33.                 scrImage.CopyTo(tempImage);// 拷贝原图到临时变量
  34.                 if (g_bDrawingBox)
  35.                 {
  36.                     DrawRectangle(ref tempImage, g_rectange);
  37.                 }
  38.                 Cv2.ImShow(WINDOW_NAME, tempImage);
  39.                 if (Cv2.WaitKey(10)==27)//按下了ESC  程序推出
  40.                 {
  41.                     break;
  42.                 }
  43.             }
  44.          
  45.         }
  46.         //委托类型的事件处理函数
  47.         //参数1:事件对象  里面包含当前事件的一系列参数  如:鼠标按下的位置  移动的位置 事件的类型 .......
  48.         // x ,y 鼠标的 坐标
  49.         public static void on_MonuseHandle(MouseEventTypes @event,int x,int y,MouseEventFlags flages,IntPtr userdate)
  50.         {
  51.             //鼠标移动
  52.             //MouseEventTypes  委托类型   
  53.             //MouseEventTypes.MouseMove  移动
  54.             //MouseEventTypes.LButtonDown 鼠标左键按下
  55.             //MouseEventTypes.LButtonUp 鼠标左键抬起
  56.             if (@event== MouseEventTypes.MouseMove)
  57.             {
  58.                 if (g_bDrawingBox)//判断鼠标是否按下  鼠标按下才能开始绘制
  59.                 {
  60.                     // 把鼠标的坐标记录到 Rect 变量中
  61.                     g_rectange.Width= x - g_rectange.X;
  62.                     g_rectange.Height = y - g_rectange.Y;
  63.                 }
  64.             }
  65.             //鼠标左键按下
  66.             if (@event == MouseEventTypes.LButtonDown)
  67.             {
  68.                 g_bDrawingBox=true;
  69.                 g_rectange=new Rect(x,y,0,0);//记录起始点
  70.             }
  71.             //鼠标左键抬起
  72.             if (@event == MouseEventTypes.LButtonUp)
  73.             {
  74.                 g_bDrawingBox=false;
  75.                 //对宽高小于0的处理
  76.                 if (g_rectange.Width<0)
  77.                 {
  78.                     g_rectange.X += g_rectange.Width;
  79.                     g_rectange.Width*=-1;
  80.                      
  81.                 }
  82.                 if (g_rectange.Height < 0)
  83.                 {
  84.                     g_rectange.Y += g_rectange.Height;
  85.                     g_rectange.Height *= -1;
  86.                 }
  87.                 //绘制图形
  88.                 DrawRectangle(ref scrImage, g_rectange);
  89.             }
  90.         }
  91.         public static void DrawRectangle(ref Mat img,Rect box)
  92.         {
  93.             if ((box.BottomRight.X > box.TopLeft.X) && (box.BottomRight.Y > box.TopLeft.Y))
  94.             {
  95.                 Cv2.Rectangle(img, box.TopLeft, box.BottomRight, new Scalar(g_rng.Next(255), g_rng.Next(255), g_rng.Next(255)), 2);//随机颜色
  96.             }
  97.                
  98.         }
  99.     }
  100. }
复制代码
脚本绘制

  1. using OpenCvSharp;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace _02_脚本绘制
  8. {
  9.     internal class Program
  10.     {
  11.         public static string WINDOW_NAME1 = "【绘制图1】";// 为窗口标题定义的宏
  12.         public static string WINDOW_NAME2 = "【绘制图2】";// 为窗口标题定义的宏
  13.         public static int WINDOW_WIDTH = 600;             // 定义窗口大小的宏
  14.         static void Main(string[] args)
  15.         {
  16.             // 创建空白的Mat图像
  17.             Mat atomImage = new Mat(WINDOW_WIDTH, WINDOW_WIDTH, MatType.CV_8UC3);
  18.             Mat rookImage = new Mat(WINDOW_WIDTH, WINDOW_WIDTH, MatType.CV_8UC3);
  19.             // --------------<1>绘制化学中的原子示例图--------------
  20.             // 先绘制出椭圆
  21.             DrawEllipse(atomImage, 90);
  22.             DrawEllipse(atomImage, 0);
  23.             DrawEllipse(atomImage, 45);
  24.             DrawEllipse(atomImage, -45);
  25.             // 再绘制圆心
  26.             DrawFilledCircle(atomImage, new Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2));
  27.             // --------------<2>绘制组合图--------------
  28.             //先绘制出椭圆
  29.             DrawPolygon(rookImage);
  30.             // 绘制矩形
  31.             Cv2.Rectangle(rookImage,
  32.                 new Point(0, 7 * WINDOW_WIDTH / 8),
  33.                 new Point(WINDOW_WIDTH, WINDOW_WIDTH),
  34.                 new Scalar(0, 255, 255), -1, LineTypes.Link8);
  35.             // 绘制一些线段
  36.             DrawLine(rookImage, new Point(0, 15 * WINDOW_WIDTH / 16), new Point(WINDOW_WIDTH, 15 * WINDOW_WIDTH / 16));
  37.             DrawLine(rookImage, new Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), new Point(WINDOW_WIDTH / 4, WINDOW_WIDTH));
  38.             DrawLine(rookImage, new Point(WINDOW_WIDTH / 2, 7 * WINDOW_WIDTH / 8), new Point(WINDOW_WIDTH / 2, WINDOW_WIDTH));
  39.             DrawLine(rookImage, new Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), new Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH));
  40.             // 显示绘制出的图像
  41.             Cv2.ImShow(WINDOW_NAME1, atomImage);
  42.             Cv2.MoveWindow(WINDOW_NAME1, 0, 200);
  43.             Cv2.ImShow(WINDOW_NAME2, rookImage);
  44.             Cv2.MoveWindow(WINDOW_NAME2, WINDOW_WIDTH, 200);
  45.             Cv2.WaitKey(0);
  46.         }
  47.         // 自定义的绘制函数,实现了绘制不同角度、相同尺寸的椭圆
  48.         public static void DrawEllipse(Mat img, double angle)
  49.         {
  50.             Cv2.Ellipse(img,
  51.                 new Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2),
  52.                 new Size(WINDOW_WIDTH / 4, WINDOW_WIDTH / 16),
  53.                 angle, 0, 360, new Scalar(255, 129, 0), 2, LineTypes.Link8);
  54.         }
  55.         // 自定义的绘制函数,实现了实心圆的绘制
  56.         public static void DrawFilledCircle(Mat img, Point center)
  57.         {
  58.             Cv2.Circle(img, center.X, center.Y, WINDOW_WIDTH / 32, new Scalar(0, 0, 255), -1, LineTypes.Link8);
  59.         }
  60.         // 自定义的绘制函数,实现了凹多边形的绘制
  61.         public static void DrawPolygon(Mat img)
  62.         {
  63.             //创建一些点
  64.             List<List<Point>> pts = new List<List<Point>>()
  65.             {
  66.                 new List<Point>
  67.                 {
  68.                      new Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8),
  69.                      new Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8),
  70.                      new Point(3 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16),
  71.                      new Point(11 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16),
  72.                      new Point(19 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8),
  73.                      new Point(3 * WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8),
  74.                      new Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH / 8),
  75.                      new Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8),
  76.                      new Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4),
  77.                      new Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4),
  78.                      new Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8),
  79.                      new Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8),
  80.                      new Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4),
  81.                      new Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4),
  82.                      new Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8),
  83.                      new Point(WINDOW_WIDTH / 4, WINDOW_WIDTH / 8),
  84.                      new Point(WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8),
  85.                      new Point(13 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8),
  86.                      new Point(5 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16),
  87.                      new Point(WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16)
  88.                 }
  89.             };
  90.             // 绘制多边形填充
  91.             Cv2.FillPoly(img, pts, new Scalar(255, 255, 255), LineTypes.Link8);
  92.         }
  93.         // 自定义的绘制函数,实现了线的绘制
  94.         public static void DrawLine(Mat img, Point start, Point end)
  95.         {
  96.             Cv2.Line(img, start.X, start.Y, end.X, end.Y, new Scalar(0, 0, 0), 2, LineTypes.Link8);
  97.         }
  98.     }
  99. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表