【问题标题】:How to draw the points( with floating value) over a bitmap picture?如何在位图图片上绘制点(具有浮动值)?
【发布时间】:2012-04-16 12:03:25
【问题描述】:

我拍摄了一段视频并从中取出一帧,将其转换为位图,现在我可以将其显示在图片框上。

我有一些浮点数,它们是图像类的 GoodFeaturesToTrack() 函数的返回值。

现在我想在我的图片上绘制/显示不同 Xi,Yi 上的那些点/标记;

怎么可能呢?我必须使用哪个命令?

【问题讨论】:

    标签: c# opencv picturebox system.drawing


    【解决方案1】:

    PictureBox.Paint 事件添加一个处理程序并在那里进行绘图。如果您需要刷新 PictureBox 控件上的绘图调用 Invalidate() 以重绘。

    void PictureBox_Paint(object sender, PaintEventArgs e) {
    
      // draw points from var pointsList = List<Point>
      foreach (Point p in pointsList) {
        e.Graphics.DrawEllipse(Pens.Yellow, p.X - 2, p.Y - 2, 4, 4);
      }
    }
    

    【讨论】:

      【解决方案2】:

      在将图像转换为普通位图之前,您可以使用内置 OpenCV 函数围绕找到的特征点进行渲染。这也会更快,因为图像类将使用原始内存而不是发出图形调用。

      这里有一个(不完整的)例子来说明这一点。注意:您可能需要调整对包装器声明的 CV 签名的调用:

          private int maxPointCount = 16;
          private CvPoint2D32f[] points = new CvPoint2D32f[maxPointCount];
          private CvImage grayImage = new CvImage(size, CvColorDepth.U8, CvChannels.One);
          private CvImage eigenValues = new CvImage(size, CvColorDepth.F32, CvChannels.One);
          private CvImage tempImage = new CvImage(size, CvColorDepth.F32, CvChannels.One);
      
          public int FeatureRadius { get; set; }
      
          private CvScalar featureColor; 
          public Color FeatureColor
          {
              get
              {
                  return Color.FromArgb((byte)featureColor.Value2, (byte)featureColor.Value1, (byte)featureColor.Value0);
              }
              set
              {
                  featureColor.Value0 = value.B;
                  featureColor.Value1 = value.G;
                  featureColor.Value2 = value.R;
              }
          }
      
          public void Process(CvImage input, CvImage output)
          {
              CV.ConvertImage(input, grayImage);
              CV.GoodFeaturesToTrack(grayImage, eigenValues, tempImage, points, ref maxPointCount, 0.01, 10, IntPtr.Zero, 3, 0, 0.04);
              CV.Copy(input, output);
      
              // This draws a circle around the feature points found
              for (int i = 0; i < pointCount; i++)
                  CV.Circle(output, new CvPoint((int)points[i].X, (int)points[i].Y), FeatureRadius, featureColor);
          }
      

      【讨论】:

      • 非常感谢,它给了我一个 gd 的想法。我把我的方法放在这里: //... goodPoints = imGray.GoodFeaturesToTrack(MAX_CORNERS, quality_level, min_distance, eig_block_size, use_harris); Image imout = new Image(imGray.Size); for (int i = 0; i
      • 太好了,很高兴这有帮助。我看到您使用的是不同的包装器,但无论如何重点是相同的。我提供的代码类似于我们在实时应用程序中用作过滤器链中的特征跟踪过滤器的代码,因此使用了 Process() 的签名并且没有转换为位图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      相关资源
      最近更新 更多