我正在为一个项目工作,计划这样做:
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初始化代码丢失了。我不知道是否
d)由于我在GPU中有一个解码帧,是否有其他简单的方法在图像上绘制文本,避免GPU和CPU之间的memcpy,以及GPU中两个不同的缓冲区?
感谢您的帮助