C++|监控车辆识别

监控车辆识别(“好年华 聚福州”实践课) AI模拟环境配置 什么是OpenCV
OpenCV的全称是:Open Source Computer Vision Library OpenCV是Intel开源计算机视觉库。 它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。 相对于Matlab而言,OpenCV基于C语言开发,编程复杂,开发周期较长。
什么是Cmake
CMake (Cross platform Make)是一个开源的跨平台自动化构建工具, 可以跨平台地生成各式各样的 makefile 或者 project 文件,
支持利用各种编译工具生成可执行程序或链接库。 CMake 自己不编译程序, 它相当于用自己的构建脚本 CMake Lists.txt,叫各种编译工具集去生成可执行程序或链接库。
一般用于编译程序的 makefile 文件比较复杂,自己去编写比较麻烦, 而利用 CMake ,就可以编写相对简单的 CMake Lists.txt ,由 CMake 根据 CMake 是什么? 有什么用 CMake
CMake 是一个跨平台的编译 (Build)工具,可以用简单的语句来描述所有平台的编译过程。
什么是Qt?
Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。
Qt 存在 Python、Ruby、Perl 等脚本语言的绑定, 也就是说可以使用脚本语言开发基于 Qt 的程序。
Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone, 嵌入式系统 QNX、VxWorks 等等。
opencv通过cmake完成编译后会产生什么结果呢?
会在我们指定的build目录下产生一个install文件
x86目录下表示我们之前编译opencv是32版本的x86
x86目录下\bin目录下就会生成*.dll文件
dll文件是我们编写的函数,通过编译生成的二进制文件
通过开发工具调用dll文件,就可以实现调用。
opencv里的函数,是我们编译opencv开源框架最终的结果。
搭建过程
1、安装Qt creator和cmake
Qt creator作为编写C++代码的集成开发环境,cmake用来编译opencv源代码
2、下载Opencv包也可以直接使用编译好的opencv包
C++|监控车辆识别
文章图片

3、配置Qt中导入opencv相关库
在Qt Creator中创建一个新项目的步骤:
1.打开Qt Creator, 点击文件新建文件或项目
2.选择项目类型,本次编写的程序不需要使用openCV以外的其他框架,故选择空白C++项目,即Non-Qt project 中的Plain C++ Application
3.设置项目名称即存放路径,避免出现非ASCII字符。
4.组件选择MinGw,其余默认,确定后即创建好了-个带He11o world的C+项目,屏幕左侧下方
导入OpenCV相关库文件的方法如下,主要是对. pro文件进行修改,导入其他库文件的方法类似:
1.在.pro文件中添加INCLUDEPATH += *,★ 为头文件文件夹路径,即openCv的include文件夹
2.在.pro文件中添加LIBS += ,★ 为库文件路径,即openCV的bin文件夹下的.d11文件,可用表示符合某命名规则的一系列文件,如LIBS +=D:/opencv_ 3.4.2 Qt/opencv_ 3.4.2 Qt/x86/bin/libopencv_ * . d11表示将D:/opencv_ 3.4.2 Qt/opencv. 3.4.2 Qt/ x86/bin/下的所有以libopencv_开头的.d11文件导
3.在源代码中加入#include ,其中opencv . hpp是所有opencv函数的声明文件

TEMPLATE = app CONFIG += console c++11 CONFIG -= app_bundle CONFIG -= qtSOURCES += main.cppINCLUDEPATH += D:/Qt/opencv_3.4.2_Qt/include LIBS += D:/Qt/opencv_3.4.2_Qt/x86/bin/libopencv_*.dll

车辆识别功能实现 基本思路
1、视频是由-系列图片组成,处理视频即逐帧处理图片。
2、视频中只有车辆是运动的,可以通过找出运动的物体从而标记车辆。要识别运动的物体,有两种方法,-是帧差识别法,- 二是级联分类器识别,本次采用帧差识别。
3、算机不擅长处理彩色图片,最好将图片转为黑白并二值化为只有黑白
4、为了提高识别准确度,需要通过腐蚀和过滤来减小噪声干扰,然后还要进行膨胀以方便标出位置
5、物体的轮廓是点的集合,物体轮廓的集合就是点的集合的集合
具体源码和注释
#include #include //opencv.hpp是所有opencv函数的声明文件,此后调用的所有函数,都在opencv.hpp中声明using namespace std; using namespace cv; //opencv有自己的命名空间Mat MoveDetect(Mat frame1, Mat frame2); Mat MoveDetect(Mat frame1, Mat frame2) { //使用帧差法识别视频中运动的物体 Mat result = frame2.clone(); Mat diff; //暂存两张图片的差异 Mat gray1, gray2; cvtColor(frame1,gray1,CV_BGR2GRAY); cvtColor(frame2,gray2,CV_BGR2GRAY); //把两张灰度图片进行前后对比 absdiff(gray1, gray2, diff); imshow("absdiff",diff); //为了增加图像的边缘,要使用二值化进行处理 //所谓二值化,就是把黑白图片转换成只有01表示的数据 threshold(diff,diff,25,255,CV_THRESH_BINARY); imshow("threshold",diff); //还要经过图像腐蚀(即增加黑色部分,减少白色部分) Mat element1 = getStructuringElement(MORPH_RECT, Size(3,3)); Mat element2 = getStructuringElement(MORPH_RECT, Size(19,19)); erode(diff,diff,element1); imshow("erode",diff); //中值滤波相关知识:卷积计算 //在常见的图像处理中,如果图片中有一些噪点,常用的是使用模糊处理来消除噪点 //这个过程叫做过滤:过滤分为线性过滤和非线性过滤 //所谓卷积,其实就是把图像中的每一个元素的值根据这个元素周边像素的值进行一系列运算 //运算方式有很多种,最终目的是一直图像中原有的噪声,达到图像平滑的目的 //根据不同的算法:会衍生出:中值滤波、双边滤波等等,我们的例子当中使用中值滤波 medianBlur(diff, diff, 3); imshow("medianBlur",diff); //再利用膨胀把白色的部分放大,便于识别 dilate(diff, diff, element2); imshow("dilate", diff); //******************************以上只是opencv的api函数的灵活使用 //已经把运动中的物体用白色方块显示出来了,关键一步怎样去识别 //这里就需要使用C++的标准模板库 vector contours; //contours轮廓 findContours(diff,contours,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE,Point(0,0)); //到这里为止opencv会把白色物体轮廓保存到contours这个向量中return result; }int main() { //opencv在设计的时候就有专门的类来负责读取摄像头里的数据; VideoCapture cap("D://Qt//carMove2.mp4"); //opencv是机器视觉处理框架,处理视频的时候也是以每帧图片进行处理 //opencv中保存图片的数据类型叫Mat是给类 Mat frame; Mat result; Mat tmp; int count = 0; //表示第一帧开始 while(cap.read(frame)) { count++; if(count==1)//表示刚开始的第一帧 { result = MoveDetect(frame,frame); } else { result = MoveDetect(tmp,frame); } tmp = frame.clone(); imshow("video",frame); //显示图片 waitKey(10); //延迟10毫秒显示每帧图片 } cap.release(); cout << "Hello World!" << endl; return 0; }

原视频某帧
C++|监控车辆识别
文章图片

【C++|监控车辆识别】各种处理后某帧
C++|监控车辆识别
文章图片

    推荐阅读