prima cosa crea un vuoto (o unititialized) cv::Mat
per i nostri dati da leggere in direttamente. Questo può essere fatto una volta all'avvio, ma d'altra parte cv::Mat::create
non costa molto quando l'immagine ha già dimensioni e tipo corrispondenti. Il tipo dipende dalle tue esigenze, di solito è qualcosa come CV_8UC3
per un'immagine a colori a 24 bit.
cv::Mat img(height, width, CV_8UC3);
o
img.create(height, width, CV_8UC3);
poi si deve tenere conto di cv::Mat
non neccessarily memorizzare file di immagine in modo contiguo. Potrebbe esserci un piccolo valore di padding alla fine di ogni riga per rendere le righe allineate a 4 byte (o 8?). Quindi è necessario pasticciare con le modalità di memorizzazione dei pixel:
//use fast 4-byte alignment (default anyway) if possible
glPixelStorei(GL_PACK_ALIGNMENT, (img.step & 3) ? 1 : 4);
//set length of one complete row in destination data (doesn't need to equal img.cols)
glPixelStorei(GL_PACK_ROW_LENGTH, img.step/img.elemSize());
Avanti, il tipo di matrice influenza i parametri di formato e tipo di glReadPixels
. Se vuoi immagini a colori devi tenere presente che OpenCV solitamente memorizza i valori dei colori in ordine BGR, quindi è necessario utilizzare GL_BGR(A)
(che sono stati aggiunti con OpenGL 1.2) anziché GL_RGB(A)
. Per le immagini di un componente utilizzare GL_LUMINANCE
(che somma i singoli componenti del colore) o , GL_GREEN
, ... (per ottenere un singolo componente). Così per la nostra immagine CV_8UC3
l'ultima chiamata per leggere direttamente nel cv::Mat
sarebbe:
glReadPixels(0, 0, img.cols, img.rows, GL_BGR, GL_UNSIGNED_BYTE, img.data);
Infine, memorizza OpenCV immagini da cima a fondo. Quindi potresti aver bisogno di capovolgerli dopo averli catturati o renderli capovolti in OpenGL (questo può essere fatto regolando la matrice di proiezione, ma in questo caso tieni d'occhio l'orientamento del triangolo).Per riflettere una cv::Mat
in verticale, è possibile utilizzare cv::flip
:
cv::flip(img, flipped, 0);
Così da tenere a mente OpenCV:
- memorizza le immagini dall'alto verso il basso, da sinistra a destra
- negozi immagini a colori in ordine BGR
- non potrebbe righe immagine negozio fitto
risposta veramente bello. Stavo già lavorando al flipping ma non ho prestato attenzione a glPixelStorei. Grazie –
Non riesco a chiamare GL_BGR, non so perché il linker non riesce a trovarlo perché ho l'ultima versione –
@Jav_Rock È stato introdotto con OpenGL 1.2. Quindi, se l'hardware e il driver lo supportano (il che è molto probabile, a meno che tu non abbia acquistato la tua scheda grafica 20 anni fa), devi solo definire questo simbolo, includendo un [. Glext.h'] ragionevolmente nuovo (http: // www.opengl.org/registry/api/glext.h) o utilizzando una libreria di gestione delle estensioni in primo luogo (come GLEW), che dovrebbe portare la propria intestazione con definizioni costanti. Ciò sarebbe necessario se si desidera utilizzare qualsiasi funzionalità superiore a 1.1, ad ogni modo (come i PBO, che potrebbero velocizzare le prestazioni di lettura che vengono utilizzate correttamente). –