OpenCV 在ImShow窗体上选择感兴趣的区域

发布时间 2023-11-05 21:01:50作者: harrychinese

窗体上选择感兴趣ROI区域

在计算机视觉处理中, 通常是针对图像中的一个特定区域进行处理, 有时候这个特定区域需要人来选择, OpenCV 也提供了窗口选择ROI机制.
窗体支持两种选择ROI区域的方法, 一个是单选, 一个是多选, 操作方法如下:

  • 单选: 通过鼠标在屏幕上选择区域, 然后通过"空格键" 或 "回车键"完成确定, 或者通过"C"键取消, 对应的 SelectROI()函数返回一个Rect对象, 如果取消选择, 返回值为 Rect.Empty
  • 多选: 通过鼠标键屏幕上完成多次选择, 每一次是通过"空格键" 或 "回车键"完成确定, 最后一次通过"ESC"结束选择.
  • 单选的函数是 Cv2.SelectROI()
  • 多选的函数是 Cv2.SelectROIs()

测试代码

   private void readWriteTest()
  {
      string pngFile = @"D:\my_workspace\opencv\images\draw.png";
      var srcMat = Cv2.ImRead(pngFile, ImreadModes.Color);
      Cv2.ImShow("srcMat", srcMat);

      //选择单个 ROI
      var rect = Cv2.SelectROI("srcMat", srcMat, true);
      if (rect != OpenCvSharp.Rect.Empty)
      {
          Cv2.ImShow("Single ROI", srcMat[rect]);
      }

      //选择多个 ROI
      var rects = Cv2.SelectROIs("srcMat", srcMat, true);
      int i = 0;
      foreach (var myRect in rects)
      {
          if (myRect != OpenCvSharp.Rect.Empty)
          {
              i++;
              Cv2.ImShow($"Mulptie ROI #{i}", srcMat[myRect]);
          }
      }

      Cv2.WaitKey();
      Cv2.DestroyAllWindows();
  }

测试结果截图: