参考:https://github.com/QunShanHe/JLURoboVision#%E8%BF%90%E8%A1%8C%E5%B9%B3%E5%8F%B0%E6%90%AD%E5%BB%BA
先主要说下装甲板的一些东西,要不看后面的看不懂,这个看完在去看(一)。
然后先看一下这个Arrmor.h文件,这个文件里定义了各种参数和类,然后我们一步步看:
enum DetectorState
{
LIGHTS_NOT_FOUND = 0,
LIGHTS_FOUND = 1,
ARMOR_NOT_FOUND = 2,
ARMOR_FOUND = 3
};
这个是枚举:枚举是一种基本数据类型,它可以让数据更简洁,更易读。里面的数据类型都是我们自己定义的 DetectorState
struct ArmorParam{
int color_threshold; //color threshold for colorImg from substract channels 通道相减的colorImg使用的二值化阈值
int bright_threshold; //color threshold for brightImg 亮度图二值化阈值
float min_area; // min area of light bar 灯条允许的最小面积
float max_angle; //max angle of light bar 灯条允许的最大偏角
float max_angle_diff; //max angle difference between two light bars 两个灯条之间允许的最大角度差
float max_lengthDiff_ratio; //max length ratio difference between two light bars 两个灯条之间允许的最大长度差比值
float max_deviation_angle; //max deviation angle 两灯条最大错位角
float max_y_diff_ratio; //max y
float max_x_diff_ratio; //max x
//default values 给各参数设定默认值
ArmorParam(){
color_threshold = 100-20;
bright_threshold = 60;
min_area = 50;
max_angle = 45;
max_angle_diff = 6;
max_lengthDiff_ratio = 0.5;
max_deviation_angle = 50;
max_y_diff_ratio = 0.5;
max_x_diff_ratio = 4.5;
}
};
extern ArmorParam armorParam;
然后定义一个结构体来定义各种参数,最后用extern生成对象,但不分配内存空间,然后参数也给了默认值,这个上面写的很清楚了。
class LightBar
{
public:
LightBar();
/**
*@brief: Parametrical constructor of lightBar 灯条有参构造函数
*@param: RotatedRect created by fitellipse 拟合椭圆获得的旋转矩形来构造灯条
*/
LightBar(const RotatedRect& light);
~LightBar();
public:
RotatedRect lightRect; //rotation rect of light 灯条的旋转矩形(椭圆拟合获得)
float length; //length of light bar 灯条长度
Point2f center; //center of light bar 灯条中心
float angle; //angle of light bar(between length direction and vertical, left 0~90 right 0~-90) 灯条长度方向与竖直方向的夹角,左偏为0~90,右偏为0~-90
};
然后定义了一个灯条的类:然后这里面有他的属性,放倒了私有里面,然后有2个方法就是那两个函数(名一样但是参数不一样),我们看看这个函数:它写在lightbar.cpp里,函数不算难,不说了
LightBar::LightBar(){
lightRect = RotatedRect();
length = 0;
center = Point2f();
angle = 0;
}
LightBar::LightBar(const RotatedRect &lightRect){
this->lightRect = lightRect;
length = MAX(lightRect.size.height, lightRect.size.width);
center = lightRect.center;
if (lightRect.angle > 90)
angle = lightRect.angle - 180;
else
angle = lightRect.angle;
}
LightBar::~LightBar