如何在OpenCV cv :: cuda :: GpuMat或cv :: ogl :: Buffer图像对象中绘制文本和矩形?

时间:2018-05-03 03:51:33

标签: opencv gpu

我正在为一个项目工作,计划这样做:

1.通过ffmpeg和NVDEC库解码rtsp流。

2.用cv :: cuda :: GpuMat包装解码的cuda YUV_NV12帧缓冲区指针。

3.预处理YUV_NV12 GpuMat以规范化CV_32FC3 GpuMat并使用新的GpuMat调用caffe推理。获得深度学习结果,如目标rects和typeid。

4.在YUV_NV12 GpuMat上绘制目标rects和type_name。

5.使用ffmpeg和NVENC对绘制的帧进行编码并将rtsp流推送到服务器。所以客户可以查看算法结果。

现在我在第4章阻止。

a)我试图避免使用draw运算符,但是如果我立即将算法结果发送到客户端而不是在YUV_NV12 GpuMat处绘制目标rects和type_name,则算法结果和视频帧之间可能会有一些时间匹配工作。我不知道如何在rtsp帧和算法结果包之间建立链接。

b)我尝试直接用cv :: cuda :: GpuMat调用cv :: putText cv :: rectangle,现在没有实现,导致OpenCV崩溃。

c)我尝试使用cv :: ogl支持进行渲染。我不想创建一个openGL窗口,而是在背景中从cuda缓冲区渲染缓冲区或纹理贴图。如下面的测试代码

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/opengl.hpp>

int main() {
    cv::Mat cpuImg;
    cv::ogl::Buffer glBuf(480,640,CV_8UC3, cv::ogl::Buffer::Target::PIXEL_UNPACK_BUFFER, true);

    auto gpuMat = glBuf.mapDevice();
    // Do some caffe Algorithm
    glBuf.unmapDevice();

    cv::putText(glBuf, "TEST",cv::Point(20,20), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255,255,0));

    gpuMat = glBuf.mapDevice();
    gpuMat.download(cpuImg);
    glBuf.unmapDevice();

    cv::imshow("test2",cpuImg);
    cv::waitKey(0);
    return 0;
}

glBuf的构造函数中的代码崩溃。调试发现glGenBuffers返回GLuint bufid 0. OpenCV断言失败。我猜有一些OpenGL初始化代码丢失了。我不知道是否

  • cv :: putText可以正常使用cv :: ogl :: Buffer。
  • 如何使cv :: ogl :: Buffer正常工作。

d)由于我在GPU中有一个解码帧,是否有其他简单的方法在图像上绘制文本,避免GPU和CPU之间的memcpy,以及GPU中两个不同的缓冲区?

感谢您的帮助

0 个答案:

没有答案