8

OpenCV を使用して Web カメラからフレームを取得し、SFML を使用してウィンドウに表示しようとしています。

VideoCapture は、OpenCV の Mat 形式でフレームを返します。フレームを表示するために、SFML は uint8 形式のピクセルの 1D 配列を必要とします。これは (私が知る限り) uchar と交換可能です。この配列は、1 ピクセルあたり 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 以外の形式になっています。

何か案は?

4

3 に答える 3

13

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);
于 2012-04-22T09:38:32.267 に答える