之前说能量机关的教程有很多了打算不写了,但是总有同学来问,想了想还是写一下吧。
风车能量机关我只做了识别,因为准备分区赛的时候没有实物可以测试就一直搁置了,之后复活赛视觉的打击和预测都是学弟们做的。所以如果问我预测方面的事我也只能给个大概的方向,因为毕业后就没有再做这个了。
风车能量机关识别的示例代码我放在了我的GitHub上
https://github.com/hejiangda/RM19windmillDemo
有需要的可以自行下载,觉得有帮助的话可以点个赞给项目加个星。
图像预处理
和之前识别装甲板一样,首先需要把我们要的颜色保留不要的去除。通过红蓝颜色通道互减可以方便的得到符合条件的二值图。
//分割颜色通道vector<Mat> imgChannels;split(srcImage,imgChannels);//获得目标颜色图像的二值图#ifdef REDMat midImage=imgChannels.at(2)-imgChannels.at(0);#endif#ifndef REDMat midImage=imgChannels.at(0)-imgChannels.at(2);#endif
这里说一下在 opencv c++ 中 Mat 之间是可以直接用-
号相减的,而且如果减完后对应的像素点是负值的话会设为0,而在python中用-
减完后如果像素值为负不会归零,而是类似于溢出的那种效果,也就是会变成255加上那个负数。在 c++ 中不会出现这样的问题。
//二值化,背景为黑色,图案为白色//用于查找扇叶threshold(midImage2,midImage2,100,255,CV_THRESH_BINARY);
在灰度图上进行二值化,得到的图片效果:
可以看到箭头之间有空隙,如果直接进行轮廓查找的话会得到许多小轮廓而不能把整个作为一个轮廓,所以需要对图片进行膨胀操作。腐蚀和膨胀都是针对于白色区域而言的,腐蚀就是白色区域减少,膨胀就是白色区域增加。
//膨胀int structElementSize=2;
Mat element=getStructuringElement(MORPH_RECT,Size(2*structElementSize+1,2*structElementSize+1),Point(structElementSize,structElementSize));
dilate(midImage2,midImage2,element);
膨胀后可以看到箭头都连在一起了:
之后还要进行形态学闭