【发布时间】:2012-05-03 03:42:25
【问题描述】:
我正在尝试使用 OpenCV 从网络摄像头抓取帧并使用 SFML 在窗口中显示它们。
VideoCapture 以 OpenCV 的 Mat 格式返回帧。为了显示帧,SFML 需要 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。
有什么想法吗?
【问题讨论】:
-
乱码到底是什么意思?您能否发布结果图像的示例?
-
Example。源图像中的像素数据没有在目标数组中的正确位置结束,因此会产生奇怪的交错模式。
-
在从 gpu/opencl 拉回数据并将其转储到文件后具有相同的模式:D