温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

OpenCV如何实现车辆识别和运动目标检测

发布时间:2022-08-01 11:00:54 来源:亿速云 阅读:202 作者:iii 栏目:开发技术

本篇内容介绍了“OpenCV如何实现车辆识别和运动目标检测”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    一:车辆识别成果展示

    OpenCV如何实现车辆识别和运动目标检测

    二:车辆识别超详细步骤解析

    步骤一:灰度化处理

    灰度处理目的 RGB三通道转灰度单通道 压缩到原图片三分之一大小

    效果展示:【避免内存浪费 帧差法对前后帧图像灰度化处理】

    OpenCV如何实现车辆识别和运动目标检测

    //1 灰度处理 目的 RGB三通道转灰度单通道 压缩到原图片三分之一大小
        cvtColor(frontFrame,frontGray,CV_RGB2GRAY);//前一帧灰度化处理
        cvtColor(afterFrame,afterGray,CV_RGB2GRAY);//后一帧灰度化处理
        //imshow("frontGray",frontGray);//测试
        //imshow("afterGray",afterGray);//测试

     步骤二:帧差处理

    帧差处理目的 找到帧与帧之间的差异(正在运动的物体)

    效果展示:【运动目标的检测:运动事物显示灰度,静止事物显示黑度】

    OpenCV如何实现车辆识别和运动目标检测

     //2 帧差处理 目的 找到帧与帧之间的差异(正在运动的物体)
        Mat diff;
        Mat frontGray,afterGray;
        absdiff(frontGray,afterGray,diff);//前后帧对比存于diff中
        imshow("diff",diff);//测试

    步骤三:二值化处理

    二值化处理 目的 将灰度图继续识别转换为黑白分明的图像

    效果展示:【步骤二中运动事物显示灰度,静止事物显示黑度,在这里进行二值化处理,能够黑白分明,便于计算机识别运动目标,如下右图二值化处理后黑白分明】【缺点:存在白色噪点,如下右图除了车辆外后面的背景也显示白度,这就是白色噪点,需要去除】

    OpenCV如何实现车辆识别和运动目标检测

        //3 二值化处理 目的 将灰度图继续识别转换为黑白分明的图像
        threshold(diff,diff,25,255,CV_THRESH_BINARY);
        imshow("threshold",diff);//测试

    步骤四:图像降噪

    4-1 腐蚀处理 目的 去除白色噪点

    效果展示:【步骤三中存在的白色噪点能够去除,但是在去除白色噪点的同时,也影响了车辆的白度显示,如下右图可以看出,车辆白度显示有所降低,因此还是需要改进】

    OpenCV如何实现车辆识别和运动目标检测

        //4 图像降噪
        //4-1 腐蚀处理 目的 去除白色噪点
        Mat element = cv::getStructuringElement(MORPH_RECT,Size(3,3));//小于3*3方块的白色噪点都会被腐蚀
        erode(diff,diff,element);
        imshow("erode",diff);//测试

    4-2 膨胀处理 目的 把白色区域变大

    效果展示:【如下右图,将车辆形状大致显示,便于框选车辆识别操作】

    OpenCV如何实现车辆识别和运动目标检测

        //4-2 膨胀 目的 把白色区域变大
        Mat element2=cv::getStructuringElement(MORPH_RECT,Size(20,20));
        dilate(diff,diff,element2);
        imshow("dilate",diff);//测试

    步骤五:提取关键点 框选运动目标检测

    效果展示:车辆识别成功

    OpenCV如何实现车辆识别和运动目标检测

        //5 提取关键点
        //5-1 查找特征点
        vector<vector<Point>>contours;
        findContours(diff,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
     
        //5-2 提取关键点
        vector<vector<Point>>contours_poly(contours.size());
        vector<Rect>boundRect(contours.size());
     
        //5-3 确定下四个点来用于框选目标物体
        int x,y,w,h;
        int num=contours.size();
        for(int i = 0;i < num;i++)
        {
            approxPolyDP(Mat(contours[i]),contours_poly[i],3,true);
            //多边拟合
            boundRect[i]=boundingRect(Mat(contours_poly[i]));
            x=boundRect[i].x;
            y=boundRect[i].y;
            w=boundRect[i].width;
            h=boundRect[i].height;
            //绘制矩形
            rectangle(resFrame,Point(x,y),Point(x+w,y+h),Scalar(0,0,255),2);
        }

    三:车辆识别完整代码

    #include <iostream>
    #include <opencv2/opencv.hpp>
     
    using namespace std;
    using namespace cv;
     
    Mat moveCheck(Mat &frontFrame,Mat &afterFrame)
    {
        Mat resFrame,diff;
        Mat frontGray,afterGray;
     
        //克隆当前帧画面 返回最终结果
        resFrame = afterFrame.clone();
     
        //1 灰度处理 目的 RGB三通道转灰度单通道 压缩到原图片三分之一大小
        cvtColor(frontFrame,frontGray,CV_RGB2GRAY);
        cvtColor(afterFrame,afterGray,CV_RGB2GRAY);
     
        //imshow("frontGray",frontGray);
        //imshow("afterGray",afterGray);
     
        //2 帧差处理 目的 找到帧与帧之间的差异(正在运动的物体)
        absdiff(frontGray,afterGray,diff);
        //imshow("diff",diff);
     
        //3 二值化处理 目的 将灰度图继续识别转换为黑白分明的图像
        threshold(diff,diff,25,255,CV_THRESH_BINARY);
        //imshow("threshold",diff);
     
        //4 图像降噪
        //4-1 腐蚀处理 目的 去除白色噪点
        Mat element = cv::getStructuringElement(MORPH_RECT,Size(3,3));//小于3*3方块的白色噪点都会被腐蚀
        erode(diff,diff,element);
        //imshow("erode",diff);
     
        //4-2 膨胀 目的 把白色区域变大
        Mat element2=cv::getStructuringElement(MORPH_RECT,Size(20,20));
        dilate(diff,diff,element2);
        //imshow("dilate",diff);
     
        //5 提取关键点
        //5-1 查找特征点
        vector<vector<Point>>contours;
        findContours(diff,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
     
        //5-2 提取关键点
        vector<vector<Point>>contours_poly(contours.size());
        vector<Rect>boundRect(contours.size());
     
        //5-3 确定下四个点来用于框选目标物体
        int x,y,w,h;
        int num=contours.size();
        for(int i = 0;i < num;i++)
        {
            approxPolyDP(Mat(contours[i]),contours_poly[i],3,true);
            //多边拟合
            boundRect[i]=boundingRect(Mat(contours_poly[i]));
            x=boundRect[i].x;
            y=boundRect[i].y;
            w=boundRect[i].width;
            h=boundRect[i].height;
            //绘制矩形
            rectangle(resFrame,Point(x,y),Point(x+w,y+h),Scalar(0,0,255),2);
        }
     
        return resFrame;
    }
     
    int main(int argc, char *argv[])
    {
        Mat frame;
        Mat temp;
        Mat res;
        int count = 0;
     
        VideoCapture cap("D:/00000000000003jieduanshipincailliao/carMove.mp4");//视频路径
     
        while (cap.read(frame))
        {
            count++;
            if(count == 1)
            {
                res = moveCheck(frame,frame);
            }
            else
            {
                res = moveCheck(temp,frame);
            }
            imshow("frame",frame);
            imshow("res",res);//最终车辆识别成果
            temp = frame.clone();
            waitKey(15);
        }
        return 0;
    }

    当然,夜晚的车辆也能够正常识别

    OpenCV如何实现车辆识别和运动目标检测

    不过,本次的帧差法的车辆识别存在弊端,只要是运动的物体都会识别,比如,博主打开摄像头,动一动手指头,也会被框选识别,因此是有一定弊端的

    OpenCV如何实现车辆识别和运动目标检测

    “OpenCV如何实现车辆识别和运动目标检测”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI