目錄
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
關於如何編寫發送數據存疑