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

时间:2018-04-02 15:42:15

标签: c++ c opencv3.0

我目前正在使用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). 

前者是唯一一个成功编译的人,并且显示出胡言乱语 - 我的意思是,它不会形成图像。

1 个答案:

答案 0 :(得分:0)

您是否尝试切换row的{​​{1}}和col

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

我认为此代码应该正常运行:

for()

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

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