多线程OpencCV的VideoCapture

时间:2018-12-07 03:57:36

标签: c++ multithreading opencv opengl

我想知道我是否可以从VideoCapture的流多线程中受益,我正在使用OpenGL和OpenCV,而我的瓶颈无疑是摄像机流的获取和设置纹理。

...This goes in the Render Loop.

// We set our video.
try
{

    cap >> frame;

    if( frame.empty() )
    {

        break;

    }

    else
    {

        image = cvMat2TexInput( frame );

    }

    }

    catch( Exception& e )
    {

        std::cout << e.msg << std::endl;

    }

    if( frame.empty() )
    {

        std::cout << "No luck with the VideoCapture..." << std::endl;

    }

    else
    {

        image = cvMat2TexInput( frame );

    }



    if( image )
    {

        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, videoWidth, videoHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image );

    }

    else
    {

        std::cout << "Failed to load video texture." << std::endl;

    }

    ...

此函数可为OpenGL的纹理输入返回无符号char *

// Utility function to link OpenCV.
unsigned char* cvMat2TexInput( Mat& img )
{

    cvtColor( img, img, COLOR_BGR2RGB );
    transpose( img, img );
    flip( img, img, 1 );
    flip( img, img, 0 );
    return img.data;

}

如果性能更高,我将如何处理?我尝试过:

// Before main:
void multi( VideoCapture cap, Mat& frame )
{

    try
    {

        cap >> frame;

    }

    catch( Exception& e )
    {

        std::cout << e.msg << std::endl;

    }

}

// In main's render loop:
std::thread t1( multi, cap, std::ref( frame ) );
t1.join();

if( frame.empty() )
{

    std::cout << "No luck with the VideoCapture..." << std::endl;

}

else
{

    image = cvMat2TexInput( frame );

}



if( image )
{

    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, videoWidth, videoHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image );

}

else
{

    std::cout << "Failed to load video texture." << std::endl;

}

但是我降低了10 FPS。我还尝试从以下位置迁移视频的整个设置:

cap >> frame

收件人:

if( image )
{

    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, videoWidth, videoHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image );

}

else
{

    std::cout << "Failed to load video texture." << std::endl;

}

进入我的multi void函数,但是,即使不是很大的内存泄漏,我也没有任何输出。我还尝试过两个不同的循环,一个在线程函数内部,另一个在主程序的render循环中,但是我什么也没得到。

所以我的问题实际上是三个:

我可以从多线程中受益吗?如果是,我将如何实施?还有一个相关但可以为我执行其他过程的函数,我如何通过引用来调用未签名的char *?最后一个是我在多线程函数中无法执行的操作,我尝试了类似的操作:

void multi( ...., unsigned char*& image ){ ... }

并这样称呼它:

std::thread t1( multi, ...., std::ref( image ) )

std::thread t1( multi, ...., image )

但是只有内存泄漏!

自C ++ 11起,我认为操作系统无关紧要,但是我正在使用Windows 10和Visual Studio 2017。

谢谢!

0 个答案:

没有答案