我正在尝试使用OpenCV从摄像头中获取帧并使用SFML在窗口中显示它们。
VideoCapture以OpenCV的Mat格式返回帧。为了显示这些帧,SFML需要一个1D像素数组,其uint8格式(据我所知)可与uchar互换。该数组应表示每个像素32位的RGBA值。
因此,我有一个uchar数组,并正在循环遍历Mat数据并复制每个像素:
VideoCapture以OpenCV的Mat格式返回帧。为了显示这些帧,SFML需要一个1D像素数组,其uint8格式(据我所知)可与uchar互换。该数组应表示每个像素32位的RGBA值。
因此,我有一个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
很遗憾,这并不太起作用。当我加载和显示camData时,循环中的某些东西有问题,结果图像变得混乱。
就我所能辨别的来看,要么是循环中的数学计算有误,因此像素被错误地分配,要么Mat数据采用的格式不是BGR。
有什么想法吗?