From 49cc1e242e06bbc7b051f68a410dd735762ecc96 Mon Sep 17 00:00:00 2001 From: xinyang <895639507@qq.com> Date: Mon, 8 Jul 2019 21:53:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E5=88=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 14 +--- armor/include/armor_finder/armor_finder.h | 84 +++++++++---------- armor/include/show_images/show_images.h | 3 +- armor/src/armor_finder/armor_finder.cpp | 25 +++--- .../image_process.cpp | 0 .../image_process.h | 0 .../searching_state/searching_state.cpp | 29 +++---- .../standby_state/standby_state.cpp | 0 .../tracking_state/tracking_state.cpp | 0 armor/src/show_images/show_images.cpp | 13 +++ energy/include/energy/constant.h | 1 - energy/include/energy/energy.h | 1 + main.cpp | 9 +- others/include/additions/additions.h | 9 -- others/include/constants.h | 17 ++++ others/src/additions/additions.cpp | 6 +- 16 files changed, 109 insertions(+), 102 deletions(-) rename armor/src/armor_finder/{state_machine/searching_state/image_process => searching_state}/image_process.cpp (100%) rename armor/src/armor_finder/{state_machine/searching_state/image_process => searching_state}/image_process.h (100%) rename armor/src/armor_finder/{state_machine => }/searching_state/searching_state.cpp (93%) rename armor/src/armor_finder/{state_machine => }/standby_state/standby_state.cpp (100%) rename armor/src/armor_finder/{state_machine => }/tracking_state/tracking_state.cpp (100%) create mode 100644 others/include/constants.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e54c7c9..a465f8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,11 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.5) -PROJECT(AutoAim) +PROJECT(SJTU-RM-CV) SET(CMAKE_CXX_STANDARD 11) SET(CMAKE_BUILD_TYPE RELEASE) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPATH=\"\\\"${PROJECT_SOURCE_DIR}\\\"\"") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D${CMAKE_SYSTEM_NAME}") -# Todo -## 使用编译期固定选项,以略微提升性能。 -#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFIX_OPTIONS") -## 固定使用相机运行 -#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRUN_WITH_CAMERA") - SET(BIN_NAME "run") FIND_PROGRAM(CCACHE_FOUND ccache) @@ -21,7 +15,6 @@ IF(CCACHE_FOUND) MESSAGE("< Use ccache for compiler >") ENDIF() - FIND_PACKAGE(Eigen3 REQUIRED) FIND_PACKAGE(OpenCV 3 REQUIRED) FIND_PACKAGE(Threads) @@ -34,7 +27,7 @@ INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/armor/include) INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/others/include) FILE(GLOB_RECURSE sourcefiles "others/src/*.cpp" "energy/src/*cpp" "armor/src/*.cpp") -ADD_EXECUTABLE(${BIN_NAME} main.cpp ${sourcefiles} ) +ADD_EXECUTABLE(${BIN_NAME} main.cpp ${sourcefiles} others/include/constants.h) TARGET_LINK_LIBRARIES(${BIN_NAME} ${CMAKE_THREAD_LIBS_INIT}) TARGET_LINK_LIBRARIES(${BIN_NAME} ${OpenCV_LIBS}) @@ -51,4 +44,5 @@ ELSE () MESSAGE(STATUS "Unsupport platform: ${CMAKE_SYSTEM_NAME}") ENDIF() -ADD_CUSTOM_TARGET(create-startup COMMAND "${PROJECT_SOURCE_DIR}/tools/create-startup.sh" "${PROJECT_SOURCE_DIR}" "${CMAKE_BINARY_DIR}") \ No newline at end of file +ADD_CUSTOM_TARGET(create-startup COMMAND "${PROJECT_SOURCE_DIR}/tools/create-startup.sh" "${PROJECT_SOURCE_DIR}" "${CMAKE_BINARY_DIR}") +ADD_CUSTOM_TARGET(train-cnn COMMAND "gnome-terminal" "--" "bash" "-c" "${PROJECT_SOURCE_DIR}/tools/TrainCNN/backward.py") \ No newline at end of file diff --git a/armor/include/armor_finder/armor_finder.h b/armor/include/armor_finder/armor_finder.h index b376c1d..814abb2 100644 --- a/armor/include/armor_finder/armor_finder.h +++ b/armor/include/armor_finder/armor_finder.h @@ -6,63 +6,61 @@ #define _ARMOR_FINDER_H_ #include +#include #include #include #include #include -#include "additions/additions.h" - -extern std::map id2name; -extern std::map name2id; - -class ArmorFinder{ -public: - ArmorFinder(uint8_t &color, Serial &u, string paras_folder, const uint8_t &use); - ~ArmorFinder() = default; - -private: - typedef cv::TrackerKCF TrackerToUse; - - typedef enum{ - SEARCHING_STATE, TRACKING_STATE, STANDBY_STATE - } State; - - const uint8_t &enemy_color; - State state; - cv::Rect2d armor_box; - int boxid; - cv::Ptr tracker; - - Classifier classifier; - - int contour_area; - Serial &serial; - const uint8_t &use_classifier; - - bool stateSearchingTarget(cv::Mat &src); - bool stateTrackingTarget(cv::Mat &src); - bool stateStandBy(); -public: - void run(cv::Mat &src); - bool sendBoxPosition(); -}; +#include #define BLOB_RED ENEMY_RED #define BLOB_BLUE ENEMY_BLUE +extern std::map id2name; //装甲板id到名称的map +extern std::map name2id; //装甲板名称到id的map + + +/********************* 自瞄类定义 **********************/ +class ArmorFinder{ +public: + ArmorFinder(uint8_t &color, Serial &u, const string ¶s_folder, const uint8_t &use); + ~ArmorFinder() = default; + +private: + typedef cv::TrackerKCF TrackerToUse; // Tracker类型定义 + + typedef enum{ + SEARCHING_STATE, TRACKING_STATE, STANDBY_STATE + } State; // 自瞄状态枚举定义 + + const uint8_t &enemy_color; // 敌方颜色,引用外部变量,自动变化 + State state; // 自瞄状态对象实例 + cv::Rect2d armor_box; // 当前目标位置 + int boxid; // 当前目标id + cv::Ptr tracker; // tracker对象实例 + Classifier classifier; // CNN分类器对象实例,用于数字识别 + int contour_area; // 装甲区域亮点个数,用于数字识别未启用时判断是否跟丢(已弃用) + Serial &serial; // 串口对象,引用外部变量,用于和能量机关共享同一个变量 + const uint8_t &use_classifier; // 标记是否启用CNN分类器,引用外部变量,自动变化 + + bool stateSearchingTarget(cv::Mat &src); // searching state主函数 + bool stateTrackingTarget(cv::Mat &src); // tracking state主函数 + bool stateStandBy(); // stand by state主函数(已弃用) +public: + void run(cv::Mat &src); // 自瞄主函数 + bool sendBoxPosition(); // 和主控板通讯 +}; + +/******************* 灯条类定义 ***********************/ class LightBlob { public: - cv::RotatedRect rect; - double length; - uint8_t BlobColor; + cv::RotatedRect rect; //灯条位置 + double length; //灯条长度 + uint8_t BlobColor; //灯条颜色 LightBlob(cv::RotatedRect &r) : rect(r) { length = max(rect.size.height, rect.size.width); }; - bool operator<(LightBlob &l2) { return this->rect.center.x < l2.rect.center.x; } - bool operator<=(LightBlob &l2) { return this->rect.center.x <= l2.rect.center.x; } - bool operator>(LightBlob &l2) { return this->rect.center.x > l2.rect.center.x; } - bool operator>=(LightBlob &l2) { return this->rect.center.x >= l2.rect.center.x; } }; #endif /* _ARMOR_FINDER_H_ */ diff --git a/armor/include/show_images/show_images.h b/armor/include/show_images/show_images.h index 7abca01..5ba8f87 100644 --- a/armor/include/show_images/show_images.h +++ b/armor/include/show_images/show_images.h @@ -6,10 +6,9 @@ #define _SHOW_IMAGES_H_ #include -#include -#include #include +// void showArmorBoxVector(std::string windows_name, const cv::Mat &src, const std::vector &armor_box); void showArmorBox(std::string windows_name, const cv::Mat &src, cv::Rect2d armor_box, int boxid); void showContours(std::string windows_name, const cv::Mat &src, const std::vector &light_blobs); diff --git a/armor/src/armor_finder/armor_finder.cpp b/armor/src/armor_finder/armor_finder.cpp index c278d35..7ac97fe 100644 --- a/armor/src/armor_finder/armor_finder.cpp +++ b/armor/src/armor_finder/armor_finder.cpp @@ -12,19 +12,19 @@ std::map id2name = { {-1, "OO"},{ 0, "NO"}, { 1, "B1"},{ 2, "B2"},{ 3, "B3"},{ 4, "B4"},{ 5, "B5"},{ 6, "B7"},{ 7, "B8"}, { 8, "R1"},{ 9, "R2"},{10, "R3"},{11, "R4"},{12, "R5"},{13, "R7"},{14, "R8"}, -}; +}; //装甲板id到名称的map std::map name2id = { {"OO", -1},{"NO", 0}, {"B1", 1},{"B2", 2},{"B3", 3},{"B4", 4},{"B5", 5},{"B7", 6},{"B8", 7}, {"R1", 8},{"R2", 9},{"R3", 10},{"R4", 11},{"R5", 12},{"R7", 13},{"R8", 14}, -}; +}; //装甲板名称到id的map -ArmorFinder::ArmorFinder(uint8_t &color, Serial &u, string paras_folder, const uint8_t &use) : +ArmorFinder::ArmorFinder(uint8_t &color, Serial &u, const string ¶s_folder, const uint8_t &use) : serial(u), enemy_color(color), state(STANDBY_STATE), - classifier(std::move(paras_folder)), + classifier(paras_folder), contour_area(0), use_classifier(use), boxid(-1) @@ -32,11 +32,10 @@ ArmorFinder::ArmorFinder(uint8_t &color, Serial &u, string paras_folder, const u } void ArmorFinder::run(cv::Mat &src) { - static int tracking_cnt = 0; - cv::Mat src_use; - src_use = src.clone(); + static int tracking_cnt = 0; // 记录追踪帧数,用于定时退出追踪 + cv::Mat src_use = src.clone(); // 实际参与计算的图像对象 - if(show_armor_box){ + if(show_armor_box){ // 根据条件显示当前目标装甲板 showArmorBox("box", src, armor_box, boxid); cv::waitKey(1); } @@ -45,14 +44,14 @@ void ArmorFinder::run(cv::Mat &src) { switch (state){ case SEARCHING_STATE: if(stateSearchingTarget(src_use)){ - if((armor_box & cv::Rect2d(0, 0, 640, 480)) == armor_box) { - if(!classifier && use_classifier){ - cv::Mat roi = src_use.clone()(armor_box), roi_gray; + if((armor_box & cv::Rect2d(0, 0, 640, 480)) == armor_box) { // 判断装甲板区域是否脱离图像区域 + if(!classifier || !use_classifier){ /* 如果分类器不可用或者不使用分类器 */ + cv::Mat roi = src_use.clone()(armor_box), roi_gray; /* 就使用装甲区域亮点数判断是否跟丢 */ cv::cvtColor(roi, roi_gray, CV_RGB2GRAY); cv::threshold(roi_gray, roi_gray, 180, 255, cv::THRESH_BINARY); contour_area = cv::countNonZero(roi_gray); } - tracker = TrackerToUse::create(); + tracker = TrackerToUse::create(); // 成功搜寻到装甲板,创建tracker对象 tracker->init(src_use, armor_box); state = TRACKING_STATE; tracking_cnt = 0; @@ -61,7 +60,7 @@ void ArmorFinder::run(cv::Mat &src) { } break; case TRACKING_STATE: - if(++tracking_cnt>100 || !stateTrackingTarget(src_use)){ + if(++tracking_cnt>100 || !stateTrackingTarget(src_use)){ // 最多追踪100帧图像 state = SEARCHING_STATE; LOGM(STR_CTR(WORD_LIGHT_YELLOW ,"into search!")); } diff --git a/armor/src/armor_finder/state_machine/searching_state/image_process/image_process.cpp b/armor/src/armor_finder/searching_state/image_process.cpp similarity index 100% rename from armor/src/armor_finder/state_machine/searching_state/image_process/image_process.cpp rename to armor/src/armor_finder/searching_state/image_process.cpp diff --git a/armor/src/armor_finder/state_machine/searching_state/image_process/image_process.h b/armor/src/armor_finder/searching_state/image_process.h similarity index 100% rename from armor/src/armor_finder/state_machine/searching_state/image_process/image_process.h rename to armor/src/armor_finder/searching_state/image_process.h diff --git a/armor/src/armor_finder/state_machine/searching_state/searching_state.cpp b/armor/src/armor_finder/searching_state/searching_state.cpp similarity index 93% rename from armor/src/armor_finder/state_machine/searching_state/searching_state.cpp rename to armor/src/armor_finder/searching_state/searching_state.cpp index dc4f1eb..da72753 100644 --- a/armor/src/armor_finder/state_machine/searching_state/searching_state.cpp +++ b/armor/src/armor_finder/searching_state/searching_state.cpp @@ -4,10 +4,10 @@ #include #include -#include -#include #include #include +#include +#include "image_process.h" typedef std::vector LightBlobs; @@ -255,20 +255,21 @@ static string prior_red[] = { }; bool ArmorFinder::stateSearchingTarget(cv::Mat &src) { - cv::Mat split, src_bin, color; - LightBlobs light_blobs; - std::vector armor_boxes, boxes_number[14]; - std::vector channels; + std::vector channels; // 通道拆分 + cv::Mat src_bin, color; // 二值图和颜色通道图 + LightBlobs light_blobs; // 存储所有可能的灯条 + std::vector armor_boxes; // 装甲板候选区 + std::vector boxes_number[15]; // 装甲板候选区放置在对应id位置 - armor_box = cv::Rect2d(0, 0, 0, 0); + armor_box = cv::Rect2d(0, 0, 0, 0); // 重置目标装甲板位置 - cv::split(src, channels); - if (enemy_color == ENEMY_BLUE) - color = channels[0]; - else if (enemy_color == ENEMY_RED) - color = channels[2]; - cv::threshold(color, src_bin, 170, 255, CV_THRESH_BINARY); - imagePreProcess(src_bin); + cv::split(src, channels); /************************/ + if (enemy_color == ENEMY_BLUE) /* */ + color = channels[0]; /* 根据目标颜色进行通道提取 */ + else if (enemy_color == ENEMY_RED) /* */ + color = channels[2]; /************************/ + cv::threshold(color, src_bin, 170, 255, CV_THRESH_BINARY); // 二值化对应通道 + imagePreProcess(src_bin); // 开闭运算 if (!findLightBlobs(src_bin, light_blobs)) { return false; } diff --git a/armor/src/armor_finder/state_machine/standby_state/standby_state.cpp b/armor/src/armor_finder/standby_state/standby_state.cpp similarity index 100% rename from armor/src/armor_finder/state_machine/standby_state/standby_state.cpp rename to armor/src/armor_finder/standby_state/standby_state.cpp diff --git a/armor/src/armor_finder/state_machine/tracking_state/tracking_state.cpp b/armor/src/armor_finder/tracking_state/tracking_state.cpp similarity index 100% rename from armor/src/armor_finder/state_machine/tracking_state/tracking_state.cpp rename to armor/src/armor_finder/tracking_state/tracking_state.cpp diff --git a/armor/src/show_images/show_images.cpp b/armor/src/show_images/show_images.cpp index 34d9105..37f1a46 100644 --- a/armor/src/show_images/show_images.cpp +++ b/armor/src/show_images/show_images.cpp @@ -1,8 +1,12 @@ #include +#include #include using namespace cv; +/************************** + * 显示多个装甲板区域 * + **************************/ void showArmorBoxVector(std::string windows_name, const cv::Mat &src, const std::vector &armor_box) { static Mat image2show; if (src.type() == CV_8UC1) {// 黑白图像 @@ -17,6 +21,9 @@ void showArmorBoxVector(std::string windows_name, const cv::Mat &src, const std: imshow(windows_name, image2show); } +/************************** + * 显示多个装甲板区域及其类别 * + **************************/ void showArmorBoxClass(std::string window_names, const cv::Mat &src, vector boxes[10]) { static Mat image2show; if (src.type() == CV_8UC1) { // 黑白图像 @@ -45,6 +52,9 @@ void showArmorBoxClass(std::string window_names, const cv::Mat &src, vector &light_blobs) { static Mat image2show; diff --git a/energy/include/energy/constant.h b/energy/include/energy/constant.h index 08ca61d..2dd2cc7 100644 --- a/energy/include/energy/constant.h +++ b/energy/include/energy/constant.h @@ -14,7 +14,6 @@ const int SRC_WIDTH_CAMERA = 640; const int SRC_HEIGHT_CAMERA = 480; const int SRC_WIDTH = 320; const int SRC_HEIGHT = 240; -const double PI = 3.1415926; const int CLOCKWISE = 1; const int ANTICLOCKWISE = -1; const float ATTACK_DISTANCE = 718;//cm diff --git a/energy/include/energy/energy.h b/energy/include/energy/energy.h index 9d2ccc7..135f4ad 100644 --- a/energy/include/energy/energy.h +++ b/energy/include/energy/energy.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include diff --git a/main.cpp b/main.cpp index de182c7..1befdf3 100644 --- a/main.cpp +++ b/main.cpp @@ -2,22 +2,17 @@ // Created by xixiliadorabarry on 1/24/19. // #include +#include #include -#include -#include #include -#include -#include #include #include #include +#include #include #include #include -#include - #define DO_NOT_CNT_TIME - #include using namespace cv; diff --git a/others/include/additions/additions.h b/others/include/additions/additions.h index 2cfe668..bfae05d 100644 --- a/others/include/additions/additions.h +++ b/others/include/additions/additions.h @@ -7,15 +7,6 @@ #include #include -#include -#include - -#define ENEMY_BLUE 0 -#define ENEMY_RED 1 - -#define BIG_ENERGY_STATE 'b' -#define SMALL_ENERGY_STATE 's' -#define ARMOR_STATE 'a' struct mcu_data{ float curr_yaw; diff --git a/others/include/constants.h b/others/include/constants.h new file mode 100644 index 0000000..3514a83 --- /dev/null +++ b/others/include/constants.h @@ -0,0 +1,17 @@ +// +// Created by xinyang on 19-7-8. +// + +#ifndef _CONSTANTS_H_ +#define _CONSTANTS_H_ + +#define PI (3.14159265459) + +#define ENEMY_BLUE 0 +#define ENEMY_RED 1 + +#define BIG_ENERGY_STATE 'b' +#define SMALL_ENERGY_STATE 's' +#define ARMOR_STATE 'a' + +#endif /* _CONSTANTS_H */ diff --git a/others/src/additions/additions.cpp b/others/src/additions/additions.cpp index 339748c..9b8ff23 100644 --- a/others/src/additions/additions.cpp +++ b/others/src/additions/additions.cpp @@ -3,17 +3,17 @@ // #include +#include #include #include #include #include +#include #include #include -#include -#include -#include #include #include +#include #define RECEIVE_LOG_LEVEL LOG_MSG