2012-04-02 5 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); Image imout = new Image (imGray.Size); (i、2)、新しいBgr(Color.Red)、1)のようにして、(i = 0、i

+0

素晴らしい、これは助けてうれしいです。私はあなたが別のラッパーを使用しているのを見ますが、ポイントはとにかく同じです。私が与えたコードは、フィルタチェーン内のフィーチャトラッキングフィルタとしてリアルタイムアプリで使用したものと似ています。そのため、Process()のシグネチャとビットマップへの変換の欠如があります。 – Alan

0

​​イベントのハンドラを追加し、そこで図面を作成します。図面を更新する必要がある場合は、ピクチャボックスコントロールの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); 
    } 
} 
関連する問題