ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RMUT视觉入门

2021-07-24 10:05:01  阅读:288  来源: 互联网

标签:src 入门 kalman index int dert opencv 视觉 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有