该代码没有使用模板匹配。
部分代码参考RoboMaster视觉教程(9)风车能量机关识别2
思路启发自内附代码|今年的大风车能量机关识别就是这么地so easy!
拟合圆函数参考OpenCV最小二乘法圆拟合
工程文件已上传https://gitee.com/seaman007/try
1.按帧读取视频
打开视频后进入while循环,把每一帧给video1,直到video1.empty()为真,并把video1克隆到video2备用。
VideoCapture video("video.avi");//打开视频
if (!video.isOpened())
{
cout << "打开失败" << endl;
}
namedWindow("识别窗口", CV_WINDOW_AUTOSIZE);
Mat video1, video2;
while (true)
{
video >> video1;
if (video1.empty())
break;
Mat video2 = video1.clone();
}
2.图像预处理
a.二值化
分离通道后,利用通道相减channels.at(2) - channels.at(0),剔除白色的影响
vector<Mat> channels;
split(video1, channels);//分离通道
threshold(channels.at(2) - channels.at(0), video1, 100, 255, CV_THRESH_BINARY_INV);//二值化
二值化效果图
b.漫水法+闭运算
利用漫水法去除多余白色,利用闭运算减少图形的数量
Mat element1 = getStructuringElement(MORPH_RECT, Size(5, 5));//设置内核1
Mat element2 = getStructuringElement(MORPH_RECT, Size(25, 25));//设置内核2
morphologyEx(video1, video1, MORPH_OPEN, element1);//开运算(使图形明显)
floodFill(video1, Point(0, 0), Scalar(0));//漫水法
morphologyEx(video1, video1, MORPH_CLOSE, element2);//闭运算(减少图形数量)
漫水法效果图
漫水法+闭运算效果图
c.找轮廓
找轮廓用到findContours函数,各参数可自行百度
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(video1, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);//找轮廓
d.遍历轮廓,并计算轮廓面积
int area[25] = {
0 };
for (int i = 0; i < hierarchy.size(); i++)
{
area[i] = contourArea(contours[i]);//计算轮廓面积
}
e.利用面积筛选出目标装甲板,并绘制其最小外接矩阵及中心点
由于经过前面的闭运算,目标装甲板的面积和其他图形有较大差别,所以我们使用这种方法
if (area[i] < 2000)
{
Point2f rect[4];
RotatedRect box1 = minAreaRect(Mat(contours[i]));//获取最小外接矩阵
circle(video2, Point(box1.center.x, box1.center.y), 5, Scalar(255, 0, 0), -1, 8); //绘制最小外接矩形的中心点
box1.points(rect); //把最小外接矩形四个端点复制给rect数组
for (int j = 0; j < 4; j++)
{
line(video2, rect[j], rect[(j + 1) %