【OpenCV】车辆识别 C++ OpenCV 原理介绍 + 案例实现

article/2025/9/28 16:03:42

目录

前言 

一、图像处理

💻二值化处理

💻膨胀、腐蚀

💻开运算、闭运算

二、案例实现

Step1:灰度处理

Step2:对视频进行帧差处理

Step3:二值化处理

Step4:腐蚀处理

Step5:膨胀处理 

Step6:标记、框选目标

💡完整代码

三、总结 


前言 

本文主要以车辆识别为目标,利用 C++语言 结合 Qt + OpenCV 进行图像处理相关步骤的讲解

一、图像处理

💻二值化处理

二值化:是通过遍历灰度图中点,将图像信息二值化处理,处理过后的图片只有黑白两种色值

📍作用:

  • 图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果
  • 在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓

📍全局阈值:

函数:threshold()

参数:

参数1:InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可 

参数2:OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型

参数3:double类型的thresh,阈值的具体值

参数4:double类型的maxval,当第5个参数阈值类型type取 THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值

参数5:int类型的type,取阀值的算法

📍局部阈值:

函数:adaptiveThreshold()

参数:

参数1:InputArray类型的src,输入图像,填单通道,单8位浮点类型Mat即可

参数2:函数运算后的结果存放在这。即为输出图像

参数3:预设满足条件的最大值

参数4:指定自适应阈值算法,可选择ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C两种

参数5:指定阈值类型,可选择THRESH_BINARY或者THRESH_BINARY_INV两种

(即二进制阈值或反二进制阈值)

参数6:表示邻域块大小,用来计算区域阈值,一般选择为3、5、7等

参数7:参数C表示与算法有关的参数,它是一个从均值或加权均值提取的常数,可以是负数

💻膨胀、腐蚀

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

1️⃣膨胀过程 

膨胀是求局部最大值的操作,核B与图形卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素,这样就会使图像中的高亮区域逐渐增长

2️⃣腐蚀过程

腐蚀可以理解为B的中心(锚点)沿着A的内边界走了一圈。腐蚀也是对高亮部分而言,A区域之外的部分 < A的高亮像素,所里里面被外面取代

💻开运算、闭运算

1️⃣开运算:先腐蚀再膨胀,用来消除小物体 

2️⃣闭运算: 先膨胀再腐蚀,用于排除小型黑洞

二、案例实现

Step1:灰度处理

  • 将传入的两帧先进行处理,先将其转化成RGB类型图片再转化为灰度图 
    cvtColor(frontFrame,frontGray,CV_BGR2GRAY);//前一帧灰度处理cvtColor(afterFrame,afterGray,CV_BGR2GRAY);//后一帧灰度处理

Step2:对视频进行帧差处理

  • 将两帧图片进行帧差处理,将对比结果存储在diff中
    //【帧差法】对比两帧图像之间差异,捕获运动物体//缺点:所有运动的物体都会展现Mat diff;absdiff(frontGray,afterGray,diff);//前后两帧对比存在diff中
  • 灰度图 + 帧差处理后,效果如下:

Step3:二值化处理

  • 我们可以看到,公交车的识别区块并不是很明显,因此,接下来我们对视频进行二值化处理
    //【二值化】黑白分明//局部阈值threshold(diff,diff,25,255,CV_THRESH_BINARY);
  • 黑白更加分明,效果如下:

Step4:腐蚀处理

  • 我们会发现,二值化处理后,比原来多出好多的白色的小点,这时候我们就需要进行腐蚀处理,腐蚀掉<x*x方块大小的像素,这里设置了4*4,来清除大部分噪点 
    //【腐蚀处理】将背景中的白色噪点尽可能去除 降噪处理Mat element = cv::getStructuringElement(MORPH_RECT,Size(4,4));//小于4*4方块的白色噪点都会被腐蚀erode(diff,diff,element);
  • 腐蚀处理之后,效果如下:

Step5:膨胀处理 

  • 噪点相较于之前确实少了很多,但是运动的物体也被腐蚀掉了很多,可能会识别不到一些移动车辆,这里我们继续进行膨胀处理,将我们的目标像素图像变“胖”
    //【膨胀处理】将白色区域扩大,更加明显,利于目标识别Mat element2=cv::getStructuringElement(MORPH_RECT,Size(30,30));dilate(diff,diff,element2);
  • 膨胀处理后,效果如下:

Step6:标记、框选目标

  • 最后,将我们的目标像素图像进行标记,并且加一个框把移动的物体框选出来
    //动态物体的位置进行标记vector<vector<Point>>contours;findContours(diff,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(255,0,0),2);//Scalar颜色}
  • 完成上述所有步骤后,效果如下: 

💡完整代码

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;Mat MoveCheck(Mat &frontFrame,Mat &afterFrame)
{Mat frontGray,afterGray;//前后灰度处理Mat resFrame = afterFrame.clone();//【灰度处理】cvtColor(frontFrame,frontGray,CV_BGR2GRAY);//前一帧灰度处理cvtColor(afterFrame,afterGray,CV_BGR2GRAY);//后一帧灰度处理//【帧差法】对比两帧图像之间差异,捕获运动物体//缺点:所有运动的物体都会展现Mat diff;absdiff(frontGray,afterGray,diff);//前后两帧对比存在diff中//imshow("diff",diff);//【二值化】黑白分明//局部阈值threshold(diff,diff,25,255,CV_THRESH_BINARY);//imshow("threshold",diff);//【腐蚀处理】将背景中的白色噪点尽可能去除 降噪处理Mat element = cv::getStructuringElement(MORPH_RECT,Size(4,4));//小于4*4方块的白色噪点都会被腐蚀erode(diff,diff,element);//imshow("erode",diff);//【膨胀处理】将白色区域扩大,更加明显,利于目标识别Mat element2=cv::getStructuringElement(MORPH_RECT,Size(30,30));dilate(diff,diff,element2);//imshow("dilate",diff);//开运算:先腐蚀后膨胀,去掉高亮物体背景中白色的噪点,凸显高亮物体//闭运算:先膨胀后腐蚀,去掉高亮物体内部的黑色小坑洞,凸显高亮物体//动态物体的位置进行标记vector<vector<Point>>contours;findContours(diff,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(255,0,0),2);//Scalar颜色}return resFrame;
}
int main(int argc, char *argv[])
{Mat frame;Mat temp;Mat res;int count = 0;VideoCapture cap("C:/Users/86177/Desktop/image/carMove.mp4");//视频路径while(cap.read(frame)){count++;if(count == 1){res = MoveCheck(frame,frame);}else{res = MoveCheck(temp,frame);}temp = frame.clone();imshow("frame",frame);imshow("res",res);waitKey(25);//延时}return 0;
}

三、总结

  • 本文主要讲解了OpenCV图像处理基本的原理,包括帧差法二值化膨胀腐蚀开运算闭运算
  • 以车辆识别为例子,详细讲解了图像处理相关操作,在各个步骤是怎么样的一个效果
  • 车辆识别在我们日常生活中非常常见,是一个很经典的案例,本案例算是初步实现,但是,通过案例也发现,帧差法的缺点显而易见,测试视频存在很多干扰,比如说其他移动的物体,例如,风比较大,树叶跟着动,我们的框选位置就会受到干扰,不一定是我们预期想要的目标,接下来也会继续对这方面进行深入探究和学习,争取做到更好!

以上就是本文的全部内容啦!如果对您有帮助,麻烦点赞啦!收藏啦!欢迎各位评论区留言!!!


http://chatgpt.dhexx.cn/article/MP9MObjv.shtml

相关文章

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

目录 前言 一、目标检测技术 二、样本采集工作原理 三、创建自己的级联分类器 Step1&#xff1a;准备好样本图像 Step2&#xff1a;环境配置&#xff08;OpenCV win10&#xff09; Step3&#xff1a;设置路径 Step4&#xff1a;实现样本数据采集 Step5&#xff1a;实…

使用华为modelarts进行车辆识别

要求&#xff1a;从图像&#xff08;图3&#xff09;中检测并识别出车辆。车辆检测和识别算法可采用深度学习、BP网络或特征匹配等方法&#xff0c;方法不限。 图5-1待识别图像 原理&#xff1a;ModelArts是面向AI开发者的一站式开发平台&#xff0c;支持自动学习的功能&#…

车辆识别(特征提取+svm分类器)

以下为udacity的SDCND的一个项目 ps:这里使用的是用opencv进行特征提取+svm分类器的方法实现物体检测,是在深度学习流行前比较经典的实现方法 项目描述: 使用openCV提取图片特征,训练svm分类器,分类车辆与非车辆。用训练好的模型识别汽车前置摄像头记录视频中的车辆。 …

深度学习目标检测:YOLOv5实现车辆检测(含车辆检测数据集+训练代码)

深度学习目标检测&#xff1a;YOLOv5实现车辆检测(含车辆检测数据集训练代码) 目录 深度学习目标检测&#xff1a;YOLOv5实现车辆检测(含车辆检测数据集训练代码) 1. 前言 2. 车辆检测数据集说明 &#xff08;1&#xff09;车辆检测数据集 &#xff08;2&#xff09;自定…

案例-使用python实现基于opencv的车辆识别

写在开头&#xff0c;接触opencv也有很长一段时间了&#xff0c;中间还接触了halcon。但都是基于C实现&#xff0c;发现如果有什么idea&#xff0c;还是使用python可以快速实现。基于C版本的后期会有更新。 首先&#xff0c;这个案例是一个老生常谈的问题-车辆识别。首先我们要…

MySQL清空单表数据

一&#xff1a;问题背景 1. 问题描述 之前测试1千万数据插入MySQL数据库里面,分别使用单线程的方式和线程池的方式对比测试&#xff0c;查看效果,但是插入了1千万数据后,由于是测试数据,现在不能在新建一张表浪费存储空间,还是之前的表,要清空原来的数据.有哪些方式可用&#x…

mysql清空表数据_mysql数据库之如何清空表中数据

本篇文章主要讲述的是在数据库中使用清空命令&#xff0c;具有一定学习价值&#xff0c;有需要的朋友可以了解一下&#xff0c;希望能够对你有所帮助。 在做数据迁移&#xff0c;数据清洗或者写web项目时要将数据替换更新&#xff0c;那么有时要将表做清空处理 常用的清空数据表…

mysql删除表中所有数据_MySQL删除或清空表中数据的方法

原标题&#xff1a;MySQL删除或清空表中数据的方法 要想把MySQL中的数据删除或清空&#xff0c;可以通过两种方法来实现&#xff1a;DELETE语句和TRUNCATE TABLE语句。 DELETE语句可以将表中所有记录都删除&#xff0c;也可以指定WHERE子句&#xff0c;对要删除的记录进行选择;…

清空MySQL单库下所有表数据 || 删除MySQL单库下所有表

一、清空MySQL单库下所有表数据 -- 清空MySQL单库下所有表数据 SELECT CONCAT(truncate table ,TABLE_NAME,;) AS PLEASE_EXEC_ALL_SQL FROMinformation_schema.TABLES WHERETABLE_SCHEMA datagateway_std;如下图&#xff0c;然后复制所有查询结果&#xff0c;依次执行清表命…

Mysql如何清空数据库中所有的表数据

“db”是数据库名称 SELECT CONCAT(truncate table ,TABLE_NAME,;) AS a FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA db ; 全部复制出来运行即可 有外键约束的话&#xff0c;我们可以使用 SET FOREIGN_KEY_CHECKS0; 来禁用外键约束&#xff0c;执行完我们的语句之…

90个外国英文网站强力推荐!!!

2019独角兽企业重金招聘Python工程师标准>>> http://www.mtime.com/group/lazy/discussion/163374/ 转载于:https://my.oschina.net/crazyinsomnia/blog/2739

常用的英文文献网站

最常用的英文文献网站当然是&#xff1a;sci-hub。 除此之外&#xff0c;推荐几个比较常用的英文文献网站&#xff1a; Elsevier ScienceDirect 数据库试用&#xff1a; http://www.sciencedirect.com 科学引文索引数据库&#xff08;SCI&#xff09;学术资源&#xff1a; h…

十大实用网站推荐(1)

Iiconfont矢量图标库http://www.iconfont.cn/设计师必备网站&#xff0c;成千上万个矢量图标&#xff0c;真正的“图标库”&#xff1a; 稿定设计https://www.gaoding.com/有点懒&#xff1f;抠图太麻烦&#xff1f;做设计有点烦&#xff1f;来这个网站看看吧&#xff0c;懒人…

英语网站学习

一说到英语学习网站&#xff0c;脑子里肯定就是啥BBC&#xff0c;TED&#xff0c;华尔街日报啊&#xff0c;但如果你是英语小白&#xff0c;你一定看的懂吗&#xff1f;太多的专业词汇&#xff0c;看都看不懂&#xff0c;还怎么帮助你快速提升英语&#xff1f;英语网站是学习的…

强烈推荐这 15 个网站!

作者 | ithuangqing 来源 | 编码之外&#xff08;ID&#xff1a;ithuangqing&#xff09; 电子书&#xff1f;纸质书&#xff1f;我喜欢免费 不得不说&#xff0c;纸质书看起来是最有感觉的&#xff0c;可是纸质书也有非常不好的两点&#xff1a; 搬家的时候真的头大贵&#x…

常用的15个国外网站

1.Random-Image-Api 地址&#xff1a;https://source.unsplash.com/ Random-Image-Api 一个能够获取随机图片的 Api&#xff0c;基于 Spring Boot 构建可读取本地图片列表的地址&#xff0c;并提供随机访问服务&#xff0c;可配置域名白名单访问。 2. Carbon 地址&#xff1…

国外有什么好的网站推荐?

先来一张用百度脑图做的“国外优秀网站”思维导图&#xff0c;让你一目了然。 / 一&#xff0c;知识类 1、维基百科-自由的百科全书&#xff1a;点击打开链接 2、Coursera-致力于普及全世界最好的教育:点击打开链接 3、IMDB- 互联网电影资料库:点击打开链接http://www. …

国外常用网站

作者&#xff1a;Allen9527 链接&#xff1a;https://www.zhihu.com/question/20247711/answer/113476501 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 放眼看世界&#xff0c;才能看得更远 &#xff08;持续更…

浅谈什么是嵌入式以及嵌入式就业前景

近期&#xff0c;很多问我什么是嵌入式&#xff1f;其实关于这个问题真的不好实际性的形容表达&#xff0c;毕竟不是一个实物和东西&#xff0c;让你看到见摸的着&#xff0c;但是它确实存在你的生活中&#xff0c;工作中。今天粤嵌就来浅谈一下&#xff0c;什么是嵌入式以及嵌…

嵌入式软件开发工程师就业发展前景怎么样?

嵌入式技术虽然不是新兴的技术&#xff0c;但是随着科学的不断发展&#xff0c;嵌入式能应用的领域也越来越多&#xff0c;例如人工智能、互联网等&#xff0c;这么说起来嵌入式开发工程师的就业前景应该会很不错&#xff0c;下面小编就具体的为大家介绍关于嵌入式软件开发和硬…