RoboMaster能量机关识别的简易实现

该博客介绍了如何简易实现RoboMaster能量机关的识别,主要利用OpenCV进行图像预处理,包括二值化、漫水法+闭运算、找轮廓等步骤,通过轮廓面积筛选目标装甲板,再通过最小外接矩形中心点拟合出圆来确定能量机关的位置。代码参考了RoboMaster视觉教程,并提供了工程文件链接。
摘要由CSDN通过智能技术生成

该代码没有使用模板匹配。

部分代码参考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) %
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值