文章目录
当我尝试使用 OpenCV 函数 cv::imshow 显示 cv::cuda::GpuMat 对象时,我遇到了一些问题。以下是我的环境
OpenCV 版本:4.5.5 构建,支持 CUDA 和 opengl
系统:视窗 10 1909
电脑配置:i7 9750h+16G
内存+GTX 1660ti 6G
搜索了一段时间后,我知道有三种方法可以使用cv::imshow显示cv::cuda::GpuMat对象:
- 使用下载方式将 GpuMat 传输到 Mat,然后直接使用 imshow 显示 Mat 对象
- 创建一个带有标志 cv::WINDOW_OPENGL 的窗口,然后在使用 opengl 创建的窗口中显示带有 imshow 的 GpuMat 对象
- 创建一个带有标志 cv::WINDOW_OPENGL 的窗口,使用 GpuMat 创建一个 cv::ogl::Texture2D
对象并设置绘图回调函数
我的问题出现在方法 2.当我尝试直接使用 imshow 显示 GpuMat 时,它给了我错误 msg: OpenCV(4.5.5) F:\OpenCVWithCUDA\opencv-4.5.5\modules\core\src\matrix_wrap.cpp:111: error: (-213:函数/特性未实现) 你应该在函数’cv::d ebug_build_guard::InputArray::getMat’ 中显式调用 cuda::GpuMat 对象的下载方法 InputArray::getMat’
以下是简单的问题代码:
cv::cuda::GpuMat d_dst;//Assume that the object already has content
cv::namedWindow("highgui(OpenGL)", cv::WINDOW_AUTOSIZE | cv::WINDOW_OPENGL);
cv::imshow("highgui(OpenGL)", d_dst);
定义输入/输出 Array.In 函数matrix_wrap.cpp:
Mat _InputArray::getMat_(int i) const
{
...
if( k == CUDA_GPU_MAT )
{
CV_Assert( i < 0 );
CV_Error(cv::Error::StsNotImplemented, "You should explicitly call download method for cuda::GpuMat object");
}
}
但是方法 3 效果很好:
cv::namedWindow("highgui(Texture2D)", cv::WINDOW_OPENGL);
cv::ogl::Texture2D texture(d_dst);
cv::resizeWindow("highgui(Texture2D)", d_dst.cols, d_dst.rows);
cv::setOpenGlContext("highgui(Texture2D)");
cv::setOpenGlDrawCallback("highgui(Texture2D)", drawTexture_cb, &texture);
cv::updateWindow("highgui(Texture2D)");
void drawTexture_cb(void* userdata)
{
cv::ogl::Texture2D* texture = static_cast<cv::ogl::Texture2D*>(userdata);
cv::ogl::render(*texture);
}
根据我的搜索,方法3似乎是方法2的内部实现,但是为什么它不起作用?我自己的建筑opencv有什么问题吗(上面的错误msg显示功能/特性没有实现)?