OpenCV 2.3: Convertir Mat a matriz de píxeles RGBA

Estoy intentando usar OpenCV para capturar fotogtwigs de una cámara web y mostrarlos en una ventana usando SFML.

VideoCapture devuelve cuadros en formato Mat de OpenCV. Para mostrar los marcos, SFML requiere una matriz 1D de píxeles en su formato uint8, que (por lo que puedo decir) es intercambiable con uchar. Se espera que esta matriz represente 32 bits por píxel RGBA.

Entonces, tengo una matriz de uchar, y estoy haciendo un bucle sobre los datos de la Mat y copiando cada píxel:

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 

Desafortunadamente, esto no funciona del todo. Algo en ese bucle es incorrecto, ya que la imagen resultante cuando se carga y muestra camData está codificada.

Hasta donde puedo discernir, o bien mi matemática en el bucle es incorrecta por lo que los píxeles se asignan incorrectamente, o los datos de Mat están en otro formato que no sea BGR.

¿Algunas ideas?

OpenCV puede hacer todo el trabajo por ti:

 VideoCapture cap(0); Mat frame; cap >> frame; uchar* camData = new uchar[frame.total()*4]; Mat continuousRGBA(frame.size(), CV_8UC4, camData); cv::cvtColor(frame, continuousRGBA, CV_BGR2RGBA, 4); img.LoadFromPixels(frame.cols, frame.rows, camData); 

Me gusta más la respuesta aceptada, pero este fragmento te ayuda a entender lo que está pasando.

  for (int i=0; i 

Para mí trabajé siguiendo el código:

 VideoCapture capture(0); Mat mat_frame; capture >> mat_frame; // get a new frame from camera // Be sure that we are dealing with RGB colorspace... Mat rgbFrame(width, height, CV_8UC3); cvtColor(mat_frame, rgbFrame, CV_BGR2RGB); // ...now let it convert it to RGBA Mat newSrc = Mat(rgbFrame.rows, rgbFrame.cols, CV_8UC4); int from_to[] = { 0,0, 1,1, 2,2, 3,3 }; mixChannels(&rgbFrame, 2, &newSrc, 1, from_to, 4); 

El resultado (newSrc) es una imagen premultamente!