add mot & tracking -> sot

This commit is contained in:
jario-jin 2023-08-14 11:33:02 +08:00
parent 01fb11377a
commit 52258249b9
19 changed files with 294 additions and 8 deletions

View File

@ -71,7 +71,7 @@ include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/gimbal_ctrl
${CMAKE_CURRENT_SOURCE_DIR}/algorithm/common_det/cuda
${CMAKE_CURRENT_SOURCE_DIR}/algorithm/landing_det/cuda
${CMAKE_CURRENT_SOURCE_DIR}/algorithm/tracking/ocv470
${CMAKE_CURRENT_SOURCE_DIR}/algorithm/sot/ocv470
${CMAKE_CURRENT_SOURCE_DIR}/algorithm/color_line
${CMAKE_CURRENT_SOURCE_DIR}/video_io
${CMAKE_CURRENT_SOURCE_DIR}/algorithm/ellipse_det
@ -111,7 +111,8 @@ set(
include/sv_algorithm_base.h
include/sv_common_det.h
include/sv_landing_det.h
include/sv_tracking.h
include/sv_sot.h
include/sv_mot.h
include/sv_color_line.h
include/sv_video_input.h
include/sv_video_output.h
@ -152,11 +153,12 @@ set(spirecv_SRCS
algorithm/ellipse_det/ellipse_detector.cpp
algorithm/common_det/sv_common_det.cpp
algorithm/landing_det/sv_landing_det.cpp
algorithm/tracking/sv_tracking.cpp
algorithm/sot/sv_sot.cpp
algorithm/mot/sv_mot.cpp
algorithm/color_line/sv_color_line.cpp
)
file(GLOB ALG_SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/algorithm/tracking/ocv470/*.cpp)
file(GLOB ALG_SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/algorithm/sot/ocv470/*.cpp)
list(APPEND spirecv_SRCS ${ALG_SRC_FILES})
file(GLOB ALG_SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/algorithm/color_line/*.cpp)
list(APPEND spirecv_SRCS ${ALG_SRC_FILES})
@ -249,6 +251,8 @@ add_executable(LandingMarkerDetection samples/demo/landing_marker_detection.cpp)
target_link_libraries(LandingMarkerDetection sv_world)
add_executable(SingleObjectTracking samples/demo/single_object_tracking.cpp)
target_link_libraries(SingleObjectTracking sv_world)
add_executable(MultipleObjectTracking samples/demo/multiple_object_tracking.cpp)
target_link_libraries(MultipleObjectTracking sv_world)
add_executable(ColorLineDetection samples/demo/color_line_detect.cpp)
target_link_libraries(ColorLineDetection sv_world)
add_executable(UdpDetectionInfoReceiver samples/demo/udp_detection_info_receiver.cpp)

98
algorithm/mot/sv_mot.cpp Normal file
View File

@ -0,0 +1,98 @@
#include "sv_mot.h"
#include <cmath>
#include <fstream>
#include "gason.h"
#include "sv_util.h"
namespace sv {
MultipleObjectTracker::MultipleObjectTracker()
{
this->_params_loaded = false;
}
MultipleObjectTracker::~MultipleObjectTracker()
{
}
void MultipleObjectTracker::track(cv::Mat img_, TargetsInFrame& tgts_)
{
if (!this->_params_loaded)
{
this->_load();
this->_params_loaded = true;
}
}
void MultipleObjectTracker::init()
{
if (!this->_params_loaded)
{
this->_load();
this->_params_loaded = true;
}
}
void MultipleObjectTracker::_load()
{
JsonValue all_value;
JsonAllocator allocator;
_load_all_json(this->alg_params_fn, all_value, allocator);
JsonValue tracker_params_value;
_parser_algorithm_params("MultipleObjectTracker", all_value, tracker_params_value);
for (auto i : tracker_params_value) {
if ("algorithm" == std::string(i->key)) {
this->_algorithm = i->value.toString();
std::cout << "algorithm: " << this->_algorithm << std::endl;
}
else if ("with_reid" == std::string(i->key)) {
if (i->value.getTag() == JSON_TRUE)
this->_with_reid = true;
else
this->_with_reid = false;
std::cout << "with_reid: " << this->_with_reid << std::endl;
}
else if ("reid_input_size" == std::string(i->key) && i->value.getTag() == JSON_ARRAY) {
int jcnt = 0;
for (auto j : i->value) {
if (jcnt == 0) {
this->_reid_input_w = j->value.toNumber();
}
if (jcnt == 1) {
this->_reid_input_h = j->value.toNumber();
}
jcnt += 1;
}
std::cout << "reid_input_w: " << this->_reid_input_w << std::endl;
std::cout << "reid_input_h: " << this->_reid_input_h << std::endl;
}
else if ("reid_num_samples" == std::string(i->key)) {
this->_reid_num_samples = i->value.toNumber();
std::cout << "reid_num_samples: " << this->_reid_num_samples << std::endl;
}
else if ("reid_match_thres" == std::string(i->key)) {
this->_reid_match_thres = i->value.toNumber();
std::cout << "reid_match_thres: " << this->_reid_match_thres << std::endl;
}
else if ("iou_thres" == std::string(i->key)) {
this->_iou_thres = i->value.toNumber();
std::cout << "iou_thres: " << this->_iou_thres << std::endl;
}
else if ("max_age" == std::string(i->key)) {
this->_max_age = i->value.toNumber();
std::cout << "max_age: " << this->_max_age << std::endl;
}
else if ("min_hits" == std::string(i->key)) {
this->_min_hits = i->value.toNumber();
std::cout << "min_hits: " << this->_min_hits << std::endl;
}
}
}
}

View File

@ -1,4 +1,4 @@
#include "tracking_ocv470_impl.h"
#include "sot_ocv470_impl.h"
#include <cmath>
#include <fstream>

View File

@ -1,7 +1,7 @@
#include "sv_tracking.h"
#include "sv_sot.h"
#include <cmath>
#include <fstream>
#include "tracking_ocv470_impl.h"
#include "sot_ocv470_impl.h"
namespace sv {

42
include/sv_mot.h Normal file
View File

@ -0,0 +1,42 @@
#ifndef __SV_MOT__
#define __SV_MOT__
#include "sv_core.h"
#include <opencv2/opencv.hpp>
#include <opencv2/aruco.hpp>
#include <opencv2/tracking.hpp>
#include <string>
#include <chrono>
namespace sv {
class MultipleObjectTracker : public CameraAlgorithm
{
public:
MultipleObjectTracker();
~MultipleObjectTracker();
void init();
void track(cv::Mat img_, TargetsInFrame& tgts_);
private:
void _load();
bool _params_loaded;
std::string _algorithm;
bool _with_reid;
int _reid_input_h;
int _reid_input_w;
int _reid_num_samples;
double _reid_match_thres;
double _iou_thres;
int _max_age;
int _min_hits;
};
}
#endif

View File

@ -4,7 +4,8 @@
#include "sv_core.h"
#include "sv_common_det.h"
#include "sv_landing_det.h"
#include "sv_tracking.h"
#include "sv_sot.h"
#include "sv_mot.h"
#include "sv_color_line.h"
#include "sv_video_input.h"
#include "sv_video_output.h"

View File

@ -116,6 +116,16 @@
"backend": 0,
"target": 0
},
"MultipleObjectTracker": {
"algorithm": "sort",
"with_reid": false,
"reid_input_size": [128, 128],
"reid_num_samples": 10,
"reid_match_thres": 2.0,
"iou_thres": 0.5,
"max_age": 10,
"min_hits": 3
},
"LandingMarkerDetector": {
"labels": ["h"],
"maxCandidates": 5

View File

@ -116,6 +116,16 @@
"backend": 0,
"target": 0
},
"MultipleObjectTracker": {
"algorithm": "sort",
"with_reid": false,
"reid_input_size": [128, 128],
"reid_num_samples": 10,
"reid_match_thres": 2.0,
"iou_thres": 0.5,
"max_age": 10,
"min_hits": 3
},
"LandingMarkerDetector": {
"labels": ["x", "h"],
"maxCandidates": 5

View File

@ -116,6 +116,16 @@
"backend": 0,
"target": 0
},
"MultipleObjectTracker": {
"algorithm": "sort",
"with_reid": false,
"reid_input_size": [128, 128],
"reid_num_samples": 10,
"reid_match_thres": 2.0,
"iou_thres": 0.5,
"max_age": 10,
"min_hits": 3
},
"LandingMarkerDetector": {
"labels": ["x", "h"],
"maxCandidates": 5

View File

@ -116,6 +116,16 @@
"backend": 0,
"target": 0
},
"MultipleObjectTracker": {
"algorithm": "sort",
"with_reid": false,
"reid_input_size": [128, 128],
"reid_num_samples": 10,
"reid_match_thres": 2.0,
"iou_thres": 0.5,
"max_age": 10,
"min_hits": 3
},
"LandingMarkerDetector": {
"labels": ["x", "h"],
"maxCandidates": 5

View File

@ -116,6 +116,16 @@
"backend": 0,
"target": 0
},
"MultipleObjectTracker": {
"algorithm": "sort",
"with_reid": false,
"reid_input_size": [128, 128],
"reid_num_samples": 10,
"reid_match_thres": 2.0,
"iou_thres": 0.5,
"max_age": 10,
"min_hits": 3
},
"LandingMarkerDetector": {
"labels": ["x", "h"],
"maxCandidates": 5

View File

@ -116,6 +116,16 @@
"backend": 0,
"target": 0
},
"MultipleObjectTracker": {
"algorithm": "sort",
"with_reid": false,
"reid_input_size": [128, 128],
"reid_num_samples": 10,
"reid_match_thres": 2.0,
"iou_thres": 0.5,
"max_age": 10,
"min_hits": 3
},
"LandingMarkerDetector": {
"labels": ["x", "h"],
"maxCandidates": 5

View File

@ -116,6 +116,16 @@
"backend": 0,
"target": 0
},
"MultipleObjectTracker": {
"algorithm": "sort",
"with_reid": false,
"reid_input_size": [128, 128],
"reid_num_samples": 10,
"reid_match_thres": 2.0,
"iou_thres": 0.5,
"max_age": 10,
"min_hits": 3
},
"LandingMarkerDetector": {
"labels": ["x", "h"],
"maxCandidates": 5

View File

@ -116,6 +116,16 @@
"backend": 0,
"target": 0
},
"MultipleObjectTracker": {
"algorithm": "sort",
"with_reid": false,
"reid_input_size": [128, 128],
"reid_num_samples": 10,
"reid_match_thres": 2.0,
"iou_thres": 0.5,
"max_age": 10,
"min_hits": 3
},
"LandingMarkerDetector": {
"labels": ["x", "h"],
"maxCandidates": 5

View File

@ -116,6 +116,16 @@
"backend": 0,
"target": 0
},
"MultipleObjectTracker": {
"algorithm": "sort",
"with_reid": false,
"reid_input_size": [128, 128],
"reid_num_samples": 10,
"reid_match_thres": 2.0,
"iou_thres": 0.5,
"max_age": 10,
"min_hits": 3
},
"LandingMarkerDetector": {
"labels": ["x", "h"],
"maxCandidates": 5

View File

@ -116,6 +116,16 @@
"backend": 0,
"target": 0
},
"MultipleObjectTracker": {
"algorithm": "sort",
"with_reid": false,
"reid_input_size": [128, 128],
"reid_num_samples": 10,
"reid_match_thres": 2.0,
"iou_thres": 0.5,
"max_age": 10,
"min_hits": 3
},
"LandingMarkerDetector": {
"labels": ["x", "h"],
"maxCandidates": 5

View File

@ -0,0 +1,41 @@
#include <iostream>
#include <string>
// 包含SpireCV SDK头文件
#include <sv_world.h>
using namespace std;
int main(int argc, char *argv[]) {
// 实例化
sv::MultipleObjectTracker mot;
// 手动导入相机参数如果使用Amov的G1等吊舱或相机则可以忽略该步骤将自动下载相机参数文件
mot.loadCameraParams(sv::get_home() + "/SpireCV/calib_webcam_640x480.yaml");
// 打开摄像头
sv::Camera cap;
// cap.setWH(640, 480);
// cap.setFps(30);
cap.open(sv::CameraType::WEBCAM, 0); // CameraID 0
// 实例化OpenCV的Mat类用于内存单帧图像
cv::Mat img;
int frame_id = 0;
while (1)
{
// 实例化SpireCV的 单帧检测结果 接口类 TargetsInFrame
sv::TargetsInFrame tgts(frame_id++);
// 读取一帧图像到img
cap.read(img);
cv::resize(img, img, cv::Size(mot.image_width, mot.image_height));
// 执行通用目标检测
mot.track(img, tgts);
// 可视化检测结果叠加到img上
sv::drawTargetsInFrame(img, tgts);
// 显示检测结果img
cv::imshow("img", img);
cv::waitKey(10);
}
return 0;
}