OpenCV实现车辆识别和运动目标检测
作者:我今年十六岁 发布时间:2023-09-22 18:55:40
标签: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;
}
当然,夜晚的车辆也能够正常识别
不过,本次的帧差法的车辆识别存在弊端,只要是运动的物体都会识别,比如,博主打开摄像头,动一动手指头,也会被框选识别,因此是有一定弊端的
不过,这种帧差法的运动目标检测,在夜晚监控中是非常广泛地应用到,因为有任何的风吹草动,都会被框选识别。
来源:https://blog.csdn.net/m0_56051805/article/details/126062172
0
投稿
猜你喜欢
- 1. 什么是XSLT 大家可能听说过XSL(eXtensible Stylesheet Language),XSL和我们这里说的XSLT从狭
- 这篇文章主要介绍了python批量启动多线程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 目录1. lru_cache的使用1.1 参数详解1.2 基本用法1.3 进阶用法2. functiontools.wrap装饰器对lru_
- 显示一个字符串的前几个字符,asp中我们一般使用left(str,n)来获取。left有个不足就是处理汉字和英文字符是一样的,没有区分开,这
- 微软建议用Request.BinaryRead()读取表单数据,但由于这种方法读出的是二进制数据,需要对读出的数据逐字节进行分析,生成有意义
- 前言:本文研究的主要是Python实现pig Latin小游戏的简单代码,具体介绍如下。Pig Latin是一个语言游戏。步骤:1.让用户输
- 我就废话不多说了,大家还是直接看代码吧~'''Created on 2018-4-16'''
- 前言大家都知道Python内置的常量不多,只有6个,分别是True、False、None、NotImplemented、Ellipsis、_
- 如何用表单在线建立目录?很简单,两个文件就搞定了:creatfolder.htm' 表单文件<form n
- 前言ThinkPHP出于安全的考虑增加了表单令牌Token,由于通过Ajax异步更新数据仅仅部分页面刷新数据,就导致了令牌Token不能得到
- 对于一个给定的字符串,逆序输出,这个任务对于python来说是一种很简单的操作,毕竟强大的列表和字符串处理的一些列函数足以应付这些问题 了,
- Python中 join() 函数的使用函数:string.join()Python中有join()和os.path.join()两个函数,
- 视图是 MTV 设计模式中的 V 层,它是实现业务逻辑的关键层,可以用来连接 M 层与 T 层,起着纽带般的作用,在《Django MTV和
- 1 概述利用Python生成简单的词云,需要的工具是cython,wordcloud与anaconda.2 准备工作包括安装cython,w
- 大家好,今天给大家分享一下明哥整理的一篇 Python 参数的内容,内容非常的干,全文通过案例的形式来理解知识点,自认为比网上 80% 的文
- 阅读上一章:[翻译]标记语言和样式手册 Chapter 15 为body指定样式Chapter 16 下一步现在你知道了如何使用标准改进你的
- Python httpx 运行过程中无限阻塞requests 模块只支持 http1,在遇到 http2 的数据接口的时候(某乎的搜索接口)
- 问题:如何保护自己的ASP源代码不泄露? 答:下载微软的Windows Script Encoder,对ASP的脚本和客户端javascri
- Pynimate介绍Pynimate是python第三方用于动态可视化的数据模块。安装pip install pynimate实验示例fro
- MaxDB和MySQL是独立的数据库管理服务器。系统间的协同性是可能的,通过相应的方式,系统能够彼此交换数据。要想在MaxDB和MySQL之