2012-04-02 4 views
0

Ich nahm ein Video auf und nahm ein Bild davon, konvertierte es in Bitmap und jetzt kann ich es auf der Bilderbox zeigen.Wie zeichne ich die Punkte (mit Floating-Wert) über ein Bitmap-Bild?

Ich habe einige Fließpunkte, die die Rückgabewerte der GoodFeaturesToTrack() -Funktion von Bildklasse ist.

Jetzt möchte ich diese Punkte/Markierungen auf verschiedenen Xi, Yi über meinem Bild zeichnen/zeigen;

Wie ist es möglich? Welchen Befehl muss ich verwenden?

Antwort

0

könnten Sie builtin OpenCV Funktionen rund um die Merkmalspunkte gefunden zu machen, bevor Sie Ihr Bild in eine normale Bitmap konvertieren. Dies wird auch viel schneller, da die Bildklasse mit dem Rohspeicher arbeiten wird, anstatt Grafikaufrufe auszugeben.

Hier ist ein (unvollständiges) Beispiel, um den Punkt zu veranschaulichen. Hinweis: Sie müssen möglicherweise die Anrufe an den CV Unterschriften von Ihrem Wrapper erklärt anzupassen:

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

Vielen Dank, es gab mir ein gd idea.I verlassen mein Ansatz hier: // ... Goodpoints = imGray.GoodFeaturesToTrack (MAX_CORNERS, Qualitätsstufe, Mindestentfernung, Eig_block_size, use_harris); Image imout = neu Image (imGray.Size); für (int i = 0; i

+0

Großartig, froh das hat geholfen. Ich sehe, dass Sie einen anderen Wrapper verwenden, aber der Punkt ist sowieso derselbe. Der Code, den ich gab, ähnelt dem, was wir in einer Echtzeit-App als Feature-Tracking-Filter in einer Filterkette verwendet haben, daher die Signatur von Process() und die fehlende Konvertierung in Bitmap. – Alan

0

Fügen Sie einen Handler für das Ereignis PictureBox.Paint hinzu und führen Sie Ihre Zeichnung dort aus. Wenn Sie den Zeichnungsaufruf Invalidate() auf Ihrem PictureBox-Steuerelement aktualisieren müssen, um neu zu zeichnen.

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); 
    } 
} 
Verwandte Themen