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

關於如何編寫發送數據存疑

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