OpenCV 2.3: Convertir une masortingce en masortingce de pixels RGBA

J’essaie d’utiliser OpenCV pour récupérer des images d’une webcam et les afficher dans une fenêtre à l’aide de SFML.

VideoCapture renvoie des images au format Mat d’OpenCV. SFML nécessite un tableau 1D de pixels dans son format uint8, qui (pour autant que je sache) est interchangeable avec UChar. Ce tableau devrait représenter 32 bits par pixel RGBA.

J’ai donc un tableau uchar, et je passe en boucle sur les données du tapis et copie chaque 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 

Malheureusement, cela ne fonctionne pas tout à fait. Quelque chose dans cette boucle est faux, car l’image résultante lorsque je charge et affiche camData est brouillée.

Autant que je sache, mes calculs dans la boucle sont erronés et les pixels ne sont pas affectés correctement ou les données du format Mat sont dans un format autre que BGR.

Des idées?

OpenCV peut faire tout le travail pour vous:

 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); 

J’aime mieux la réponse acceptée, mais cet extrait de code vous aide à comprendre ce qui se passe.

  for (int i=0; i 

Pour moi travaillé code suivant:

 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); 

Le résultat (newSrc) est une image prémultipliée!