2021Robomaster能量机关识别算法
未完待续
2021/6/17
文章目录
前言
VS2019+opencv420+win10
一、代码目录
- addtion.h 定义结构体,便于传输数据
- CameraApi.h 相机Api头文件
- Constant.h 定义一些常量
- constants.h 宏定义
- energy.h energy类
- param_struct_define.h 能量机关参数结构体
- stdafx.h
- targetver.h
- clear.cpp 容器清理,图片预处理
- energy.cpp energy类的构造函数与析构函数
- energy_finder.cpp 寻找扇叶,装甲板,R等
- energy_init.cpp 参数初始化
- get_aim_point.cpp
- get_polar_angle.cpp 获取极坐标 大小符判断
- get_predict_point.cpp 获取预测点坐标
- judge_contour.cpp 判断函数集
- OpenCV.cpp 函数入口
- run.cpp 程序执行流程
- send.cpp 发送数据程序
- show.cpp 显示函数集
- split.cpp 通道分离函数集
- structing.cpp 膨胀腐蚀不同内核
- target_change.cpp 目标切换
- target_finder.cpp 寻找装甲板
- tool.cpp 各类工具集
二、核心代码解释
OpenCV.cpp
if (flag % 5 == 0)
{
//用来计算当前时间到需要时间的每帧平均运行时间
flag = 0;
float tempSum = 0, avg = 0;
if (times.size() != 0)
{
for (auto& time : times)
{
tempSum += time;
avg = tempSum / (times.size());
energy.t = avg;
}
}
else
{
cout << "还没有时间压入" << endl;
}
times.clear();//释放存储的时间
}
run.cpp
- 释放内存
- 各类参数初始化
- 寻找装甲板
- 寻找含有流动条的扇叶
- 寻找目标装甲板
- 寻找中心R标
- 寻找扇叶
- 计算极坐标角度
- 判断旋转方向
- 给出预测点
clear.cpp
- 清除容器,给出预留大小
- 图片二值化处理
energy_finder.cpp
int Energy::findArmors(const cv::Mat& src) {
//在这里把寻找到的初始轮廓送入判断
//把符合条件的装甲板压入容器
}
bool Energy::findFlowStripFan(const cv::Mat& src) {
//同上,算内外轮廓比
}
bool Energy::findTargetInFlowStripFan() {
//同上,计算寻找到的装甲板与扇叶的重合面积
}
bool Energy::findCenterR(const cv::Mat& src) {
//同上,寻找R,确定拟合圆
}
bool Energy::findFans(const cv::Mat& src) {
//同上,寻找扇叶数量
}
get_polar_angle.cpp
有参与无参的获取极坐标夹角
tool.cpp
void Energy::initRotation() {
//判断旋转角度
}
get_predict_point.cpp
void Energy::getPredictPoint(cv::Point target_point) {
//分情况给出大符与小符的预测点
}
三、注意事项
- 检查target_armor_points(4)是否为可覆盖空间,是否会造成溢出错误,有的话改如何改正
- small与big的分别预测:small里面的参数t已在OpenCV.cpp算出,注意float到double类型的转换,查看是否会因丢失数据而对预测正确性有较大影响。
- 参数R为常数,考虑到移植后其他原因,这是一个校准量。应在移植后测出。
- 对于小符来说,如需检测预测点是否在圆上,需要给一个范围。
- 给定拟合圆的时候,需要给半径一个范围。
- 预测点与框的绘制。
四、待办
- 坐标系变换
- 大符小符键盘响应事件编写
- 大符角度设计
五、实验数据