2012-04-02 43 views
0

我捕獲了一個視頻,並拿出了一幀,將其轉換爲位圖,現在我可以在圖片框中顯示它。如何在位圖圖片上繪製點(浮點值)?

我有一些浮點數,它是圖像類的GoodFeaturesToTrack()函數的返回值。

現在我想繪製/顯示不同Xi,Yi上的點/標記在我的圖片上;

怎麼可能做到這一點?我必須使用哪個命令?

回答

0

在將圖像轉換爲普通位圖之前,可以使用內建的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); 
    } 
+0

非常感謝,這給了我一個GD idea.I離開我的做法在這裏: // ... goodPoints = imGray.GoodFeaturesToTrack(MAX_CORNERS,quality_level,min_distance,eig_block_size,use_harris); 圖片 imout =新圖片(imGray.Size); (新的CircleF(goodPoints [0] [i],2),新的Bgr(Color.Red),1)對於(int i = 0; i 2012-04-03 03:13:56

+0

太好了,很高興這有幫助。我看到你正在使用不同的包裝,但重點是相同的。我給出的代碼與我們在實時應用程序中用作過濾器鏈中的特徵跟蹤過濾器的代碼類似,因此Process()的簽名和缺少轉換爲位圖的代碼。 – Alan 2012-04-03 14:32:56

0

爲​​事件添加處理程序並在那裏進行繪製。如果您需要刷新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); 
    } 
}