deepstream开发问题汇总

1.OpenCV+Deepstream

1.1 Ubuntu18.04.2安装opencv

 安装时会报错。原因是需要重新安装编译ffmpeg。具体安装步骤和问题解决也请参考之前的博客
更新(2020.4.25)前几天电脑宕掉了,重装系统,包括opencv环境,发现再次重装还是在ffmpeg这里出现问题。最后就没有使用ffmpeg和opencv_contrib,编译通过了。

1.2 deepstream+opencv,opencv需要g++编译,编译不通过问题

  • deepstream是用C写的,g++编译会导致deepstream 很多底层库编译不通过,需要修改类型转换。即强制类型转换。如can convert gpointer to char*,就在对应的函数返回前或变量前强制数据转换,添加(char*)。
    如下面的malloc函数,如果不添加(char*),在C中不报错,在C++编译里会报错。
src_data = (char*) malloc(surface->surfaceList[frame_meta->batch_id].dataSize);
  • 其中如果存在两个枚举类型或的运算时,需要将两者括起来,再一起进行类型转换。
  • 遇到goto语句时,在C语言中,允许在标签前出现定义时赋值。但是在C++里,标签前的赋值一律都要单独赋值,不能定义时赋值。如 :
if()
//操作
goto done
int i=0;  //C中可行,C++ 报错
done:  //标签前出现定义时赋值
//操作

改写:

int i; //先定义
i=0;  //后赋值
done:

1.3 deepstream中调用opencv时需要内存转换

与探针添加在哪里无关。

  • 使用NvBufSurfaceMap类型获取数据
  • jetson上需要NvBufSurfaceMap()、NvBufSurfaceSyncForDevice() 或NvBufSurfaceSyncForCpu()。GPU上cudaMemcpy()。具体见之前总结的博客
#ifdef PLATFORM_TEGRA
    NvBufSurfaceMap (surface, -1, -1, NVBUF_MAP_READ);
    NvBufSurfacePlaneParams *pParams = &surface->surfaceList[frame_meta->batch_id].planeParams;
    unsigned int offset = 0;
    for(unsigned int num_planes=0; num_planes < pParams->num_planes; num_planes++){
        if(num_planes>0)
            offset += pParams->height[num_planes-1]*(pParams->bytesPerPix[num_planes-1]*pParams->width[num_planes-1]);
        for (unsigned int h = 0; h < pParams->height[num_planes]; h++) {
          memcpy((void *)(src_data+offset+h*pParams->bytesPerPix[num_planes]*pParams->width[num_planes]),
                (void *)((char *)surface->surfaceList[frame_meta->batch_id].mappedAddr.addr[num_planes]+h*pParams->pitch[num_planes]),
                pParams->bytesPerPix[num_planes]*pParams->width[num_planes]
                );
        }
    }
    NvBufSurfaceSyncForDevice (surface, -1, -1);
    NvBufSurfaceUnMap (surface, -1, -1);
#else
    cudaMemcpy((void*)src_data,
                (void*)surface->surfaceList[frame_meta->batch_id].dataPtr,
                surface->surfaceList[frame_meta->batch_id].dataSize,
                cudaMemcpyDeviceToHost);
#endif 

1.4 OpenCV图像保存时色彩的转换问题

test5中的色彩转换一直没调试通。
其他的可以查看NvBufSurfaceMap类型数据中的颜色类型字段,将之转换成BGR。
如果时RGBA转BGR,获取的原始数据mat,选择CV_8UC4,输出转换的mat类型选择CV_8UC3,调用cvtColor时的转换字段选择CV_RGBA2BGR

1.5 截图图像太大,图像压缩问题

每一张截图占用存储空间(本测试中)约为3~4M,而需保存大量截图,这势必会占用很多存储空间,所以进行了图像压缩。压缩后400kb左右,而效果与原视频肉眼看不出太大分别。具体做法就是调用opencv中的resize函数。

cv::resize(cvt_mat,out_mat,dsize,0,0,cv::INTER_AREA);  //重采样差值法进行图像压缩

参考opencv resize (C/C++/Python)

1.6 多路视频的独立保存(存疑)

参考DeepStream开发填坑记录第二条。

2. deepstream配置文件改写

也请参考之前写的博客

3. Deepstream+kafka

3.1 连接kafka命令行可以写成.sh文件,双击执行

#! /bin/bash

gnome-terminal  --tab "zookeeper" -- bash -c "cd ../Downloads/kafka_2.13-2.4.0/; bin/zookeeper-server-start.sh config/zookeeper.properties ;read"
 
gnome-terminal  --tab "kafka" -- bash -c "cd ../Downloads/kafka_2.13-2.4.0/; bin/kafka-server-start.sh config/server.properties ;read" 

gnome-terminal  --tab  "topic" -- bash -c "cd ../Downloads/kafka_2.13-2.4.0/; bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test ;bin/kafka-topics.sh --list --bootstrap-server localhost:9092 ;read"

gnome-terminal  --tab "consumer" -- bash -c "cd ../Downloads/kafka_2.13-2.4.0/; ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test ;read"

其中–tab是打开终端标签,这里开了四个标签页,分别是zookeeper服务,kafka服务,topic设置,以及设置消费者。(不能在一个终端页里写)。写成4个标签页,可以统一管理,避免开太多终端,后面不小心关掉其中某一个。
设置双击执行需执行一下操作:
(1)新建.sh文件

 touch test.sh

(2)编辑.sh文件
见上面的代码。
(3)给.sh文件赋权限

chmod +x test.sh 

(4)设置文件管理页
文件管理页配置
(5)设置文件properties
右击文件选择properties
在这里插入图片描述

3.2 kafka发送数据(存疑)

首先需要在配置文件的sink里更改。注意只能一个设置kafka,如果多个sink设置了kafka,则无效。,type要设为6

[sink4]
enable=1
#Type - 1=FakeSink 2=EglSink 3=File 4=UDPSink 5=nvoverlaysink 6=MsgConvBroker
type=6
msg-conv-config=dstest5_msgconv_sample_config.txt
#(0): PAYLOAD_DEEPSTREAM - Deepstream schema payload
#(1): PAYLOAD_DEEPSTREAM_MINIMAL - Deepstream schema payload minimal
#(256): PAYLOAD_RESERVED - Reserved type
#(257): PAYLOAD_CUSTOM   - Custom schema payload
msg-conv-payload-type=0
msg-broker-proto-lib=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_kafka_proto.so
#Provide your msg-broker-conn-str here
msg-broker-conn-str=localhost;9092;test
topic=test
#Optional:
#msg-broker-config=../../deepstream-test4/cfg_kafka.txt

关于如何编写发送数据存疑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章