使用OpenGL提高Imshow的性能

时间:2016-11-21 15:55:15

标签: c++ opencv opengl-es

我有一个运行我开发的opencv c ++应用程序的覆盆子pi。我正在从相机做一些cv :: Mat的图像处理,然后我调整大小(如果需要),创建一个边框,然后用cv :: imshow全屏显示。现在一切正常,但性能通常限制在800 x 480分辨率下8 fps。

我想做的是利用opengl来增加性能。我已经使用opengl支持编译opencv,并且可以使用cv :: WINDOW_OPENGL标志打开cv :: namedWindow,但性能实际上更糟。我相信原因是因为我仍在使用cv :: imshow和cv :: Mat而不是ogl :: buffer或其他利用opengl支持的数据类型。

所以我的问题是如何将我的cv :: Mat转换为ogl:buffer或其他数据类型(ogl :: Texture2D?),并且可以将该步骤与我的其他一些(特别是cv)结合使用:: Mat的copyTo())?我正在考虑而不是将我的cv :: Mat复制到更大的cv :: Mat来创建边框我可以直接转到ogl :: buffer以获得相同的效果。这可能吗?

当前代码,我们假设'image'始终是640x480 cv :: Mat *:

//Create initial cv::Mat's
cv::Mat imagetemp{ cv::Mat(480, 640, image->type(), cv::Scalar(0)) };
cv::Mat borderedimage{ cv::Mat(480, 800, image->type(), cv::Scalar(0)) };

//Create fullscreen opengl window
cv::namedWindow( "Output", cv::WINDOW_OPENGL );
cv::setWindowProperty( "Output", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN );

//Loop
while( true ) {
    //Get latest image
    displaymutex->lock();
    imagetemp = *image;
    displaymutex->unlock();

    //Format
    imagetemp.copyTo( borderedimage.rowRange(0, 480).colRange(80, 720) );

    //Display
    cv::imshow( "Output", borderedimage );
    cv::waitKey( 1 );
}

好的,以下代码适用于将cv :: Mat转换为cv :: ogl :: buffer,我也使用copyMakeBorder()简化了一下,但结果只有1-2 fps !!这不是一个可以从openGL中受益的应用程序吗?有或没有openGL利用率的任何其他性能改进建议?

//Create temporary cv::Mat
cv::Mat imagetemp{ cv::Mat(480, 640, image->type(), cv::Scalar(0)) };

//Create fullscreen opengl window
cv::namedWindow( "Output", cv::WINDOW_OPENGL );
cv::setWindowProperty( "Output", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN );

//Loop
while( true ) {
    //Get latest image
    displaymutex->lock();
    cv::copyMakeBorder( *image,
                        imagetemp,
                        0,
                        0,
                        80,
                        80,
                        cv::BORDER_CONSTANT,
                        cv::Scalar(0) );
    displaymutex->unlock();

    //Display
    buffer.copyFrom(imagetemp, cv::ogl::Buffer::ARRAY_BUFFER, true);
    cv::imshow( "Output", buffer );
    cv::waitKey( 1 );
}

由于

0 个答案:

没有答案