OpenCV实现基于颜色的视频对象跟踪(跟踪一个橙子)

一、概述

  案例:基于颜色来实现视频对象的跟踪,本案例跟踪的是一个橙子。

  使用到的关键方法:hsv+inRange,区间内白色不再区间内黑色

  实现该算法的步骤:

    1.创建VideoCapture

    2.使用其open方法打开视频

    3.while循环读取视频帧frame

    4.将frame转hsv色彩空间

    5.根据hsv色彩空间提取橙子的颜色区间,并生成colorMask

    6.对colorMask做形态学开操作(为了取出多余的白色噪点)

    7.对colorMask做腐蚀操作(为了让橙子区域更加圆润)

    8.使用findContours执行轮廓查找

    9.过滤出出每一个colorMask中的最大轮廓,并找出最大轮廓的外接矩形(roiRect)

    10.将roiRect绘制到frame上查看效果

    11.完成

二、代码示例

 VideoCapture capture;
    capture.open(filePath);
    if(!capture.isOpened()){
        qDebug()<<"无法打开视频";
        return;
    }
    Mat frame,hsv;
    Mat colorMask;
    Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5),Point(-1,-1));
    while(capture.read(frame)){
        cvtColor(frame,hsv,COLOR_BGR2HSV);
        inRange(hsv,Scalar(11, 43, 46),Scalar(25, 255, 255),colorMask);
        //使用形态学开操作消除白点
        morphologyEx(colorMask,colorMask,MORPH_OPEN,kernel,Point(-1,-1),1);
        //使用形态学膨胀操作填充白色区间
        dilate(colorMask,colorMask,kernel,Point(-1,-1),1);

        //轮廓发现
        vector<vector<Point>> contours;
        vector<Vec4i> hir;
        Rect roi;
        findContours(colorMask,contours,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
        if(contours.size()>0){
            //过滤轮廓
            double maxArea = 0.0;
            for(size_t i = 0;i<contours.size();i++){
                double area = contourArea(contours[i]);
                if(area>maxArea){
                    maxArea = area;
                    roi = boundingRect(contours[i]);
                }
            }

        }
        //在原图上绘制轮廓
        rectangle(frame,roi,Scalar(0,0,255),3,LINE_8);
        imshow("frame",frame);
        imshow("colorMask",colorMask);
        int key = waitKey(100);
        qDebug()<<"key:"<<key;
        if(key==27){//ese键
            break;
        }
    }
    capture.release();

  

三、演示图像(视频就不传了,大家随便找个橙子然后移动橙子用相机拍照一段时间做测试就行,用手机拍摄就行)

 

posted on 2022-04-18 23:10  飘杨......  阅读(16)  评论(0编辑  收藏  举报