其他分享
首页 > 其他分享> > RMUT视觉入门

RMUT视觉入门

作者:互联网

ROBOMASTER关于视觉学习(opencv/c++)


本博客仅限自己学习记录, 主要是正确性都有待商讨
本人蒻蒟,各位大佬如果发现有错误,希望帮忙指出

opencv安装

ubuntu18 安装opencv

opencv学习

RM单项赛对于opencv的要求不会很高,视觉的主要难度是预测算法(个人观点)

  1. 对于Matopencv常用数据结构和函数 的学习;
  2. 形态学的使用以及阈值化
  3. findContours()drawContours()
  4. 选取区域,如minAreaRect
  5. 测距算法(单目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