【如何使用 cv::imshow 直接显示 cv::cuda::GpuMat?】

文章目录


当我尝试使用 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显示功能/特性没有实现)?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【网络星空】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值