robomaster机器视觉(c++/python:opencv):1.识别装甲板两边光条

测试操作平台:Ubuntu16.0.4
opencv版本:3.4.1
IDE:qtcreator(C++), pycharm(python)


识别装甲板

在比赛中,第一步便是识别敌我机器人,通过识别装甲板可以完成。类似这种。

在这里插入图片描述

通过装甲板两边的光条(颜色,以及其他特征),来确定装甲板的位置并标记(后面的步骤)。

我们首先只完成识别装甲板两边的光条,并 将两边的光条保留下来

hsv基础知识

  • 利用openCV中cvSplit函数的在选择图像IPL_DEPTH_32F类型时,H取值范围是0-360,S取值范围是0-1(0%-100%),V取值范围是0-1(0%-100%)。

  • 利用openCV中cvSplit函数的在选择图像IPL_DEPTH_8UC类型时,H取值范围是0-180,S取值范围是0-255,V取值范围是0-255。

我们使用的是第二种
其中:

  • h:120-180红色系
    60-120蓝色系
    0-60黄色绿色系
  • s:0-255
  • v:0-255

效果图:
在这里插入图片描述
源代码:(识别一张图片)

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <math.h>
using namespace std;
using namespace cv;



int main()
{
    cv::Mat src_img ;
    src_img = imread("/home/liuxin/桌面/opencv/buff.png");
    imshow("原始图",src_img);


    if(src_img.empty())
    {
        cout<<"open failed"<<endl;
        return -1;
    }

    int LowH =60;
    int LowS=120;
    int LowV =245;

    int HighH = 120;
    int HighS = 255;
    int HighV =255;


    Mat hsvimg;
    cvtColor(src_img,hsvimg,COLOR_BGR2HSV);

    vector<Mat> hsvsplit;

    split(hsvimg,hsvsplit);
    equalizeHist(hsvsplit[2],hsvsplit[2]);
    merge(hsvsplit,hsvimg);


    Mat thresholdimg;
    inRange(hsvimg,Scalar(LowH,LowS,LowV),Scalar(HighH,HighS,HighV),thresholdimg);

    imshow("二值化后的图片",thresholdimg);


    while(1)
      {
          int key=cvWaitKey(10);
      if (key==27)
      {
          break;
      }
      }
      return(0);
}

经过修改后,可以识别视频,源代码如下:

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <math.h>
using namespace std;
using namespace cv;



int main()
{
    VideoCapture capture("/home/liuxin/桌面/opencv/train2.mp4");

    while (capture.isOpened()) {
        Mat frame;
        capture>>frame;
        if(frame.empty())
            {
                cout<<"some thing is wrong"<<endl;
                break;
            }

        int LowH =60;
        int LowS=120;
        int LowV =245;

        int HighH = 120;
        int HighS = 255;
        int HighV =255;


        Mat hsvimg;
        cvtColor(frame,hsvimg,COLOR_BGR2HSV);

        vector<Mat> hsvsplit;

        split(hsvimg,hsvsplit);
        equalizeHist(hsvsplit[2],hsvsplit[2]);
        merge(hsvsplit,hsvimg);


        Mat thresholdimg;
        inRange(hsvimg,Scalar(LowH,LowS,LowV),Scalar(HighH,HighS,HighV),thresholdimg);

        imshow("二值化后的图片",thresholdimg);


        int key=cvWaitKey(10);
        if (key==27)
        {
         break;
        }

    }
return 0;

}

在这里插入图片描述


下一节:将根据识别后的光条来去画矩形框,锁定击打区域

https://blog.csdn.net/weixin_42755384/article/details/88537705

猜你喜欢

转载自blog.csdn.net/weixin_42755384/article/details/88530186