Detection
本函数是整个识别函数的入口,同时也是核心函数
里面的逻辑较为简单,重要部分已经进行封装
vector<Armor> ArmorDetector::Detection(const cv::Mat &src)
{
//初始化清空所有容器
if(!numROIs.empty())numROIs.clear();
if(!finalArmors.empty())finalArmors.clear();
if(!candidateArmors.empty())candidateArmors.clear();
if(!candidateLights.empty())candidateLights.clear();
#ifdef SHOW_TIME
auto start = std::chrono::high_resolution_clock::now();
setImage(src);
auto end = std::chrono::high_resolution_clock::now();
auto duration = seconds_duration(end-start).count();
printf("set_time:%lf\n",duration);
start = std::chrono::high_resolution_clock::now();
findLights();
end = std::chrono::high_resolution_clock::now();
duration = seconds_duration(end-start).count();
printf("light_time:%lf\n",duration);
start = std::chrono::high_resolution_clock::now();
matchLights();
end = std::chrono::high_resolution_clock::now();
duration = seconds_duration(end-start).count();
printf("match_time:%lf\n",duration);
start = std::chrono::high_resolution_clock::now();
chooseTarget();
end = std::chrono::high_resolution_clock::now();
duration = seconds_duration(end-start).count();
printf("choose_time:%lf\n",duration);
#else
setImage(src);
findLights();
matchLights();
chooseTarget();
#endif
//返回最终装甲板
return finalArmors;
}
主体逻辑如下:
setImage(src);
findLights();
matchLights();
chooseTarget();
对函数先进行二值化,再进行灯条的匹配查询,对灯条两两配对,最后选出符号标准的装甲板
这里有一个 #ifdef SHOW_TIME 这个是宏定义的一种用法
是一个非常不错的调试手段,在这里面的代码是对每一个模块进行计时,输出时间
下面给出一个宏定义用法的示例程序:
#include <iostream>
#define PI 3.1415926
int main(){
std::cout << PI << std::endl;
}
上面是宏定义最基本的一种用法,用一个标识符来替代一些数值,比如圆周率就使用PI这种宏定义来替代
注意:宏定义的命名要求是全部大写
下面是宏定义的调试用法:
#include <iostream>
#define DEBUG
int main(){
#ifdef DEBUG
std::cout << "DEBUG_Status" << std::endl;
#else
std::cout << "NO_DEBUG_Status" << std::endl;
#endif
}
在 DEBUG 这个宏存在定义的时候,会进入第一段代码,输出 "DEBUG_Status"
否则会进入第二段代码,输出 "NO_DEBUG_Status"
在日常开发中,通过使用这种方法就可以在代码中穿插调试代码,不需要反复删除代码
同时在Cmake中支持编译阶段添加宏定义,具体部分请了解 Basic Tutoria_Cmake 基础教程