Files
ANSCustomModels/ANSCustomWeaponDetection/ANSCustomCodeWeaponDetection.h

91 lines
3.8 KiB
C
Raw Normal View History

#include "ANSLIB.h"
#define RETAINFRAMES 80
#define FILTERFRAMES 10
class CUSTOM_API ANSCustomWD : public IANSCustomClass
{
struct ImageSection {
cv::Rect region;
int priority;
ImageSection(const cv::Rect& r) : region(r), priority(0) {}
};
private:
using ANSLIBPtr = std::unique_ptr<ANSCENTER::ANSLIB, decltype(&ANSCENTER::ANSLIB::Destroy)>;
ANSLIBPtr _detector{ nullptr, &ANSCENTER::ANSLIB::Destroy };
ANSLIBPtr _filter{ nullptr, &ANSCENTER::ANSLIB::Destroy };
int engineType;
std::string _detectorModelName;
std::string _detectorClassName;
int _detectorModelType; // Assuming 4 represents TensorRT YoloV11
int _detectorDetectionType; // Assuming 1 represents object detection
std::string _filterModelName;
std::string _filterClassName;
std::string _filterLabelMap;
int _filterModelType; // Assuming 1 represents OpenVINO YoloV12
int _filterDetectionType; // Assuming 1 represents object detection
std::recursive_mutex _mutex;
cv::Rect _detectedArea;// Area where weapon is detected
int _retainDetectedArea{ 0 };
bool _isWeaponDetected{ false };
float _detectionScoreThreshold{ 0.5 };
cv::Size previousImageSize = cv::Size(0, 0);
std::vector<ImageSection> cachedSections;
int _currentPriority{ 0 }; // None
int _realWeaponCheck{ 0 };
bool _isRealWeaponFrame{ false };
void UpdateNoDetectionCondition();
std::vector<ANSCENTER::Object> RunFilterGetPersons(const cv::Mat& frame);
// Function to seperate screen size
double calculateDistanceToCenter(const cv::Point& center, const cv::Rect& rect);
std::vector<ImageSection> divideImage(const cv::Mat& image);
int getHighestPriorityRegion();
int getLowestPriorityRegion();
cv::Rect getRegionByPriority(int priority);
// Utilities
float calculateIoU(const cv::Rect& box1, const cv::Rect& box2);
bool IsOverlapping(const ANSCENTER::Object& obj, const std::vector<ANSCENTER::Object>& objectList, float iouThreshold);
void UpdateActiveROI(const cv::Mat& frame, ANSCENTER::Object detectedObj);
std::vector<ANSCENTER::Object> ProcessExistingDetectedArea(
const cv::Mat& frame, const std::string& camera_id
#ifdef FNS_DEBUG
, cv::Mat& draw
#endif
);
bool ProcessWeaponDetection(
const cv::Mat& frame,
ANSCENTER::Object& detectedObj,
std::vector<ANSCENTER::Object>& output,
const std::vector<ANSCENTER::Object>& personDetections,
bool filterHadResults
#ifdef FNS_DEBUG
, cv::Mat& draw
#endif
);
void AddConfirmedWeaponDetection(
const cv::Mat& frame,
ANSCENTER::Object& detectedObj,
std::vector<ANSCENTER::Object>& output);
void ProcessNewDetectedArea(
const cv::Mat& frame,
const std::string& camera_id,
std::vector<ANSCENTER::Object>& output
#ifdef FNS_DEBUG
, cv::Mat& draw
#endif
);
void UpdateDetectedAreaFromObject(const cv::Mat& frame, const ANSCENTER::Object& detectedObj);
public:
bool Initialize(const std::string& modelDiretory,float detectionScoreThreshold, std::string& labelMap)override;
bool OptimizeModel(bool fp16)override;
std::vector<CustomObject> RunInference(const cv::Mat& input)override;
std::vector<CustomObject> RunInference(const cv::Mat& input, const std::string& camera_id)override;
bool Destroy()override;
virtual bool ConfigureParameters(CustomParams& param) override;
ANSCustomWD();
~ANSCustomWD();
};