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?
@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 –
Ü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). –
@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? –