Robomaster大能量机关轮廓流水灯识别+框选

一、介绍

自己当时做了一段时间的这个项目,现打算分享一下流程,以帮助各位RMer更好的处理比赛中遇到的流程与问题。

二、识别

2.1 筛颜色

由于能量机关是蓝色或者红色的
可以使用hsv 把蓝色或者红色分割出来
或用红蓝通道想减

2.2 二值化分割+形态学处理

分割方法
inrange()函数实现阈值化

    cvtColor(image,image,COLOR_BGR2HSV);
    inRange(image, Scalar(70, 150, 50), Scalar(120, 255, 255), image);        //阈值要自己调
    接着进行一组膨胀
    dilate(image,image,Mat());

(1)这是预处理的效果图
在这里插入图片描述(2)下面进行找轮廓并画出轮廓

Mat canny_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    /// 用Canny算子检测边缘
    Canny(image1, canny_output, 100, 100*2, 3 );
    /// 寻找轮廓
    findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

    /// 绘出轮廓
    Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );
    for( int i = 0; i< contours.size(); i++ )
    {
        Scalar color = Scalar( 0, 0,255 );
        drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );
    }

下面是轮廓效果
在这里插入图片描述
(3)寻找流水灯,也就是要击打的一块区域;面积和轮廓比要自己调

 		 ///  面积大小排序轮廓 ///
    std::sort(contours.begin(),contours.end(),ContoursSortFun);
 		cv::RotatedRect min_center_rect;
		vector<Point> points;
        if(contourArea(contours[i])==0)
            continue;
 
        double area_of_contour=contourArea(contours[i]);
        /比较面积
        if ( (area_of_contour >=1200)&& (area_of_contour <=1400&& center_rm_founded_flag == 0 ))
        {
            min_center_rect = cv::minAreaRect( contours[i] );
            double center_rect_h_w_div = min_center_rect.size.height / min_center_rect.size.width;
            center_rect_h_w_div=center_rect_h_w_div>1?center_rect_h_w_div:1/center_rect_h_w_div;
   

            //划线找出流水灯
            points = contours[i];
            拟合出最小外接矩形
            RotatedRect rrect = fitEllipse(points);
            cv::Point2f* vertices = new cv::Point2f[4];
            ///矩阵的四个顶点赋值给vertices
            rrect.points(vertices);
            /找长宽比
            float aim = center_rect_h_w_div;
            if(aim > 1.95&& aim < 2.5){
                cout<<"第"<<i<<"个面积为"<<contourArea(contours[i])<<endl;
                cout<<"第"<<i<<"个长宽比"<<center_rect_h_w_div<<endl;
                for (int j = 0; j < 4; j++)
                {cout<<"Di"<<j<<"个坐标点"<<vertices[i]<<endl;
                    cv::line(binary, vertices[j], vertices[(j + 1) % 4], cv::Scalar(0, 255, 0),4);
                }
                imshow("划线",binary);
		}

三、预测

现如今的比赛更重要的是能量机关的旋转预测上

3.1 小能量机关

按特定速度旋转
这个将图像转换一下极坐标系,在极坐标系上旋转固定角度即可。

3.2 大能量机关

这个可以在转的最慢时击打。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值