我有一个运行我开发的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 );
}
由于