From ba85a1e27fc0e71aacd1dd3939b3e00f298f8e66 Mon Sep 17 00:00:00 2001 From: sun Date: Fri, 5 Jul 2019 16:34:03 +0800 Subject: [PATCH] energy changed --- energy/include/energy/constant.h | 16 ----- energy/include/energy/energy.h | 2 +- energy/include/energy/param_struct_define.h | 68 ++++++++++-------- energy/src/energy/run.cpp | 5 +- main.cpp | 78 +++++++++++++++------ others/include/additions/additions.h | 4 ++ others/src/additions/additions.cpp | 1 - 7 files changed, 105 insertions(+), 69 deletions(-) diff --git a/energy/include/energy/constant.h b/energy/include/energy/constant.h index ea661e9..08ca61d 100644 --- a/energy/include/energy/constant.h +++ b/energy/include/energy/constant.h @@ -18,28 +18,12 @@ const double PI = 3.1415926; const int CLOCKWISE = 1; const int ANTICLOCKWISE = -1; const float ATTACK_DISTANCE = 718;//cm -const double WHOLE_FAN = 80;//cm const double ARMOR_CENTER_TO_CYCLE_CENTER = 75;//cm -//const double ARMOR_CENTER_TO_CYCLE_CENTER = 71;//cm const int EXTRACT_POINT_X = 120; const int EXTRACT_POINT_Y = 0; const int EXTRACT_WIDTH = 400; const int EXTRACT_HEIGHT = 300; -//以摄像头正方向位y轴 -const int GM_L = 14;//云台摄像头z方向 -const int GM_X = 15;//云台摄像头x方向 -const int GM_H = 16;//云台摄像头y方向 - -//const double STRETCH = 231.0/640.0;//实际距离与图像伸缩比 -const double STRETCH = 0.34; - -const int ZERO_POINT_X = 281; -const int ZERO_POINT_Y = 188; -const double YAW_ORIGIN_RAD = PI/180*2.25; -const double PITCH_ORIGIN_RAD = PI/180*14.85; - -const double LIFT_HEIGHT = 20;//云台抬升高度 #endif //CONSTANT_H diff --git a/energy/include/energy/energy.h b/energy/include/energy/energy.h index a358a2d..7551947 100644 --- a/energy/include/energy/energy.h +++ b/energy/include/energy/energy.h @@ -25,7 +25,7 @@ class Energy { public: Energy(Serial &u, uint8_t &color);//构造函数,参数为串口和敌方颜色 ~Energy();//默认析构函数 - int run(cv::Mat &src); + int run(cv::Mat &gimble_src, cv::Mat &base_src); Serial &serial;//串口 void setEnergyRotationInit();//判断顺逆时针函数 void extract(cv::Mat &src);//框取图像中的一块区域进行处理 diff --git a/energy/include/energy/param_struct_define.h b/energy/include/energy/param_struct_define.h index 587f05c..3e6f3b1 100644 --- a/energy/include/energy/param_struct_define.h +++ b/energy/include/energy/param_struct_define.h @@ -10,6 +10,11 @@ using std::vector; + + +//---------------------------------------------------------------------------------------------------------------------- +// 此结构体为能量机关模块的结构体,用于寻找矩形轮廓 +// --------------------------------------------------------------------------------------------------------------------- struct EnergyPart { cv::RotatedRect rect; float angle; @@ -21,40 +26,45 @@ struct EnergyPart { }; }; + + +//---------------------------------------------------------------------------------------------------------------------- +// 此结构体包括能量机关参数 +// --------------------------------------------------------------------------------------------------------------------- struct EnergyPartParam { - int GRAY_THRESH; - int SPLIT_GRAY_THRESH; - int FAN_GRAY_THRESH; - int ARMOR_GRAY_THRESH; + int GRAY_THRESH;//二值化阈值 + int SPLIT_GRAY_THRESH;//通道分离二值化阈值 + int FAN_GRAY_THRESH;//扇叶识别二值化阈值 + int ARMOR_GRAY_THRESH;//装甲板识别二值化阈值 - long FAN_CONTOUR_AREA_MAX; - long FAN_CONTOUR_AREA_MIN; - long FAN_CONTOUR_LENGTH_MIN; - long FAN_CONTOUR_LENGTH_MAX; - long FAN_CONTOUR_WIDTH_MIN; - long FAN_CONTOUR_WIDTH_MAX; - float FAN_CONTOUR_HW_RATIO_MAX; - float FAN_CONTOUR_HW_RATIO_MIN; + long FAN_CONTOUR_AREA_MAX;//扇叶面积最大值 + long FAN_CONTOUR_AREA_MIN;//扇叶面积最小值 + long FAN_CONTOUR_LENGTH_MIN;//扇叶长边长度最小值 + long FAN_CONTOUR_LENGTH_MAX;//扇叶长边长度最大值 + long FAN_CONTOUR_WIDTH_MIN;//扇叶宽边长度最小值 + long FAN_CONTOUR_WIDTH_MAX;//扇叶宽边长度最大值 + float FAN_CONTOUR_HW_RATIO_MAX;//扇叶长宽比最大值 + float FAN_CONTOUR_HW_RATIO_MIN;//扇叶长宽比最小值 - long ARMOR_CONTOUR_AREA_MAX; - long ARMOR_CONTOUR_AREA_MIN; - long ARMOR_CONTOUR_LENGTH_MIN; - long ARMOR_CONTOUR_WIDTH_MIN; - long ARMOR_CONTOUR_LENGTH_MAX; - long ARMOR_CONTOUR_WIDTH_MAX; - float ARMOR_CONTOUR_HW_RATIO_MAX; - float ARMOR_CONTOUR_HW_RATIO_MIN; + long ARMOR_CONTOUR_AREA_MAX;//装甲板面积最大值 + long ARMOR_CONTOUR_AREA_MIN;//装甲板面积最小值 + long ARMOR_CONTOUR_LENGTH_MIN;//装甲板长边长度最小值 + long ARMOR_CONTOUR_WIDTH_MIN;//装甲板长边长度最大值 + long ARMOR_CONTOUR_LENGTH_MAX;//装甲板宽边长度最小值 + long ARMOR_CONTOUR_WIDTH_MAX;//装甲板宽边长度最大值 + float ARMOR_CONTOUR_HW_RATIO_MAX;//装甲板长宽比最大值 + float ARMOR_CONTOUR_HW_RATIO_MIN;//装甲板长宽比最小值 - long CENTER_R_CONTOUR_AREA_MAX; - long CENTER_R_CONTOUR_AREA_MIN; - long CENTER_R_CONTOUR_LENGTH_MIN; - long CENTER_R_CONTOUR_WIDTH_MIN; - long CENTER_R_CONTOUR_LENGTH_MAX; - long CENTER_R_CONTOUR_WIDTH_MAX; - float CENTER_R_CONTOUR_HW_RATIO_MAX; - float CENTER_R_CONTOUR_HW_RATIO_MIN; + long CENTER_R_CONTOUR_AREA_MAX;//风车中心R面积最大值 + long CENTER_R_CONTOUR_AREA_MIN;//风车中心R面积最小值 + long CENTER_R_CONTOUR_LENGTH_MIN;//风车中心R长边长度最小值 + long CENTER_R_CONTOUR_WIDTH_MIN;//风车中心R长边长度最大值 + long CENTER_R_CONTOUR_LENGTH_MAX;//风车中心R宽边长度最小值 + long CENTER_R_CONTOUR_WIDTH_MAX;//风车中心R宽边长度最大值 + float CENTER_R_CONTOUR_HW_RATIO_MAX;//风车中心R长宽比最大值 + float CENTER_R_CONTOUR_HW_RATIO_MIN;//风车中心R长宽比最小值 - float TWIN_ANGEL_MAX; + float TWIN_ANGEL_MAX;//扇叶和装甲板匹配时极坐标角度差的最大值 }; diff --git a/energy/src/energy/run.cpp b/energy/src/energy/run.cpp index 915ab0e..fd0682b 100644 --- a/energy/src/energy/run.cpp +++ b/energy/src/energy/run.cpp @@ -14,7 +14,10 @@ using std::vector; //---------------------------------------------------------------------------------------------------------------------- // 此函数为能量机关模式主控制流函数 // --------------------------------------------------------------------------------------------------------------------- -int Energy::run(cv::Mat &src){ +int Energy::run(cv::Mat &gimble_src, cv::Mat &base_src){ + + cv::Mat src = gimble_src; + // imshow("src",src); fans.clear(); armors.clear(); diff --git a/main.cpp b/main.cpp index c989982..eec46a4 100644 --- a/main.cpp +++ b/main.cpp @@ -20,16 +20,13 @@ #include -#define ENERGY_STATE 'e' -#define ARMOR_STATE 'a' - using namespace cv; using namespace std; mcu_data mcuData = { 0, 0, - ENERGY_STATE, + BIG_ENERGY_STATE, 0, 1, ENEMY_RED, @@ -101,26 +98,28 @@ int main(int argc, char *argv[]) { cout<<"start running"<read(energy_src); + if (video_armor && video_energy) { + ok = video_armor->read(armor_src) && video_energy->read(energy_src); if (!ok) { + delete video_armor; delete video_energy; + video_armor = nullptr; video_energy = nullptr; } if(save_video){ Mat energy_save = energy_src.clone(); cvtColor(energy_save,energy_save,COLOR_GRAY2BGR); + armor_video_writer.write(armor_src); energy_video_writer.write(energy_save); -// cout<init()){ delete video_energy; video_energy = nullptr; } } + } - } else if (mcuData.state == ARMOR_STATE) { - last_state = mcuData.state; + else if (mcuData.state == SMALL_ENERGY_STATE) { + last_state = mcuData.state; + if (video_armor && video_energy) { + ok = video_armor->read(armor_src) && video_energy->read(energy_src); + if (!ok) { + delete video_armor; + delete video_energy; + video_armor = nullptr; + video_energy = nullptr; + } + if(save_video){ + Mat energy_save = energy_src.clone(); + cvtColor(energy_save,energy_save,COLOR_GRAY2BGR); + armor_video_writer.write(armor_src); + energy_video_writer.write(energy_save); + } + if (show_origin) { + imshow("armor src", armor_src); + imshow("energy src", energy_src); + } +// if (from_camera == 0) { +// cv::resize(energy_src, energy_src, cv::Size(640, 480), 2); +// imshow("resize", energy_src); +// energy.extract(energy_src); +// } + energy.run(armor_src, energy_src); + waitKey(1); + } + else { + video_energy = new CameraWrapper(1, "energy"); + if(!video_energy->init()){ + delete video_energy; + video_energy = nullptr; + } + } + } + + else if (mcuData.state == ARMOR_STATE) { + last_state = mcuData.state; if (video_armor) { ok = video_armor->read(armor_src); if (!ok) { @@ -148,17 +186,16 @@ int main(int argc, char *argv[]) { } if(save_video){ armor_video_writer.write(armor_src); -// cout<init()){ delete video_armor; @@ -166,8 +203,7 @@ int main(int argc, char *argv[]) { } } } -// cout< 1) std::string video_name = filename_prefix + std::to_string(cnt) + ".avi"; } -