OpenCV的2.3:转换垫以RGBA像素阵列(OpenCV 2.3: Convert Mat to

2019-06-23 20:00发布

我尝试使用OpenCV的从摄像头抓取框架和使用SFML在一个窗口中显示出来。

VideoCapture在OpenCV中的垫格式返回帧。 要显示的帧,SFML需要在其UINT8格式,(据我可以告诉)是与UCHAR可互换像素的一维数组。 这个阵列被预期以表示每像素RGBA 32位。

所以,我有一个UCHAR阵列,而我遍历该垫的数据和复制的每个像素:

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

不幸的是,这完全不是那么回事。 一些在该环是错误的,因为所得到的图像时,加载和显示camData被加扰。

至于我可以看出,无论是我在环数学错了,所以在像素被分配错误,或垫的数据是比其他BGR某种格式。

有任何想法吗?

Answer 1:

OpenCV的可以为你做所有的工作:

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


Answer 2:

我喜欢接受的答案更好,但这个片段可以帮助你了解这是怎么回事。

 for (int i=0; i<srcMat.rows; i++) {
            for (int j=0; j<srcMat.cols; j++) {
                int index = (i*srcMat.cols+j)*4;
                // copy while converting to RGBA order
                dstRBBA[index + 0] = srcMat[index + 2 ];
                dstRBBA[index + 1] = srcMat[index + 1 ];
                dstRBBA[index + 2] = srcMat[index + 0 ];
                dstRBBA[index + 3] = srcMat[index + 3 ];
            }
        }


Answer 3:

对我来说,工作下面的代码:

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

结果(newSrc)是预乘图像!



文章来源: OpenCV 2.3: Convert Mat to RGBA pixel array