# 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
