Kamerakalibrierung EmguCV\OpenCV



  • Hallo Community,

    ich habe Probleme beim Kalibrieren von Kameras mit EmguCV, wobei es egal ist ob ich nur eine Kamera oder Stereokameras kalibrieren will. Immer erscheint in Zeile 15 eine Exception ("Ar.size() == Size(3,3) || Ar.size() == Size(4, 3)"). Arbeitet sonst noch jemand mit der Emgu Version v2.0.50727 und bekommt die selben Fehler?

    int anz = (int)(4*7); // Die Anzahl der Punkte des Schachbretts
    int Messpunktzahl = 1; // wie viele Schachbretter gemessen wurden.
    MCvPoint3D32f[][] worldpoints = BitmapHelper.GenerateWorldPointChess(s, anz, Messpunktzahl); // Hier werden die Punkte des Bretts erzeugt
    List<PointF[]> dots = new List<PointF[]>();
    dots.Add(punkte);
    
    // Die Parameter erstellen
    IntrinsicCameraParameters param = new IntrinsicCameraParameters();
    ExtrinsicCameraParameters[] ex;
    Image<Bgr, byte> b; // ein Temp Bitmap
    
    CALIB_TYPE type = CALIB_TYPE.DEFAULT;
    CameraCalibration.CalibrateCamera(worldpoints, dots.ToArray(), Picture.Size, param, type, out ex); // die kalibierung "klappt"
    
    b = param.Undistort<Bgr, byte>(new Image<Bgr,byte>(bmp)); // Das Bild sollte entzerrt werden. Hier kommt es zur Exception.
    bmp = b.ToBitmap(); // in ein Bitmap umwandeln.
    


  • Vielleicht wäre es noch sinnvoll zu verraten, was die Fehlermeldung ist.



  • O.o schrieb:

    Vielleicht wäre es noch sinnvoll zu verraten, was die Fehlermeldung ist.

    Exception ("Ar.size() == Size(3,3) || Ar.size() == Size(4, 3)").
    Steht zwar schon oben, aber das Problem ist, dass ich dieses Array nicht festlege sondern sie durch das Kalibieren festgelegt werden sollte.


  • Administrator

    Das ist mit ziemlicher Sicherheit nicht die vollständige Fehlermeldung. Es fehlt mindestens noch der Exception-Typ.
    Zudem: Was ist bmp ?

    Grüssli



  • Dravere schrieb:

    Das ist mit ziemlicher Sicherheit nicht die vollständige Fehlermeldung. Es fehlt mindestens noch der Exception-Typ.
    Zudem: Was ist bmp ?

    Grüssli

    ok es ist eine "Emgu.CV.CvException"

    ErrorMessage: {"OpenCV: Ar.size() == Size(3,3) || Ar.size() == Size(4, 3)"}
    ErrorStr: Assertion failed
    File: .\cvundistort.cpp
    InnerException: null
    Source: Emgu.CV

    Stack:
    bei Emgu.CV.CvInvoke.CvErrorHandler(Int32 status, String funcName, String errMsg, String fileName, Int32 line, IntPtr userData)
    bei Emgu.CV.CvInvoke.cvUndistort2(IntPtr src, IntPtr dst, IntPtr intrinsicMatrix, IntPtr distortionCoeffs)
    bei Emgu.CV.IntrinsicCameraParameters.Undistort[TColor,TDepth](Image`2 src)
    bei Protokoll_BitmapCapture_A.FrmBitmapProtokollTool.Aktion(Boolean one)
    ...

    bmp ist ein "System.Drawing.Bitmap" welches ich übergeben bekomme. Es wird erst in ein Emgu Image umgewandelt und dann wieder zurück. Dieser Umweg ist nötig, da ich auf der Oberfläche nur Standard Controls verwenden soll und diese kein Emgu Formate verarbeiten können. Bei den Invoke dachte ich zuerst, dass eine DLL von OpenCV fehlt, aber alle OpenCV DLLs liegen im Ausgabeordner.


  • Administrator

    Jetzt ist zumindest ersichtlich, dass der Fehler von OpenCV direkt kommt.
    Ich habe OpenCV den Rücken gekehrt wegen der mangelnden Dokumentation. Fühle mich daher nicht gerade motiviert, diesem Fehler nun genauer nachzugehen.

    Der Fehler tritt wohl in dieser Funktion auf:
    http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html?highlight=cvundistort2#cvUndistort2

    Kannst du vielleicht mal mit dem Debugger durchgehen? Wenn du OpenCV selber kompilierst und das pdb File zur DLL dazulegst, dann sollte es dir möglich sein, auch in die OpenCV Bibliothek reinzuspringen. Vielleicht kannst du dann ausmachen, wer wann wo und wie den Fehler tatsächlich erzeugt.

    Grüssli



  • Dravere schrieb:

    Jetzt ist zumindest ersichtlich, dass der Fehler von OpenCV direkt kommt.
    Ich habe OpenCV den Rücken gekehrt wegen der mangelnden Dokumentation. Fühle mich daher nicht gerade motiviert, diesem Fehler nun genauer nachzugehen.

    Der Fehler tritt wohl in dieser Funktion auf:
    http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html?highlight=cvundistort2#cvUndistort2

    Kannst du vielleicht mal mit dem Debugger durchgehen? Wenn du OpenCV selber kompilierst und das pdb File zur DLL dazulegst, dann sollte es dir möglich sein, auch in die OpenCV Bibliothek reinzuspringen. Vielleicht kannst du dann ausmachen, wer wann wo und wie den Fehler tatsächlich erzeugt.

    Grüssli

    Das mit dem Rücken kehren hatte ich mir auch schon überlegt, aber bei uns wird OpenCV und Emgu wie eine helige Kuh betrachtet, außerdem habe ich nichts besseres auf die schnelle gefunden und das Vorgängerprojekt auf welches ich aufbaue hat auch OpenCV und Emgu verwendet und alle neben Projekte verwenden dies auch... da sind einen die Hände etwas gebunden.
    Ja und dies mit der Doku stimmt auch, denn es gibt oft so Feststellungen wie "DEFAULT means default!" Ohne aber zu klären was nun diesen Standard ausmacht und wie es sich von den anderen Optionen unterscheidet.

    Gestern habe ich versucht erstmal mich durch Emgu zu debuggen um zu sehen welche Werte wirklich an OpenCV übergeben werden, aber bei diesen Versuch habe ich feststellen müssen, dass die letzte Emgu Version ganz andere Fehler aufwirft und ich meine Kameras ganicht einzeln ansteuern kann. Wieso auch immer... es kommt immer ein Fenster mit "Videoquelle angeben" und nachher bekomme ich kein Bild... Das EmguCV Forum ist auch keine Hilfe da dort recht wenig los ist. Also musste ich mir erst die alten Versionen von Emgu runterladen um mit der richtigen Version zu debuggen.

    zu der cvUndistort2 Funktion: Ja diese wird den Fehler werfen, aber nach dem Text sieht es nach einer Exception bei dem Prüfen der Eingabewerte aus. Als ob Emgu das falsche Array übergibt.

    Zum Debuggen von OpenCV bin ich noch nicht gekommen ich hatte die Hoffnung, dass man mit der neuen Version besser vorankomen würde. Aber ich lade mit bereits alle Varianten von OpenCV herunter mal sehen wo dieser Fehler aufrtitt alternativ könnte man mal selbst die Funktion aufrufen und Prüfen ob es so dann klappt.

    Ansonsten danke schonmal für die Antworten und ich denke ich werde mich mal hier öfter im Forum blicken lassen, denn hier ist ja richtig was los ^^ und man bekommt sogar Antworten 😃 cooool 😉
    Irgendwann verliert man fast das Vertrauen, dass man im Internet noch nützliche Seiten findet.


  • Administrator

    The_Real_Black schrieb:

    Das mit dem Rücken kehren hatte ich mir auch schon überlegt, aber bei uns wird OpenCV und Emgu wie eine helige Kuh betrachtet, außerdem habe ich nichts besseres auf die schnelle gefunden und das Vorgängerprojekt auf welches ich aufbaue hat auch OpenCV und Emgu verwendet und alle neben Projekte verwenden dies auch... da sind einen die Hände etwas gebunden.
    Ja und dies mit der Doku stimmt auch, denn es gibt oft so Feststellungen wie "DEFAULT means default!" Ohne aber zu klären was nun diesen Standard ausmacht und wie es sich von den anderen Optionen unterscheidet.

    Ich hatte zum Glück nur wegen dem Studium etwas mit OpenCV zu tun, bzw. ich hatte es in Betracht gezogen, weil ich immer und überall von OpenCV gehört hatte. Beim Einstieg fand ich es noch gut, aber je komplexer meine Probleme wurden, desto mühsamer wurde OpenCV. Da ich keinen Wert auf Performance legen musste und ich reichlich Zeit zum Bearbeiten der einzelnen Bilder hatte, konnte ich auf AForge.Net umsteigen.

    Wenn OpenCV und Emgu bei euch wie eine heilige Kuh behandelt wird, wieso fragst du dann nicht die Propheten bei euch? 🙂

    The_Real_Black schrieb:

    zu der cvUndistort2 Funktion: Ja diese wird den Fehler werfen, aber nach dem Text sieht es nach einer Exception bei dem Prüfen der Eingabewerte aus. Als ob Emgu das falsche Array übergibt.

    Das ist anzunehmen, aber man weiss ja nie. Zudem ist mir nicht so ganz klar, welcher Parameter von cvUndistort2 falsch ist. Deshalb müsste man eben auch mal die Funktion cvUndistort2 anschauen. Womöglich reicht allerdings auch nur ein Blick in den Quellcode, sofern du den vertehst. Beim C++ Code von OpenCV kam ich ohne Debugger zum Teil nicht mehr nach. Und zum Teil warf es sogar den Debugger aus den Socken. Der Code ist nicht auf Wartbarkeit getrimmt sondern nur auf Geschwindigkeit.

    Für OpenCV ohne C# wären vielleicht noch die folgenden drei Unterforen geeignet:
    Mathematik (wenn die Parameter nicht klar sind und somit der Algo)
    Spiele-/Grafikprogrammierung (wenig Leser, dafür eher spezialisierte)
    Rund um die Programmierung (viele Leser)

    Ansonsten findet man auch immer noch etwas in der OpenCV Mailing Liste:
    http://dir.gmane.org/gmane.comp.lib.opencv

    Grüssli



  • Dravere schrieb:

    konnte ich auf AForge.Net umsteigen.

    Wenn OpenCV und Emgu bei euch wie eine heilige Kuh behandelt wird, wieso fragst du dann nicht die Propheten bei euch? 🙂

    Das ist anzunehmen, aber man weiss ja nie. Zudem ist mir nicht so ganz klar, welcher Parameter von cvUndistort2 falsch ist. Deshalb müsste man eben auch mal die Funktion cvUndistort2 anschauen. Womöglich reicht allerdings auch nur ein Blick in den Quellcode, sofern du den vertehst. Beim C++ Code von OpenCV kam ich ohne Debugger zum Teil nicht mehr nach. Und zum Teil warf es sogar den Debugger aus den Socken. Der Code ist nicht auf Wartbarkeit getrimmt sondern nur auf Geschwindigkeit.

    Das AForge.Net habe ich schon mal gesehen habe aber noch nichts darin gemacht. Meine Propheten kann ich leider nicht fragen die sind momentan auch in ihrer Vorlesungsfreienzeit und da will ich ihnen nicht unnötig auf die Nerven gehen. Das werde ich schon noch lange genug bis meine Bachelorarbeit endlich fertig ist. 😉 Deswegen versuche ich möglichst viel selbst umzusetzen bzw andere Hilfe zu finden bevor ich bei meinen Profs auf der Matte stehe.

    Die Funktionen und den Code werde ich die nächsten Tage erst ansehen bis dahin beginne ich andere Probleme zu lösen, denn etwas abstand von einen Problem und ein anderes bearbeiten hift auch mal. Vorallem wenn man den Frust bis dahin vergessen hat. Das Mathematik Forum werde ich sicher noch bemühen müssen aber erst später ^^



  • Kurze Umfrage:
    Wer hat gewusst, dass man beim Visual Studio 2010 C++ Compiler keine Benutzernamen mit 20 Zeichen haben darf, da sonst der Pfad des Compilers nicht gefunden werden kann?

    Auf sowas muss man ja erst mal kommen! Ich hätte beinahe das Studio neu installiert. Debuggen von OpenCV gibts dann im neuen Jahr...


  • Administrator

    Ist seit Mitte April 2010 bekannt:
    http://connect.microsoft.com/VisualStudio/feedback/details/550489/c-unable-to-build-with-my-standard-username

    Wer hat schon so lange Benutzernamen? :p
    Ich habe es ein paar Monate danach - auf der Suche nach was anderem - durch einen Blog erfahren 🙂

    Grüssli


Anmelden zum Antworten