|
@@ -4,7 +4,7 @@
|
|
|
* @Autor: lishengyin
|
|
|
* @Date: 2022-03-09 10:58:34
|
|
|
* @LastEditors: lishengyin
|
|
|
- * @LastEditTime: 2022-09-09 17:07:34
|
|
|
+ * @LastEditTime: 2022-09-21 14:14:27
|
|
|
*/
|
|
|
#include "InfineFilter.hpp"
|
|
|
|
|
@@ -32,6 +32,8 @@ namespace gsd
|
|
|
// 过滤小目标
|
|
|
MinBBoxFilter(cnStreamInferData);
|
|
|
|
|
|
+ int result1;
|
|
|
+ int result2;
|
|
|
switch (filterLevel)
|
|
|
{
|
|
|
case 0:
|
|
@@ -41,12 +43,15 @@ namespace gsd
|
|
|
result = this->LastOneJudgment(cnStreamInferData);
|
|
|
break;
|
|
|
case 2:
|
|
|
- result = (this->IntervalJudgment() == OK && this->LastOneJudgment(cnStreamInferData) == OK ? OK : ERR);
|
|
|
+ result1 = this->IntervalJudgment();
|
|
|
+ result2 = this->LastOneJudgment(cnStreamInferData);
|
|
|
+ result = (result1 == OK && result2 == OK ? OK : ERR);
|
|
|
break;
|
|
|
case 3:
|
|
|
result = this->LastOneJudgment(cnStreamInferData);
|
|
|
if(result == ERR) break;
|
|
|
this->SimilarityJudgment(cnStreamInferData);
|
|
|
+ if(cnStreamInferData->Objects.size() == 0) result = ERR;
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
@@ -135,6 +140,7 @@ namespace gsd
|
|
|
*/
|
|
|
int8_t InfineFilter::LastOneJudgment(std::shared_ptr<CNStreamInferData>& cnStreamInferData){
|
|
|
static std::shared_ptr<CNStreamInferData> old = nullptr;
|
|
|
+ if(cnStreamInferData->Objects.size() == 0) return OK;
|
|
|
if(old == nullptr) {
|
|
|
old = cnStreamInferData;
|
|
|
return OK;
|
|
@@ -150,11 +156,11 @@ namespace gsd
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if(num == old->Objects.size()) {
|
|
|
+ if(num == old->Objects.size() && num != 0) {
|
|
|
return ERR;
|
|
|
}
|
|
|
}
|
|
|
- old = cnStreamInferData;
|
|
|
+ if(cnStreamInferData->Objects.size() != 0) old = cnStreamInferData;
|
|
|
return OK;
|
|
|
}
|
|
|
|
|
@@ -242,7 +248,7 @@ namespace gsd
|
|
|
* @return {*}
|
|
|
*/
|
|
|
int8_t InfineFilter::SimilarityJudgment(std::shared_ptr<CNStreamInferData>& cnStreamInferData){
|
|
|
- //this->SimilarityCheck();
|
|
|
+ this->SimilarityCheck();
|
|
|
auto task = [&](){
|
|
|
HistoryData historyData;
|
|
|
historyData.CnStreamInferData = std::make_shared<CNStreamInferData>();
|
|
@@ -262,6 +268,7 @@ namespace gsd
|
|
|
auto iter_front = LatestDatas.front();
|
|
|
vector<vector<InferInfo>::iterator> result;
|
|
|
bool IsResult = false;
|
|
|
+
|
|
|
// 对比前两帧
|
|
|
for(auto iter = cnStreamInferData->Objects.begin(); iter != cnStreamInferData->Objects.end(); iter++){
|
|
|
IsResult = false;
|
|
@@ -315,6 +322,84 @@ namespace gsd
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * @description: 相似库对比
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ int8_t InfineFilter::SimilarityResult(std::shared_ptr<CNStreamInferData>& cnStreamInferData){
|
|
|
+ static queue<HistoryData> nx_latestDatas;
|
|
|
+ auto task = [&](){
|
|
|
+ HistoryData historyData;
|
|
|
+ historyData.CnStreamInferData = std::make_shared<CNStreamInferData>();
|
|
|
+ historyData.CnStreamInferData->StreamName = cnStreamInferData->StreamName;
|
|
|
+ historyData.CnStreamInferData->FrameCount = cnStreamInferData->FrameCount;
|
|
|
+ historyData.CnStreamInferData->width = cnStreamInferData->width;
|
|
|
+ historyData.CnStreamInferData->height = cnStreamInferData->height;
|
|
|
+ historyData.CnStreamInferData->Objects = cnStreamInferData->Objects;
|
|
|
+ historyData.CnStreamInferData->videoPath = cnStreamInferData->videoPath;
|
|
|
+ nx_latestDatas.push(historyData);
|
|
|
+ if(nx_latestDatas.size() >= 3) nx_latestDatas.pop();
|
|
|
+ };
|
|
|
+ vector<vector<InferInfo>::iterator> result;
|
|
|
+ if(nx_latestDatas.empty()){
|
|
|
+ task();
|
|
|
+ if(this->SimilarityDatas.empty()) return OK;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ bool IsResult = false;
|
|
|
+ auto iter_front = nx_latestDatas.front();
|
|
|
+ for(auto iter = cnStreamInferData->Objects.begin(); iter != cnStreamInferData->Objects.end(); iter++){
|
|
|
+ IsResult = false;
|
|
|
+ for(auto iter1 : iter_front.CnStreamInferData->Objects){
|
|
|
+ if(CalculateSimilarity(*iter, iter1, cnStreamInferData) == OK){
|
|
|
+ SimilarityData data;
|
|
|
+ data.ticker = std::make_shared<Ticker>();
|
|
|
+ data.info = *iter;
|
|
|
+ this->SimilarityDatas.push_back(data);
|
|
|
+ result.push_back(iter);
|
|
|
+ IsResult = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(IsResult) continue;
|
|
|
+ if(nx_latestDatas.size() <= 1) continue;
|
|
|
+ auto iter_back = nx_latestDatas.back();
|
|
|
+ for(auto iter1 : iter_back.CnStreamInferData->Objects){
|
|
|
+ if(CalculateSimilarity(*iter, iter1, cnStreamInferData) == OK){
|
|
|
+ SimilarityData data;
|
|
|
+ data.ticker = std::make_shared<Ticker>();
|
|
|
+ data.info = *iter;
|
|
|
+ this->SimilarityDatas.push_back(data);
|
|
|
+ result.push_back(iter);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for(auto iter = result.begin(); iter != result.end(); iter++){
|
|
|
+ cnStreamInferData->Objects.erase(*iter);
|
|
|
+ }
|
|
|
+ result.clear();
|
|
|
+ task();
|
|
|
+ }
|
|
|
+ if(this->SimilarityDatas.empty()) return OK;
|
|
|
+ for(auto iter = cnStreamInferData->Objects.begin(); iter != cnStreamInferData->Objects.end(); iter++){
|
|
|
+ for(auto iter1 = this->SimilarityDatas.begin(); iter1 != this->SimilarityDatas.end(); iter1++){
|
|
|
+ if(CalculateSimilarity(*iter, iter1->info, cnStreamInferData) == OK){
|
|
|
+ iter1->info = *iter;
|
|
|
+ iter1->ticker->resetTime();
|
|
|
+ result.push_back(iter);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(result.empty()) return OK;
|
|
|
+ // clear
|
|
|
+ for(auto iter = result.begin(); iter != result.end(); iter++){
|
|
|
+ cnStreamInferData->Objects.erase(*iter);
|
|
|
+ }
|
|
|
+ return OK;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* @description: 时间对比
|
|
|
* @return {*}
|
|
|
*/
|