2015-09-30 7 views
7

Ich benutze OpenCVSharp, aber habe derzeit die Hälfte meines Codes in der C und die andere Hälfte in der C++ API, ich versuche, alles auf die C++ - Version zu portieren, um die veraltete API zu vermeiden sowie das Laden von Bildern zu vermeiden zweimal (Anteil Mat statt einer Mat und ein CvMat pro Bild mit)Wie wird die neue C++ - API in OpenCVSharp-Code verwendet?

Hier ist der Code, den ich das funktioniert hatte:

  CvMat distortion = new CvMat(8, 1, MatrixType.F64C1); 
      distortion[0, 0] = camera.CameraConfig.k1; 
      distortion[1, 0] = camera.CameraConfig.k2; 
      distortion[2, 0] = camera.CameraConfig.p1; 
      distortion[3, 0] = camera.CameraConfig.p2; 
      distortion[4, 0] = camera.CameraConfig.k3; 
      distortion[5, 0] = 0; 
      distortion[6, 0] = 0; 
      distortion[7, 0] = 0; 

      CvMat intrinsic = new CvMat(3, 3, MatrixType.F32C1); 
      intrinsic[0, 0] = camera.CameraConfig.fx; 
      intrinsic[0, 1] = camera.CameraConfig.skew; 
      intrinsic[0, 2] = camera.CameraConfig.cx; 
      intrinsic[1, 0] = 0; 
      intrinsic[1, 1] = camera.CameraConfig.fy; 
      intrinsic[1, 2] = camera.CameraConfig.cy; 
      intrinsic[2, 0] = 0; 
      intrinsic[2, 1] = 0; 
      intrinsic[2, 2] = 1; 
      Cv.Undistort2(camera.SourceImage, newSourceImage,intrinsic,distortion); 

und der Code (die wie eine offensichtliche Port schien, als ich es getippt), dass funktioniert nicht (Ich lande mit einem einzelnen farbigen Bild einer Farbe, die in der Szene vorhanden ist):

  Mat distortion = new Mat(8, 1, MatType.CV_64FC1); 
      distortion.Set(0, 0, camera.CameraConfig.k1); 
      distortion.Set(1, 0, camera.CameraConfig.k2); 
      distortion.Set(2, 0, camera.CameraConfig.p1); 
      distortion.Set(3, 0, camera.CameraConfig.p2); 
      distortion.Set(4, 0, camera.CameraConfig.k3); 
      distortion.Set(5, 0, 0); 
      distortion.Set(6, 0, 0); 
      distortion.Set(7, 0, 0); 

      Mat intrinsic = new Mat(3, 3, MatType.CV_32FC1); 
      intrinsic.Set(0, 0, camera.CameraConfig.fx); 
      intrinsic.Set(0, 1, camera.CameraConfig.skew); 
      intrinsic.Set(0, 2, camera.CameraConfig.cx); 
      intrinsic.Set(1, 0, 0); 
      intrinsic.Set(1, 1, camera.CameraConfig.fy); 
      intrinsic.Set(1, 2, camera.CameraConfig.cy); 
      intrinsic.Set(2, 0, 0); 
      intrinsic.Set(2, 1, 0); 
      intrinsic.Set(2, 2, 1); 
      var newSourceImage = camera.SourceImage.Undistort(intrinsic, distortion); 

Fehle ich falsch die Werte? Ist das Portieren nicht so einfach?

+0

@Eser da dies C# ist, wie in der ersten Zeile erwähnt ich OpenCVSharp (ein C# -Wrapper für OpenCV), OpenCV stellt zwei APIs (eine C und eine C++ - API) und beide sind in C# über OpenCVSharp verfügbar , also ist das reiner C# -Code, aber "in C#" möchte ich von der Verwendung der C-Methoden zu den C++ - Einsen wechseln –

+0

Überlegen Sie, Titel Ihres Beitrags zu klären - es funktioniert also nicht mit "C#" - Tag ... (basierend Auf deinen Kommentar macht es eigentlich Sinn, aber Titel alleine ist verwirrend und kann * downvotes/nutzlose Kommentare wie diesen verursachen). –

+0

@AlexeiLevenkov Ich dachte immer, es war eigentlich verpönt, die Technologie anstelle der Frage im Titel zu notieren, da es die Rolle von Tags war, da ich sehe, wie hoch dein Ruf ist, werde ich auf der Seite stehen, wenn du sicher bist, dass es das Richtige ist Wahl, aber es schien nicht zu sein, wie die Frage ist "Wechsel von der C auf die C++ API" und die Technologien sind OpenCV/OpenCVSharp/C#. Haben Sie immer noch das Gefühl, ich sollte wechseln? –

Antwort

0

Haben Sie das gelöst?

Ich habe OpenCVSharp nicht verwendet, aber ich verwende OpenCV in C++ und rufe es von C#, mit einem C++/CLI-Wrapper. Wenn ich EmguCV schon früher benutzt habe, denke ich, dass OpenCV in C++ besser ist als in einem Wrapper. Manchmal sind Fehler klarer, weil man den Call-Stack debuggen und betrachten kann. Außerdem gibt es eine breitere Community, die OpenCVs C++ - und Python-APIs unterstützt.

Aus meiner Erfahrung, wenn Sie den nativen Code erreichen und debuggen können, wäre es das beste, so dass Sie sicher sein können, dass OpenCV's undistort tatsächlich die richtigen Parameter bekommt. Versuchen Sie, das Debuggen von systemeigenem Code zu aktivieren, aber ich denke, dass Sie auch den Quellcode von OpenCVSharp benötigen, um ihn zu debuggen.

Wenn dies nicht funktioniert, könnten Sie vielleicht OpenCVs ursprüngliche undistierende Methode ansehen und sie mit OpenCVSharp neu erstellen. Oder vielleicht die Kanäle getrennt voneinander dissoziieren und verschmelzen. Kaum ideal, aber man kann verstecktes Verhalten nicht beheben, sondern nur umgehen.

+1

Ich habe es nicht gelöst nein, am Ende habe ich es fallengelassen, weil ich dachte, dass es nicht das Problem war und habe meinen eigenen Mini-Wrapper um die Teile von OpenCV gemacht Ich bin an C++/CLI interessiert und es funktioniert soweit ganz gut. –

+0

Ich denke, das ist ein guter Ansatz. Und oh, jetzt ist es egal, aber Sie könnten dieses Problem auch auf OpenCVs [github] (https://github.com/shimat/opencvsharp/issues?q=is%3Aissue) gepostet haben. –

+0

Aber da ich mich nicht sicher bin, ob ich es benutze (set?), Bin ich mir nicht einmal sicher, ob es einen Bug gibt. Ich denke nicht, dass ich ein Problem posten würde. –

1

Es sieht aus wie der Unterschied in Ihrem camera.SourceImage und newSourceImage. In Ihrem ersten Schnipsel Sie newSourceImage aus dem Anwendungsbereich zuordnen, so nehme ich an Dich so etwas wie zu tun:

newSourceImage = new Mat(new Size(...), MatType.CV_8UC3) 

Aber in Ihrem zweiten Schnipsel Sie es als var newSourceImage = ... erstellen. Also, es sieht aus wie 'undistort' bestimmt Ihren Mat-Typ selbst und macht es falsch.

Können Sie bitte alle Initialisierung anzeigen?

Verwandte Themen