2015-09-30 9 views
7

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?

+0

@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++ –

+0

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). –

+0

@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? –

risposta

0

Hai risolto questo?

Non ho usato OpenCVSharp, ma utilizzo OpenCV in C++ e lo richiamo da C#, utilizzando un wrapper C++/CLI. Avendo già usato EmguCV, penso che consumare OpenCV in C++ sia meglio che attraverso un wrapper, a volte gli errori sono più chiari perché è possibile eseguire il debug e guardare lo stack delle chiamate, e inoltre c'è una community più ampia che ti aiuta con le API C++ e Python di OpenCV.

Detto questo, dalla mia esperienza, se riesci a raggiungere il codice nativo e eseguirne il debug, sarebbe il migliore, in modo che tu possa essere sicuro che il non codificatore di OpenCV stia effettivamente ottenendo i parametri corretti. Prova a abilitare il debug del codice nativo, ma penso che avrai bisogno anche del codice sorgente di OpenCVSharp per eseguire il debug di quest'ultimo.

Se questo non funziona, forse si potrebbe guardare al metodo di distorsione originale di OpenCV e ricrearlo usando OpenCVSharp. O forse non distorsione dei canali separatamente e fusione. Difficilmente ideale, ma non è possibile correggere il comportamento nascosto, ma aggirarlo.

+1

Non l'ho risolto no, alla fine l'ho abbandonato pensando che non era il lavoro il problema e ho fatto il mio mini wrapper attorno alle parti di OpenCV i Sono interessato a C++/CLI e sta funzionando bene finora. –

+0

Penso che sia un buon approccio. E oh, ora non importa, ma avresti potuto pubblicare questo problema su [github] di OpenCV (https://github.com/shimat/opencvsharp/issues?q=is%3Aissue). –

+0

Ma dato che non sono sicuro dell'uso (set?) Non sono nemmeno sicuro che ci sia un bug quindi non credo di dover pubblicare un problema –

1

Sembra la differenza nel tuo camera.SourceImage e newSourceImage. Nel tuo primo frammento si assegna newSourceImage fuori del campo di applicazione, quindi immagino che si può fare qualcosa di simile:

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

Ma nel vostro secondo frammento si crea come var newSourceImage = .... Quindi, sembra che "undistort" determini il tuo tipo di Mat da solo e lo faccia male.

Potete mostrare tutte le inizializzazioni, per favore?

Problemi correlati