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

 更新时间:2022年08月01日 11:23:48   作者:我今年十六岁  
本文主要介绍了OpenCV实现车辆识别和运动目标检测,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一:车辆识别成果展示

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

步骤一:灰度化处理

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

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

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

 步骤二:帧差处理

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

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

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

步骤三:二值化处理

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

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

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

步骤四:图像降噪

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

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

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

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

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

    //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);
    }

三:车辆识别完整代码

#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车辆识别和运动目标检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python itchat实现调用微信接口的第三方模块方法

    python itchat实现调用微信接口的第三方模块方法

    这篇文章主要介绍了python itchat实现调用微信接口的第三方模块方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • python黑魔法之编码转换

    python黑魔法之编码转换

    这篇文章主要介绍了python黑魔法之编码转换,分析了python编码转换的方法,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Python正则表达式的应用详解

    Python正则表达式的应用详解

    这篇文章主要介绍了Python中正则表达式的详细教程,正则表达式是Python学习进阶当中的重要内容,需要的朋友可以参考下,希望能给你带来帮助
    2021-08-08
  • 如何关掉pycharm中的python console(图解)

    如何关掉pycharm中的python console(图解)

    本文通过图文并茂的形式给大家介绍了如何关掉pycharm中的python console,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • Python处理字节串:struct.pack和struct.unpack使用

    Python处理字节串:struct.pack和struct.unpack使用

    这篇文章主要介绍了Python处理字节串:struct.pack和struct.unpack使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • python多进程使用函数封装实例

    python多进程使用函数封装实例

    这篇文章主要介绍了python多进程使用函数封装实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 解决TensorFlow训练内存不断增长,进程被杀死问题

    解决TensorFlow训练内存不断增长,进程被杀死问题

    今天小编就为大家分享一篇解决TensorFlow训练内存不断增长,进程被杀死问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Django静态文件配置request对象方法ORM操作讲解

    Django静态文件配置request对象方法ORM操作讲解

    这篇文章主要为大家介绍了Django静态文件配置request对象方法ORM操作,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 使用Py2Exe for Python3创建自己的exe程序示例

    使用Py2Exe for Python3创建自己的exe程序示例

    今天小编就为大家分享一篇使用Py2Exe for Python3创建自己的exe程序示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 如何使用 python查询Amazon DynamoDB

    如何使用 python查询Amazon DynamoDB

    本文介绍了如何使用Python Boto3在Amazon DynamoDB上查询DynamoDB 表、创建、列出和执行其他 CRUD 活动以及执行其他维护任务,本文给大家介绍的非常详细,需要的朋友参考下
    2023-06-06

最新评论