cnstream pipeline啟動到準備資料過程的原始碼學習筆記(二):osd模組
本文是對cnstream程式碼的學習筆記
git程式碼 :https://github.com/Cambricon/CNStream
寒武紀開發者論壇: http://forum.cambricon.com/list-47-1.html
1 簡介osd模組
這個模組主要是將檢測和追蹤結果疊加在原圖上的。
2 對外介面
Osd類繼承了Module和ModuleCreate類,它的公有介面有四個。
bool Open(cnstream::ModuleParamSet paramSet) override; void Close() override; int Process(std::shared_ptr<CNFrameInfo> data) override; bool CheckParamSet(const ModuleParamSet& paramSet) const override;
3 與pipeline的關係
建立了一個pipeline物件後,我們呼叫bool Pipeline::Start() 會呼叫到介面 bool Open(cnstream::ModuleParamSet paramSet) override; ,主要作用是更新osd的一些私有變數,比如變數labels_它儲存了標籤的名稱;secondary_labels_儲存了次要標籤的名稱;chinese_label_flag_設定是否有中文標籤;attr_keys_設定?;label_size_設定標籤的大小;還有text_scale_、 text_thickness_、 box_thickness_ 、logo_;
最後pipeline關閉會呼叫到 void Close() override; 介面。
4 Process介面
Osd引入了CnoSd這個類,在osd內部有一個叫osd_ctxs_的map來儲存cnosd類,也就是一個osd模組物件為每一個執行緒分配一個cnosd。
cnosd初始化主要是根據labels_的大小設定了colors_,std::vector<cv::Scalar> colors; 這是一個儲存隨機rgb顏色的陣列。具體生成隨機顏色的方法[https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/],也就是為每個labels設定一個不同的顏色。同時通過這個類可以設定文件的顏色、標籤框大小、標籤的層數和標籤框層數等等。
最重要的是這個類實現了在影象上畫標籤、畫logo的功能:
void DrawLabel(cv::Mat *image, const CNObjsVec& objects, std::vector<std::string> attr_keys = {}) const; void DrawLogo(cv::Mat *image, std::string logo) const;
5 一些資料結構
- stream_count_map_
一個全域性的map std::unordered_map<std::string, int> CNFrameInfo::stream_count_map_; 用來標識某路資料流生成了幾個CNFrameInfo。
- CNFrameInfo
這是Module之間傳遞的資料結構,主要記錄了資料屬於哪一路視訊流,資料幀的時間戳和儲存自定義資料的map(命名為datas)等。
public:
std::string stream_id; ///< The data stream aliases where this frame is located to. int64_t timestamp = -1; ///< The time stamp of this frame. size_t flags = 0; ///< The mask for this frame, ``CNFrameFlag``. // user-defined DataFrame,InferResult etc... std::unordered_map<int, any> datas; mutable uint32_t channel_idx = INVALID_STREAM_IDX; ///< The index of the channel, stream_index
private: SpinLock mask_lock_; /*The mask map of the module. It identifies which modules the data can already be processed by.*/ std::unordered_map<unsigned int, uint64_t> module_mask_map_; SpinLock eos_lock_; uint64_t eos_mask = 0;
- CNDataFrame
這是上面自定義資料結構支援的一種,用於存放視訊幀資料。
- CNInferObject
也是上面自定義資料結構支援的一種,用於存放神經網路推理結果。