2012-03-29 9 views
2

Ich versuche eine Pixelfarbe der Frames meiner Webcam auszuwählen. So fange ich die Frames einer Show dann in einer ImageBox ohne Probleme auf. Aber wenn ich versuche, auf das Image zuzugreifen, das in ImageBox gespeichert ist, wenn ich auf die ImageBox doppelklicke, erhalte ich eine CvException. Die Ausnahme erscheint, wenn ich versuche, das Pixel des Bildes zu erhalten.Wie kann ich ein EmguCV ImageBox Image bekommen?

OpenCV: nicht erkannte oder nicht unterstützten Array-Typ

Dies ist, wie ich die Frames erfassen:

// On Form Load 
Application.Idle += ProcessFrame; 

private void ProcessFrame(object sender, EventArgs arg) 
    { 
     if (cap != null) 
     { 
      using (Image<Bgr, byte> frame = cap.QueryFrame()) 
      { 
       if (frame != null) 
       { 
        imageFrame = frame; 
        imageBoxFrame.Image = imageFrame; 

        Bgr color = imageFrame[50, 100]; 
       } 
      } 
     } 
    } 

Und in Doubleclick Veranstaltung:

private void imageBoxFrame_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
     if (treeViewObjects.SelectedNode is ColorNode && !isTracking) 
     { 
      if (imageFrame == null) 
       return; 

      Emgu.CV.UI.ImageBox imageBox = (Emgu.CV.UI.ImageBox)sender; 
      Image<Bgr, byte> image = (Image<Bgr, byte>)imageBox.Image; 

      Bgr color = image[e.X, e.Y]; // This line causes the Exception 
     } 
    } 

Anscheinend ist das Bild nicht null. Was mache ich falsch? Vielleicht etwas mit Thread-Dingen?

+0

eine Weile, aber Sie sollten Ihre eigene Frage beantworten, so diese aus der „offene Frage“ Warteschlange kommt. –

Antwort

3

(Frage der OP beantwortet und Antwort angefordert Entsendung Siehe Question with no answers, but issue solved in the comments (or extended in chat).)

Die OP schrieb:

ich es gelöst.

Ich muss nur das Bild klonen, weil die using-Anweisung Bilddaten löschen. Also muss ich bei ProcessEvent nur den Frame zu imageFrame klonen.

imageFrame = frame.Clone(); 

Und ein weiteres Problem. Der korrekte Zugriff auf die Pixeldaten erfolgt über [Y, X] nicht [X, Y].

Bgr color = image[e.Y, e.X];