Sto usando OpenCVSharp ma attualmente ho metà del mio codice nel C e l'altra metà nell'API C++, sto provando a portarlo tutto nella versione C++ per evitare l'API deprecata e per evitare di caricare le immagini due volte (quota Mat
invece di avere un Mat
e uno CvMat
per immagine)Come utilizzare la nuova API in stile C++ nel codice OpenCVSharp?
Ecco il codice che avevo che funziona:
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);
e il codice (che sembrava una porta ovvia come ho digitato) che non funziona (finisco con una singola immagine colorata di un colore che è presente nella scena):
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);
Sono erroneamente impostato i valori? Il porting non è così semplice?
@Eser perché questo è C#, come menzionato nella prima riga sto usando OpenCVSharp (un wrapper C# per OpenCV), OpenCV espone due API (una C e una API in stile C++) ed entrambi sono disponibili in C# tramite OpenCVSharp , quindi questo è puro codice C#, ma "in C#" voglio passare dall'uso dei metodi C a quelli C++ –
Considera di chiarire il titolo del tuo post - quindi non funziona con il tag "C#" ... (basato sul tuo commento ha effettivamente senso, ma il titolo da solo è confuso e * può * causare downvotes/commenti inutili come questo). –
@AlexeiLevenkov ho sempre pensato che fosse davvero disapprovato notare la tecnologia al posto della domanda nel titolo in quanto era il ruolo dei tag, vedendo quanto è alta la tua reputazione che mi schiererò con quella se sei sicuro che sia il giusto scelta, ma non sembrava essere la domanda è "passare dalla C alla API C++) e le tecnologie sono OpenCV/OpenCVSharp/C#. Ti senti ancora come dovrei passare? –