【OpenCV】“帧差法”实现移动物体的检测(车辆识别)

这篇具有很好参考价值的文章主要介绍了【OpenCV】“帧差法”实现移动物体的检测(车辆识别)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、帧差法

1、概念

2、为什么帧差法可以检测运动的物体? 

二、使用OpenCV配合帧差法实现车辆识别

1、加载视频

2、灰度处理+帧差计算

3、二值化

4、腐蚀

5、膨胀

6、框选出车辆

三、全部代码+实现效果

1、代码

2、车辆检测效果

四、帧差法存在不足之处


一、帧差法

1、概念

        帧差法是一种通过对视频图像序列中 相邻两帧作差分运算 来获得运动目标轮廓的方法,它可以很好地适用于存在多个运动目标和摄像机移动的情况。

        当监控场景中出现异常物体运动时,帧与帧之间会出现较为明显的差别,两帧相减,得到两帧图像 亮度差的绝对值  ,判断它是否大于 阈值 来分析视频或图像序列的运动特性,确定图像序列中有无物体运动。

2、为什么帧差法可以检测运动的物体? 

        😎还记得小时候的葫芦娃动画吗?每个人物其实都是一张剪纸,也被叫做“剪纸动画”,剪一张就是一帧,假设葫芦娃动画为每秒25帧,1秒内连续播放25张不同的剪纸。

        😎因为每一帧之间是有差异的,所以我们可以看到剪纸 动 起来了。

帧差法,OpenCV,车辆识别,OpenCV,qt

  •  😋博主演示一遍剪纸动画,让大家更直观的感受

博主有以下同一条鲨鱼的不同形态的png图片,使用图片查看来切换显示每一张图片

帧差法,OpenCV,车辆识别,OpenCV,qt

 👀可以看到鲨鱼动起来了!!!

帧差法,OpenCV,车辆识别,OpenCV,qt

        😎因此可以通过判断 前后两帧是否相同 ,来判断是否有运动的物体,即通过帧差法来检测运动的物体。

 帧差法,OpenCV,车辆识别,OpenCV,qt

        😁所以下面跟着博主来学习使用OpenCV通过帧差法来进行移动车辆的识别。当然不止可以识别车辆,其他移动的物体也可以识别。

二、使用OpenCV配合帧差法实现车辆识别

  • 开发工具

         🔎Qt 5.8.0  +  OpenCV

1、加载视频

  • 通过VideoCapture来加载本地视频,循环读取每一帧并进行显示
int main(int argc, char *argv[])
{
    Mat frame;

    VideoCapture cap("D:/QT-Project/image/carMove.mp4");
    while(cap.read(frame))
    {
        //读取一帧显示一帧
        imshow("frame", frame);

        //延时
        waitKey(25);
    }
    return 0;
}

2、灰度处理+帧差计算

  • 为了提高计算机的运算速度,图像处理前一般将图像转成灰度图

        因为彩色图片是3通道(RGB)24位深度的图像,而灰度图是单通道8位深度的图像,因此处理灰度图比彩色图效率快多了。

  • frontMat为前一帧,afterMat为后一帧
//灰度处理
cvtColor(frontMat, frontGray, CV_BGR2GRAY);
cvtColor(afterMat, afterGray, CV_BGR2GRAY);

//帧差处理 找到帧与帧之间运动的物体差异
absdiff(frontGray, afterGray, diffGray);
  • 效果:原图(左)、处理后(右)

帧差法,OpenCV,车辆识别,OpenCV,qt

        通过下图可以发现检测是检测出来了,但是画面非常的暗淡(不清晰),因此需要通过二值化来让图像更清晰点。

帧差法,OpenCV,车辆识别,OpenCV,qt

3、二值化

  • 通过threshold函数将图像二值化

        参数一为原图,参数二为处理后的图,直接将处理后的图覆盖掉原图即可

//二值化:黑白分明 会产生大量白色噪点
threshold(diffGray, diffGray, 25, 255, CV_THRESH_BINARY);
  • 下面是二值化处理过后的效果

帧差法,OpenCV,车辆识别,OpenCV,qt

        可以发现图像确实是变“清晰”了,因为二值化后的图像只有黑白两种颜色。并且我们还可以发现白色噪点非常多,因为摄像机抖动,风吹树叶等原因,因此还需要通过腐蚀去除掉这些白色噪点

4、腐蚀

  • 概念

        腐蚀是针对图片的二值化数据进行操作的,主要是针对高亮部分。使用算法,将图像的边缘腐蚀掉。作用就是将目标的边缘的“毛刺”踢除掉。

如下图所示: 

帧差法,OpenCV,车辆识别,OpenCV,qt

  •  通过erode函数将图像进行腐蚀
//腐蚀处理:去除白色噪点 噪点不能完全去除,反而主要物体会被腐蚀的图案都变得不明显
Mat element = cv::getStructuringElement(MORPH_RECT, Size(3, 3));
erode(diffGray, diffGray, element);
  •  下面是腐蚀之后的效果

帧差法,OpenCV,车辆识别,OpenCV,qt

        😧白色噪点确实是被去除了,但是我们的车辆也被腐蚀的不成车样(内部坑坑洼洼的),所以还需要通过膨胀将车辆进行进一步处理。

5、膨胀

  • 概念

        膨胀是针对图片的二值化数据进行操作的,主要是针对高亮部分。使用算法,将图像的边缘扩大些。作用就是将目标的边缘或者是内部的坑填掉。

如下图所示:

帧差法,OpenCV,车辆识别,OpenCV,qt

  •  通过dilate函数将图像进行膨胀
//膨胀处理:将白色区域变“胖”
Mat element2 = cv::getStructuringElement(MORPH_RECT, Size(20, 20));

dilate(diffGray, diffGray, element2);
  •  下面是膨胀之后的效果 

帧差法,OpenCV,车辆识别,OpenCV,qt

        我们的车辆变成一个个大方块了,做到这一步差不多就可以来标记运动的车辆了,只要画矩形将白色大方块框起来即可。

6、框选出车辆

  • 下面是用白色的框框,框选出来的效果

帧差法,OpenCV,车辆识别,OpenCV,qt

        框选的原理就是找到白色方块最左边的点与最右边的点,得到之间的大小差距(矩形宽),找到白色方块最上边的点与最下边的点,得到之间的大小差距(矩形高)。

        通过宽高即可画出一个把白色方块包含在内的矩形,矩形左上角坐标通过白色方块最上方的值和最左方的值来确定。

  • 我们只要将白色方框改个显眼的颜色,并在原视频的对应位置画出这个框框即可。下面附全部代码。

三、全部代码+实现效果

1、代码

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

//帧差法检测车辆
Mat MoveCheck(Mat &frontMat, Mat &afterMat)
{
    Mat frontGray ,afterGray, diffGray;
    Mat resframe = afterMat.clone();
    //灰度处理
    cvtColor(frontMat, frontGray, CV_BGR2GRAY);
    cvtColor(afterMat, afterGray, CV_BGR2GRAY);
    //imshow("GRAY", frontGray);

    //帧差处理 找到帧与帧之间运动的物体差异
    //缺点:会把其他运动物体也算进来
    absdiff(frontGray, afterGray, diffGray);
    //imshow("absdiff", diffGray);

    //二值化:黑白分明 会产生大量白色噪点
    threshold(diffGray, diffGray, 25, 255, CV_THRESH_BINARY);
    //imshow("diff", diffGray);

    //腐蚀处理:去除白色噪点 噪点不能完全去除,反而主要物体会被腐蚀的图案都变得不明显
    Mat element = cv::getStructuringElement(MORPH_RECT, Size(3, 3));
    erode(diffGray, diffGray, element);
    //imshow("erode", diffGray);

    //膨胀处理:将白色区域变“胖”
    Mat element2 = cv::getStructuringElement(MORPH_RECT, Size(20, 20));
    dilate(diffGray, diffGray, element2);
    //imshow("dilate", diffGray);

    //动态物体标记
    vector<vector<Point>> contours; //保存关键点
    findContours(diffGray, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

    //提取关键点
    vector<vector<Point>> contours_poly(contours.size());
    vector<Rect> boundRect(contours.size());

    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, 255, 0), 4);
    }
    return resframe;
}

int main(int argc, char *argv[])
{
    Mat frame;
    Mat tempframe;
    Mat res;
    int count = 0;

    VideoCapture cap("D:/QT-Project/image/carMove.mp4");
    while(cap.read(frame))
    {
        count++;
        if(count == 1)
        {
            res = MoveCheck(frame, frame);
        }
        else
        {
            res = MoveCheck(tempframe, frame);
        }
        tempframe = frame.clone();
        imshow("frame", frame);//原视频帧
        imshow("res", res);//框选后的视频帧
        waitKey(25);
    }
    return 0;
}

2、车辆检测效果

 帧差法,OpenCV,车辆识别,OpenCV,qt

四、帧差法存在不足之处

  • 相机抖动+起风了

帧差法,OpenCV,车辆识别,OpenCV,qt

        帧差法虽然能够检测出运动的车辆,但是不仅包括车辆,任何运动的物体都会检测出来,就像上图所示,一旦相机抖动或者突然起大风,运动的物体就多了起来(两帧差异的地方很多),因此就会出现上面那种情况。

😘The end ……🔚

原创不易,转载请标明出处。

对您有帮助的话可以一键三连,会持续更新的(嘻嘻)。文章来源地址https://www.toymoban.com/news/detail-781496.html

到了这里,关于【OpenCV】“帧差法”实现移动物体的检测(车辆识别)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【OpenCV】车辆识别 目标检测 级联分类器 C++ 案例实现

    前言 一、目标检测技术 二、样本采集工作原理 三、创建自己的级联分类器 Step1:准备好样本图像 Step2:环境配置(OpenCV win10) Step3:设置路径 Step4:实现样本数据采集  Step5:实现样本数据训练 Step6:生成级联分类器文件  四、案例实现 Step1:灰度处理 Step2:二次压缩 Ste

    2024年02月05日
    浏览(32)
  • 【OpenCV】 车辆识别 运动目标检测

    目录 一:车辆识别 运动目标检测 二:车辆识别实现 超详细步骤解析 步骤一:灰度化处理 步骤二:帧差处理 步骤三:二值化处理 步骤四:图像降噪 4-1 腐蚀处理 目的 去除白色噪点 4-2 膨胀处理 目的 把白色区域变大 步骤五:提取关键点 框选运动目标检测 三:车辆识别 完

    2024年02月04日
    浏览(37)
  • 【FPGA目标跟踪】基于FPGA的帧差法和SAD匹配算法的目标跟踪实现

    quartusii12.1 FPGA整体的算法流程如下图所示:  FPGA的模块主要包括如下几大模块: 摄像机驱动程序,SDRAM控制程序,显示屏驱动程序,中值滤波程序,帧差法模块,SAD模板匹配模块,跟踪定位模块等等。 跟踪模块顶层程序 帧差法模块 SAD模板匹配模块,R通道 SAD模板匹配模块,

    2024年02月04日
    浏览(28)
  • OpenCV快速入门:移动物体检测和目标跟踪

    在当今的数字化世界中,计算机视觉技术正在迅速发展并被广泛应用于各种场合。特别是在移动物体检测和目标跟踪领域,这项技术不仅对于安全监控系统至关重要,也在自动驾驶、交互式媒体、机器人技术等多个领域发挥着重要作用。 本文将介绍使用OpenCV进行移动物体检测

    2024年02月04日
    浏览(31)
  • 竞赛选题 深度学习YOLOv5车辆颜色识别检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com

    2024年02月07日
    浏览(36)
  • 【毕业设计】深度学习YOLOv5车辆颜色识别检测 - python opencv

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月16日
    浏览(36)
  • 计算机竞赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com

    2024年02月08日
    浏览(32)
  • ZYNQ图像处理项目——帧差法运动目标跟踪

    帧差法顾名思义就是对输入的前后两帧图像做差值,然后检测出两帧图像不同的地方,并且可以实时跟踪运动的目标轮廓。 本设计是基于ZYNQ7010和VIVADO2018.3实现的帧差法运动目标检测,针对运动目标检测算法在传统 PC端上实时性较差的问题,设计了一种基于 ZYNQ 硬件加速的运

    2024年02月07日
    浏览(41)
  • python毕业设计 深度学习yolov5车辆颜色识别检测系统 - opencv

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月04日
    浏览(33)
  • 计算机设计大赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com

    2024年02月19日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包