如何将图像缓冲区传递给 OpenCV Mat 对象?

How to pass an image buffer to an OpenCV Mat object?

我目前正在使用 PixeLINK USB3 机器视觉相机和 C 中的 OpenCV 进行编程。我使用以下代码成功地传递了 Mat 格式的相机图像:

PXL_RETURN_CODE rc = PxLInitialize(0, &hCamera);
if (!API_SUCCESS(rc))
{
    printf("Error: Unable to initialize a camera. \n");
    return EXIT_FAILURE;
}

vector<U8> frameBuffer(3000 * 3000 * 2);
FRAME_DESC frameDesc;

    if (API_SUCCESS(PxLSetStreamState(hCamera, START_STREAM)))
{
    while (true)
    {
        frameDesc.uSize = sizeof(frameDesc);
        rc = GetNextFrame(hCamera, (U32)frameBuffer.size(), &frameBuffer[0], 
                          &frameDesc, 5);

        Mat image(2592, 2048, CV_8UC1);
        Mat imageCopy;

        // Where passing of image data occurs
        int k = 0;
        for (int row = 0; row < 2048; row++)
        {
            for (int col = 0; col < 2592; col++)
            {
                image.at<uchar>(row, col) = frameBuffer[k];
                k++;
            }
        }...

正如我所提到的,这可行,但看起来很草率。我在网上看过,但没有找到太多细节。

我试过:

Mat image(2592, 2048, CV_8UC1, &frameBuffer, size_t step=AUTO_STEP); 

还有,

Mat image(2592, 2048, CV_8UC1, frameBuffer, size_t step=AUTO_STEP). 

前者是唯一编译成功的,并且显示乱码 - 我的意思是,它没有形成图像。

您是否尝试过切换 Matrowcol

你用 row = 2592, col = 2048,
初始化了你的 Mat 但是您在 for() 循环中使用了切换的 rowcol

我认为这段代码应该可以正常工作:

Mat image(2048, 2592, CV_8UC1, &frameBuffer[0]);

或者,如果您使用的是 C++11,

Mat image(2048, 2592, CV_8UC1, frameBuffer.data());