环境安装
参照 官方文档 中的 “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:
修改 [sink1],将 enable 改为 1:
执行命令:
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