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

作者:我今年十六岁 时间:2023-09-22 18:55:40 

一:车辆识别成果展示

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实现车辆识别和运动目标检测

不过,这种帧差法的运动目标检测,在夜晚监控中是非常广泛地应用到,因为有任何的风吹草动,都会被框选识别。 

来源:https://blog.csdn.net/m0_56051805/article/details/126062172

标签:OpenCV,车辆识别,运动目标检测
0
投稿

猜你喜欢

  • Python 实现定积分与二重定积分的操作

    2023-08-05 18:22:27
  • python中matplotlib实现随鼠标滑动自动标注代码

    2023-09-02 10:49:47
  • asp如何编写sql语句来查询|搜索数据记录

    2008-10-09 12:35:00
  • 通过创建SQLServer 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案

    2024-01-28 00:05:46
  • python3设计模式之简单工厂模式

    2021-02-16 15:51:18
  • Python+Pyecharts实现散点图的绘制

    2023-09-02 05:01:29
  • Python2与Python3关于字符串编码处理的差别总结

    2022-05-21 19:09:51
  • 在Yii框架中使用PHP模板引擎Twig的例子

    2023-11-14 11:30:30
  • django自定义Field实现一个字段存储以逗号分隔的字符串

    2021-03-28 16:24:51
  • Java与Python之间使用jython工具类实现数据交互

    2023-10-06 18:44:09
  • 总结Python连接CS2000的详细步骤

    2023-04-21 20:26:33
  • Golang开发命令行之flag包的使用方法

    2024-02-16 09:26:04
  • Python3使用TCP编写一个简易的文件下载器功能

    2021-02-20 09:58:07
  • Python+logging输出到屏幕将log日志写入文件

    2023-07-19 05:29:21
  • 如何使用Python 抓取和优化所有网站图像

    2022-05-18 12:36:00
  • Data URI小试 —— 在旺旺点灯(JS)上的应用

    2009-10-30 18:28:00
  • Django 自动生成api接口文档教程

    2022-09-11 06:40:26
  • Python实现的批量下载RFC文档

    2021-11-25 02:54:48
  • python游戏开发之视频转彩色字符动画

    2022-05-18 21:11:23
  • MySQL数据库入门之备份数据库操作详解

    2024-01-24 07:10:05
  • asp之家 网络编程 m.aspxhome.com