2012-03-28 17 views
0

Ich versuche, einen Film mit openCV zu machen. Ich kann alle Bilder in die AVI einfügen und es funktioniert gut, außer dass das Bild in einem großen Winkel geneigt ist. Es sieht so aus, als wäre es über das Bild verschmiert.Slanted Video in openCV

Die Rahmen sind perfekt quadratisch, so dass es nicht darum geht, Höhe und Breite zu verwechseln. Die Bilder sind 24 Bit. Die andere Sache, die seltsam ist, ist, dass es nicht konsistent erscheint, wenn es passiert. manchmal sieht es gut aus, manchmal ist es schräg. Hier

ist ein Bild aus dem Film: http://dl.dropbox.com/u/63600049/MIP.avi

Hier ist der Code:

PInvoke Methode

   IntPtr _ptr = CvInvoke.cvCreateVideoWriter(AVIFilename, CvInvoke.CV_FOURCC('M', 'J', 'P', 'G'), 15, size, 1); 

       int count = 0; 
       for (int n = 1; n < Frames.Length; n++) 
       { 
        if (Frames[n].Trim().Length > 0) 
        { 
         try 
         { 
          FileInfo file = new FileInfo(Frames[n]); 
          IntPtr ptr = CvInvoke.cvLoadImage(file.FullName, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR | Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYDEPTH); 
          if (ptr == IntPtr.Zero) 
           throw new NullReferenceException(String.Format("Unable to load image from file \"{0}\".", file.FullName)); 

          CvInvoke.cvWriteFrame(_ptr, ptr); 
          //VW.WriteFrame<Bgr, byte>(frame); 
          count++; 
         } 
         catch (Exception ex) 
         { 
          System.Diagnostics.Debug.Print(ex.Message); 
         } 
        } 
       } 
       CvInvoke.cvReleaseVideoWriter(ref _ptr); 

EMGU Version

public static void CreateAVIVideoEMGU(string AVIFilename, string[] Frames) 
    { 
     Bitmap bitmap = new Bitmap(Frames[0]); 

     VideoWriter VW = null; 

     VW = new VideoWriter(AVIFilename, CvInvoke.CV_FOURCC('M', 'J', 'P', 'G'), 15, bitmap.Height, bitmap.Width, true); 

     int count = 0; 
     for (int n = 1; n < Frames.Length; n++) 
     { 
      if (Frames[n].Trim().Length > 0) 
      { 
       var frame = new Emgu.CV.Image<Bgr, byte>(ConvertBitmapTo24(new Bitmap (Frames[n]))); 
       VW.WriteFrame<Bgr, byte>(frame); 
       count++; 
      } 
     } 

     VW.Dispose(); 
    } 

Die Bilder sind alle 24 Bit jpg mit den gleichen Abmessungen

+0

Welche OpenCV-Version verwenden Sie und welches Betriebssystem ist das? (Win/Linux/Mac) – karlphillip

+0

Es ist EMGU 2.3 64-Bit-Version (C# Wrapper von openCV 2.0). Ich benutze eine Windows 7-Maschine. – ochensati

+0

Können Sie ein Bild des "verschmierten" Bildes posten? – mevatron

Antwort

1

Bestimmte Codecs akzeptieren nur Breite (und manchmal Höhe) Werte, die ein Vielfaches von 2, 4, 8 oder mehr sind. Ich bin mir dieser Einschränkung im MJPG-Codec nicht bewusst, aber das Problem, das Sie beschreiben, ähnelt dem, was passiert, wenn Sie diese Codecs bei Bildern mit Weiten verwenden, die kein Vielfaches des angegebenen Wertes sind. Vielleicht möchten Sie sehen, ob das Problem durch die Eingabe der Breite in ein Vielfaches von 16 behoben wird.

+0

Sie erhalten den Award. Es muss ein Vielfaches von 4 sein. Danke! – ochensati

+0

Ich habe gerade den folgenden Code versucht, aber eine Ausnahme tritt auf: captureOutput = neuer VideoWriter (@ "test.avi", CvInvoke.CV_FOURCC ('M', 'J', 'P', 'G'), 1, 1024, 1024, wahr); was denkst du den Grund? Ausnahme: {"'Der Aufruf des Konstruktors für den Typ' AVITest.MainWindow ', der mit den angegebenen Bindungsbedingungen übereinstimmt, hat eine Ausnahme ausgelöst.' Zeilennummer '3' und Zeilenposition '9'. "} –

0

Ich denke, es ist wahrscheinlich ein Bild Schritt/Tonhöhe Problem. Stellen Sie sicher, dass Sie Bilder unterstützen, bei denen die Anzahl der zugewiesenen Bytes pro Zeile möglicherweise nicht der Breite entspricht, die der Größe eines einzelnen Pixels entspricht. Leider kenne ich EmguCV nicht, aber ich würde erwarten, dass es das unterstützt.

+0

Ich habe sichergestellt, dass die Schrittweite und Tonhöhe korrekt sind, ich stellte sicher, dass das Bild auf der OpenCV-Seite des Wrappers korrekt ist, und ich stellte sicher, dass alle Bilder im ganzen Film die gleiche Größe haben. Könnte es ein 64-Bit-Problem sein? Ich stellte sicher, dass das Bild korrekt durch den Wrapper in openCV läuft (das Bild wird korrekt von der openCV-Seite gespeichert, ohne den Wrapper zu durchlaufen.) – ochensati