Sto tentando di utilizzare OpenCV per acquisire frame da una webcam e visualizzarli in una finestra utilizzando SFML.OpenCV 2.3: Converti matrice in pixel RGBA
VideoCapture restituisce fotogrammi nel formato Mat di OpenCV. Per visualizzare i frame, SFML richiede una matrice 1D di pixel nel suo formato uint8, che (per quanto posso dire) è intercambiabile con uchar. Si prevede che questo array rappresenti 32 bit per pixel RGBA.
Così, ho un array di uchar, e sto loop sui dati Mat e la copia di ogni pixel:
VideoCapture cap(0);
Mat frame;
cap >> frame;
uchar* camData = new uchar[640*480*4];
uchar* pixelPtr = frame.data;
for(int i = 0; i < frame.rows; i++)
{
for(int j = 0; j < frame.cols; j++)
{
camData[i*frame.cols + j + 2] = pixelPtr[i*frame.cols + j + 0]; // B
camData[i*frame.cols + j + 1] = pixelPtr[i*frame.cols + j + 1]; // G
camData[i*frame.cols + j + 0] = pixelPtr[i*frame.cols + j + 2]; // R
camData[i*frame.cols + j + 3] = 255;
}
}
img.LoadFromPixels(640, 480, camData); //Load pixels into SFML Image object for display
Purtroppo, questo non funziona del tutto. Qualcosa in quel ciclo è sbagliato, poiché l'immagine risultante quando carico e visualizzo camData è criptata.
Per quanto posso discernere, il mio ciclo matematico è sbagliato, quindi i pixel vengono assegnati in modo errato oppure i dati Mat sono in un formato diverso da BGR.
Qualche idea?
Che cosa intendi esattamente con "scrambled"? Potresti postare un esempio dell'immagine risultante? – sietschie
[Esempio] (http://i.imgur.com/dD2fk.png). I dati dei pixel dall'immagine sorgente non finiscono nelle posizioni corrette nell'array di destinazione, quindi rendono strani i pattern di interleaving. – Thew
ha appena avuto lo stesso schema dopo aver estratto i dati da gpu/opencl e scaricato in file: D –