SOMS/test/XuAilibTest/IObjectDetector.h
2024-07-15 10:31:26 +08:00

202 lines
3.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "vector"
#include <memory>
#include "string"
#include "opencv2/opencv.hpp"
#ifndef mymax
#define mymin(x,y) ((x) < (y) ? (x) : (y))
#define mymax(x,y) ((x) > (y) ? (x) : (y))
#endif // mymax
#ifndef _DetectorResult
#define _DetectorResult
struct DetectorResult
{
int image_id, label; //label 1 ¿ªÊ¼ 0 ±³¾°
char name[16];
float score;
int left, top, height, width;
bool overlap;
bool hasMask;
int area;
cv::Mat mask;
DetectorResult()
{
memset(name, 0, sizeof(name));
}
DetectorResult(int label, float left, float top, float width, float height, float score)
{
this->image_id = 0;
this->label = label;
this->left = left;
this->width = width;
this->top = top;
this->height = height;
this->score = score;
this->area = width * height;
}
DetectorResult(const DetectorResult& detectorResult)
{
this->image_id = detectorResult.image_id;
this->label = detectorResult.label;
strcpy_s(this->name, detectorResult.name);
this->left = detectorResult.left;
this->width = detectorResult.width;
this->top = detectorResult.top;
this->height = detectorResult.height;
this->score = detectorResult.score;
this->area = detectorResult.area;
this->overlap = detectorResult.overlap;
this->hasMask = detectorResult.hasMask;
if (!detectorResult.mask.empty())
this->mask = detectorResult.mask.clone();
}
void Offset(int offsetX, int offsetY)
{
left += offsetX;
top += offsetY;
}
void Scale(float scaleX, float scaleY)
{
left *= scaleX;
top *= scaleY;
width *= scaleX;
height *= scaleY;
}
void ScaleOffset(float scaleX, float scaleY, int offsetX, int offsetY)
{
Scale(scaleX, scaleY);
Offset(offsetX, offsetY);
}
void OffsetScale(int offsetX, int offsetY, float scaleX, float scaleY)
{
Offset(offsetX, offsetY);
Scale(scaleX, scaleY);
}
void Clip(int iMinX, int iMaxX, int iMinY, int iMaxY)
{
int right = left + width;
int bottom = top + height;
left = mymax(iMinX, left);
top = mymax(iMinY, top);
right = mymin(right, iMaxX);
bottom = mymin(bottom, iMaxY);
width = right - left;
height = bottom - top;
}
cv::Rect GetRect()
{
cv::Rect cvRect(left, top, width, height);
return cvRect;
}
};
#endif
#ifndef _FaultDetectResult
#define _FaultDetectResult
struct FaultDetectResult
{
int image_id, label; //label 1 ¿ªÊ¼ 0 ±³¾°
char name[16];
float score;
float value;
int left, top, height, width;
bool overlap;
bool hasMask;
cv::Mat mask;
FaultDetectResult()
{
}
FaultDetectResult(int label, float left, float top, float width, float height, float score)
{
this->image_id = 0;
this->label = label;
this->left = left;
this->width = width;
this->top = top;
this->height = height;
this->score = score;
}
void Offset(int offsetX, int offsetY)
{
left += offsetX;
top += offsetY;
}
void Scale(float scaleX, float scaleY)
{
left *= scaleX;
top *= scaleY;
width *= scaleX;
height *= scaleY;
}
void ScaleOffset(float scaleX, float scaleY, int offsetX, int offsetY)
{
Scale(scaleX, scaleY);
Offset(offsetX, offsetY);
}
void OffsetScale(int offsetX, int offsetY, float scaleX, float scaleY)
{
Offset(offsetX, offsetY);
Scale(scaleX, scaleY);
}
cv::Rect GetRect()
{
cv::Rect cvRect(left, top, width, height);
return cvRect;
}
};
#endif
#ifndef _SInferenceParams
#define _SInferenceParams
struct SInferenceParams
{
std::string init_net_pb, predict_net_pb;
int batchSize = 1;
int minSize = 800;
int maxSize = 1333;
float threshold = 0.5;
bool hasMask = true;
};
#endif
struct IObjectDetector
{
public:
virtual ~IObjectDetector() = default;
//³õʼ»¯¶ÔÏó
virtual bool Init() = 0;
//ÊͷŶÔÏó
virtual bool UnInit() = 0;
//»ñÈ¡¶ÔÏóÃû
virtual const char* GetType() = 0;
//Ö´ÐÐinfer
virtual bool Execute(cv::Mat& image) = 0;
//»ñÈ¡½á¹û
virtual bool GetResults(std::vector<DetectorResult>& vecDetectorResults) = 0;
};
float Iou(cv::Rect box1, cv::Rect box2);