Ubuntu18.04.3 安装 Nvidia DeepStream 并在 P4 显卡上解码取帧存图

环境安装

参照 官方文档 中的 “dGPU Setup” 部分即可。

我的环境:

①Ubuntu 18.04.3;
②Gstreamer 1.14.5;
③NVIDIA driver 418.87.00;
④CUDA 10.1;
⑤TensorRT 5.1.5;
⑥DeepStream SDK 4.0.1;
⑦P4 显卡。
本文涉及取帧存图,用的是OpenCV,故也安装了OpenCV,版本3.4.4,安装参照 这里

deepstream-app 命令

这里只进行简单的测试。
测试文件:deepstream_sdk_v4.0.1_x86_64/samples/configs/deepstream-app/source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt。
修改 [sink0],将 enable 改为 0:
sink0
修改 [sink1],将 enable 改为 1:
sink1
执行命令:

deepstream-app -c source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt

我这会报 “Internal data stream error.” 错误,因为主要不是使用 deepstream-app 命令,故不深究。
PS1:在 DeepStream2 中跑不会有问题。
PS2:把 [sink1] 的 type 改成 1,表示使用 Fakesink,是可以避免这个错误的。

解码取帧存图

使用到例子:deepstream_sdk_v4.0.1_x86_64/sources/apps/sample_apps/deepstream-test1/ 。

make
./deepstream-test1-app ../../../../samples/streams/sample_720p.h264

我这会报 “ERROR from element primary-nvinference-engine: Internal data stream error.” 错误。
在 deepstream_test1_app.c 文件中找到:

sink = gst_element_factory_make ("nveglglessink", "nvvideo-renderer");

将其改为:

sink = gst_element_factory_make ("fakesink", "nvvideo-renderer");

表示使用 Fakesink,这对我的需求无影响(可以看看 这里,有我的回复,我的用户名为 “alpaserss”)。再次:

make
./deepstream-test1-app ../../../../samples/streams/sample_720p.h264

我这成功了,然后就是要取帧存图了,先直接参照官方论坛,看看 这里
当然是会报错的,这是我在上面的回复:
在这里插入图片描述
暂时还没人回复我,所以要自己探索咯。
试了很多方法,最后解决了,基本思想就是:删掉 nvosd,在 nvvidconv 的 src 上或在 sink 的 sink 上通过 gst_pad_add_probe 函数添加 probe,然后再 probe 回调中处理帧。
好吧,上面那句话我自己都看不懂,有点表达不清,所以直接上码,看代码大家就懂了。

#include <gst/gst.h>
#include <glib.h>
#include <stdio.h>
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include <vector>
#include "gstnvdsmeta.h"
#include "nvbufsurface.h"
#include "nvbufsurftransform.h"
using namespace std;
using namespace cv;

#define MAX_DISPLAY_LEN 64

#define PGIE_CLASS_ID_VEHICLE 0
#define PGIE_CLASS_ID_PERSON 2

#define MUXER_OUTPUT_WIDTH 1920
#define MUXER_OUTPUT_HEIGHT 1080

#define MUXER_BATCH_TIMEOUT_USEC 4000000

gint frame_number = 0;
gchar pgie_classes_str[4][32] = {
    "Vehicle", "TwoWheeler", "Person",
  "Roadsign"
};


static void createAlphaMat(Mat &mat)
{
   
 CV_Assert(mat.channels() == 4);
 for (int i = 0; i < mat.rows; ++i) {
   
 for (int j = 0; j < mat.cols; ++j) {
   
 Vec4b& bgra = mat.at<Vec4b>(i, j);
            bgra[0] = UCHAR_MAX; // Blue
            bgra[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Green
            bgra[2] = saturate_cast<uchar>((float 
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值