Próbuję użyć OpenCV do przechwytywania klatek z kamery internetowej i wyświetlania ich w oknie przy użyciu SFML.OpenCV 2.3: Konwertuj macie do macierzy pikseli RGBA
VideoCapture zwraca klatki w formacie Mat OpenCV. Aby wyświetlić ramki, SFML wymaga tablicy pikseli 1D w formacie uint8, który (o ile wiem) jest wymienny z uchar. Oczekuje się, że ta macierz będzie reprezentować 32 bity na piksel RGBA.
Tak, mam uchar tablicę, a ja zapętlenie nad danymi matę i kopiując każdy piksel:
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
Niestety, to nie do końca pracy. Coś w tej pętli jest błędne, ponieważ wynikowy obraz po wczytaniu i wyświetleniu camData jest zakodowany.
O ile mogę się zorientować, albo moja matematyka w pętli jest błędna, więc piksele są przypisane źle, albo dane z Mat są w innym formacie niż BGR.
Wszelkie pomysły?
Co dokładnie masz na myśli przez jajecznicę? Czy mógłbyś podać przykład uzyskanego obrazu? – sietschie
[Przykład] (http://i.imgur.com/dD2fk.png). Dane pikseli z obrazu źródłowego nie kończą się poprawnymi lokalizacjami w docelowej tablicy, więc tworzy dziwne wzory przeplatania. – Thew
po prostu miał ten sam wzór po wyciągnięciu danych z gpu/opencl i wyrzuceniu go do pliku: D –