RMUT视觉入门
作者:互联网
ROBOMASTER关于视觉学习(opencv/c++)
本博客仅限自己学习记录,
本人蒻蒟,各位大佬如果发现有错误,希望帮忙指出
opencv安装
opencv学习
RM单项赛对于opencv的要求不会很高,视觉的主要难度是预测算法(个人观点)
- 对于Mat和opencv常用数据结构和函数 的学习;
- 形态学的使用以及阈值化;
- findContours()和drawContours();
- 选取区域,如minAreaRect;
- 测距算法(单目PnP)和测角度(calAngle);
能量机关—大风车
通过形态学的膨胀闭区间等达到区分装甲版(待击打区域)和叶片。效果图如下:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#define BLUE
using namespace std;
using namespace cv;
int Threshold(int ans,int shold)//二值化
{
return ans < shold ? 0 : 255;
}
int main()
{
Mat src, dert;
Mat element = getStructuringElement (MORPH_RECT,Size(3,3));
VideoCapture cap ("机器人视角 蓝色 背景暗.avi");
vector <Mat> channal;
cap >> src;
int col = 640 , row = 480;
dert = Mat::zeros(row,col,CV_8UC1);
while(1){
cap >> src;
resize(src,src,Size(640,480));
if(!src.data)return -1;
Vec3b *isdate;
uchar *id;//imgB - imgR
for (int i = 0 ; i < row ; i++){
isdate = src.ptr<Vec3b>(i);
id = dert.ptr<uchar>(i);
for(int j=0 ; j < col ;j++){
#ifdef RED
id[j] = Threshold(isdate[j][2] - isdate[j][0] , 100);
#endif
#ifdef BLUE
id[j] = Threshold(isdate[j][0] - isdate[j][2] , 100);
#endif
}
}
vector<vector<Point>> contours;
vector<Vec4i> hi;
dilate(dert,dert,element);//先膨胀
morphologyEx(dert,dert, MORPH_CLOSE, element);//闭运算,以去除白色区域中可能出现的小洞干扰轮廓查找
findContours(dert, contours,hi, RETR_TREE, CHAIN_APPROX_SIMPLE);
// imshow("yuan",src);
for(int index = 0; index < contours.size() ; index ++){
if(hi[index][3] == -1) drawContours(src, contours, index, Scalar(255,255,255), 1, 4, hi);
else if( hi[index][2] == -1 )drawContours(src, contours, index, Scalar(0,0,255), 1, 4, hi);
}
imshow("tracker",src);
int k = waitKey(1);
if(k == 27)return 0;
}
return 0;
}
预测
RMUT2021的大风车运动速度模型是
spd = 0.785 ∗ sin (1.884 ∗ t) + 1.305
根据sin函数特征,想到了几个方法去预测
1.用时间去预测下一秒的位置
发现本方法并行不通,时间不可能卡的很准,并且规则上也说,会有500ms的时间误差。。。
2.用速度去求时间
发现速度测的并不准,可能是实验室太穷,小电脑计算能力有限只能用640*480的分辨率,导致速度测量误差很大。
3. 用速度去拟合sin函数
用了二分法去找给一个点,然后用方差去找到误差最小的时间。理论来说可行,可能是我的代码能力有限,写出来还是有问题,然后数学也不是很好,也没有debug成功。
4.用kalman滤波
在区域赛前五天,学了一下kalman,本来想的是用kalman去预测,同样的数学不好。。。
华南虎-kalman这个讲的很详细,但是我只学到了皮毛,用来一阶kalman去求出当前速度。然后直接用当前速度*子弹飞行速度,去预测击打点。kalman是有预测功能的,但是我这么用对不对,也没有过推导,只能说击打的还可以,在北方赛区也是拿到了一等奖+3000奖金。
标签:src,入门,kalman,index,int,dert,opencv,视觉,RMUT 来源: https://blog.csdn.net/qq_52854546/article/details/116137476