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 基础教程

results matching ""

    No results matching ""