# Armor_Finder_RotatedRect **Repository Path**: x-han/Armor_Finder_RotatedRect ## Basic Information - **Project Name**: Armor_Finder_RotatedRect - **Description**: No description available - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-03-21 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Armor_Finder > 本项目完成了Robomaster机器人比赛中对于目标机器人装甲板机器视觉检测算法的实现 | 作者 | 负责部分 | | ------ | -------------- | | 韩煦源 | 自瞄装甲板识别、分类器 | | 曾宪坤 | PNP测距 | ## 一、代码运行环境 |操作系统|运行库| |-------|--------| |Ubuntu16.04

Windows WSL|OpenCV 3.4.7
&
cmake 3.15.4| - 本代码统一使用**640×480**大小的图像进行处理 ## 二、程序编译及运行 Ubuntu16.04(在项目文件夹下) ```shell mkdir build cd build cmake .. make sudo ./main ``` ## 三、文件结构目录 ``` Files Structure . ├── armor // 存放自瞄主要算法代码 │   ├── include // 自瞄头文件 │   └── src // 自瞄源码 ├── CMakeLists.txt // cmake工程文件 ├── image // 存放测试代码使用的图像 │   ├── dst // 存放原图像 │   └── src // 存放经代码处理后的图像 ├── main.cpp // 主函数 ├── other // 存放一些其他代码,如计时器、drawText │ └── include // 其他代码头文件 ├── README.md └── Video // 存放调试代码所需的视频文件以及分类器输出的截图 ``` ## 四、关键类解析 ### 一.Armor_Finder_RotatedRect #### 1.find lightbox - cv::findContours(mat,contours, CV_RETR_LIST,CV_CHAIN_APPROX_NONE) [将二值化后的Mat进行边缘检测] - minAreaRect(contours[i]) [取得轮廓的最小旋转矩形] - screen lightboxes 筛选灯条 - cv::Point2f vertices[4]; rect.points(vertices); [旋转矩形的四个顶点Mat内部] - rotateRectToMat_isok(mat_real, rect); [确保转正后的旋转矩形在Mat内部] - rotateRectToMat(mat_real, rect); [将旋转矩形所对应的区域内的图像转正] - length_width_rate_thresh [长宽比阈值] - hsv_isok(mat_imagepart, thresh_binar, thresh_value); [hsv检测] - cv::cvtColor(in, in2, CV_RGB2HSV);RGB图片像HSV颜色空间转变 - cvGet2D(ipl_in2, rows/2, cols/2); [遍历hsv中点像素值:筛选亮度和颜色] #### 2.match lightbox_i_j - angle_isok(const cv::RotatedRect rect_i, const cv::RotatedRect rect_j) [角度差匹配] - center_height_isok(const cv::RotatedRect rect_i, const cv::RotatedRect rect_j) [中心高度差匹配] - center_distance_isok(const cv::RotatedRect rect_i, const cv::RotatedRect rect_j) [中心距离和长度比匹配] - length_rate_isok(const cv::RotatedRect rect_i, const cv::RotatedRect rect_j) [灯条长宽比匹配] #### 3.find armorbox - get_armor(cv::Mat& mat_real, const cv::RotatedRect rect_i, const cv::RotatedRect rect_j) - 情况一(up_right):变换旋转矩形的坐标点顺序,确定p[0]与p[1] - 情况二(!up_right):无需变化 - vertices_dual_light[0] = - rect_l.size.width < rect_l.size.height ? vertices_l[0] : vertices_l[1] - vertices_dual_light[1] = - rect_l.size.width < rect_l.size.height ? vertices_l[1] : vertices_l[2]; - vertices_dual_light[2] = - rect_r.size.width < rect_r.size.height ? vertices_r[2] : vertices_r[3]; - vertices_dual_light[3] = - rect_r.size.width < rect_r.size.height ? vertices_r[3] : vertices_r[0]; [相对外侧的灯条点作为装甲板的顶点] #### 4.line armorbox - if(rect_l.size.width 由图可见,一级分类器运行时间约为4ms,二级分类器运行时间约为2ms,每帧程序运行时间约为40ms ![](./results_screenshot/Screenshot from 2020-02-12 00-11-21.png)