gpt4 book ai didi

c++ - OpenCV 2.3 : Convert Mat to RGBA pixel array

转载 作者:可可西里 更新时间:2023-11-01 18:17:51 25 4
gpt4 key购买 nike

我正在尝试使用 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

不幸的是,这不太行得通。该循环中的某些地方是错误的,因为当我加载和显示 camData 时生成的图像被打乱了。

据我所知,要么是我在循环中的数学计算错误导致像素分配错误,要么是 Mat 数据的格式不是 BGR。

有什么想法吗?

最佳答案

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

关于c++ - OpenCV 2.3 : Convert Mat to RGBA pixel array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10265125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com