然后今天开始就是回到学校在工作室开始备赛了,然后就是目前的任务就是识别大符(回学校才知道单项赛不用识别装甲板,假期白干了,但是我的读代码能力确实是提高了),我要去复现一回,要不就是无法进行提高,可能对我现在来说很难吧,但是我会成功的(给自己一个暗示),然后因为能量机关是2019出来的,我可以参照的就很少了,因为我的装甲板识别是参照吉大的然后打算能量机关也用,但是他这里没有将代码全部写完,我计划在这上面做二次开发。后期参照其他学习改进,比如说深大的有几个想法就挺好,后期可以参照一下。
然后就是这会打算不全写了,就把思路写下来,然后后期的二次开发在具体写下来。
然后就是他这个是一个独立的文件夹,并没有和其他的建立起联系,然后开始:
这里的主函数是在run.cpp里面,从这里看起:
int main() {
Energy energy;
Mat src;
VideoCapture cap("/home/dji/视频/fan.mp4");
cap.set(CAP_PROP_FRAME_WIDTH, 640); //设置相机采样宽度
cap.set(CAP_PROP_FRAME_HEIGHT, 480); //设置相机采样高度
cap.set(CAP_PROP_BRIGHTNESS, 20); //设置相机采样亮度
cap.set(CV_CAP_PROP_FPS, 200); //设置相机采样帧率
do {
//时间消耗测试
double t, tc;
t = getTickCount();
cap >> src;
//resize(src, src, Size(640, 480));
energy.run(src);
//时间消耗测试
tc = (getTickCount() - t) / getTickFrequency();
printf("time consume %.5f\n", tc); //显示出耗费时间的多少
waitKey(1);
} while (true);
}
从第一行看起:先实例化一个敌人对象,然后先看看这个类(Energ.h里):
bool is_big;//大符模式为true
bool is_small;//小符模式为true
void run(cv::Mat& src);//程序运行
先看看这个有两个模式,然后我们的单项赛的话只有大符,那么后期的话记住实在这里定义的模式。
然后就是一个集成函数:然后我们看看这个函数,这里面集成得到就是这个类里面的定义的各种方法,一个个来:
void Energy::clearAll() {
fans.clear();
armors.clear();
flow_strip_fans.clear();
target_armors.clear();
flow_strips.clear();
}
这个函数对各种容器进行初始化,就是清空。那么有哪些容器呢?
std::vector<cv::RotatedRect> fans;//图像中所有扇叶
std::vector<cv::RotatedRect> target_armors;//可能的目标装甲板
std::vector<cv::RotatedRect> armors;//图像中所有可能装甲板
std::vector<cv::RotatedRect> flow_strip_fans;//可能的流动扇叶
std::vector<cv::RotatedRect> flow_strips;//可能的流动条
可见有扇叶,目标装甲板,可能的装甲板,流动扇叶,流动条
void Energy::initImage(cv::Mat& src) {
if (src.type() == CV_8UC3) {
cvtColor(src, src, COLOR_BGR2GRAY);
}
if (mcu_data.enemy_color == ENEMY_BLUE) {
threshold(src, src, _flow.BLUE_GRAY_THRESH, 255, THRESH_BINARY);
}
else if (mcu_data.enemy_color == ENEMY_RED) {
threshold(src, src, _flow.RED_GRAY_THRESH, 255, THRESH_BINARY);
}
if (show_process) imshow("bin", src);
if (show_energy || show_process)waitKey(1);
}
这个是对图像进行初始化操作,先转灰度,然后分别对红蓝两种情况进行处理。然后对显示进行了判断:这里有几个定义:
bool show_energy; //是否显示图像
bool show_process;//是否显示调试过程
bool show_wrong;//是否显示报错
bool show_data;//是否显示数据
int Energy::findArmors(const cv::Mat& src) {
if (src.empty()) {
if (show_wrong) cout << "empty!" << endl;
return 0;
}
static Mat dst;
dst = src.clone();
if (src.type() == CV_8UC3) {
cvtColor(dst, dst, CV_BGR2GRAY);//若读取三通道视频文件,需转换为单通道
}
std::vector<vector<Point> > armor_contours;
std::vector<vector<Point> > armor_contours_external;//用总轮廓减去外轮廓,只保留内轮廓,除去流动条的影响。
ArmorDilate(dst);//图像膨胀,防止图像断开并更方便寻找
if (show_process) imshow("Armorstuct", dst);
findContours(dst, armor_contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
findContours(dst, armor_contours_external, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
for (unsigned int i = 0; i < armor_contours_external.size(); i++)//去除外轮廓
{
int external_contour_size = armor_conto