我想知道我是否可以从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。
谢谢!