OpenCV 2.3:将Mat转换为RGBA像素阵列

The*_*hew 7 c++ webcam opencv sfml

我试图使用OpenCV从网络摄像头抓取帧并使用SFML在窗口中显示它们.

VideoCapture以OpenCV的Mat格式返回帧.为了显示帧,SFML需要uint8格式的一维像素阵列,据我所知,它可与uchar互换.预计该阵列表示每像素RGBA 32位.

所以,我有一个uchar数组,我循环Mat数据并复制每个像素:

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
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不太有效.该循环中的某些内容是错误的,因为当我加载并显示camData时生成的图像被加扰.

据我所知,循环中的数学运算是错误的,因此像素分配错误,或者Mat数据采用的格式不是BGR.

有任何想法吗?

And*_*aev 11

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);
Run Code Online (Sandbox Code Playgroud)