RMUT传统视觉入门


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

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奖金。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值