机器学习1:OpenCV4.5.5加载xml进行车辆识别

article/2025/9/28 15:07:21

        深度学习准确率高识别效果好,但是对软硬件环境要求高,使用及部署有一定难度,应用受限。相比之下,机器学习效果差一个量级,但是计算量小,计算迅速,部署相对容易,尤其是在一些计算能力有限的嵌入式应用场合,因此这里打算学习一下基于OpenCV实现的机器学习,套路上打算先找一些例程学习怎么使用,再学习怎么训练自己的算法。

        先前在github上下载到了几个车辆识别的机器学习例程,但是发现大多是使用python实现的,不便应用于嵌入式项目中,这里我们尝试转为Visual Studio C/C++编码状态。

图1 github上下载的基于OpenCV用python实现的车辆识别代码及效果

         下载的源码随例程附带了训练好的算法模型xml文件、测试视频和.cpp样例源码:

图2 例程xml文件及附属的.cpp状态源码 

     一、Python转C/C++尝试与遇到的问题

        我们在VS2015下新建功能,加入该cpp文件,发现报错较多无法编译执行:

 图3 例程cpp文件编译报错

 检查发现,是因为我安装的是OpenCV4.5.5,版本较高,而从例程源码看,原作者使用的OpenCV版本偏低,因此许多功能函数已经变更,无法再使用。这里面主要是CvHaarClassifierCascade加载xml文件做目标检测识别的相关函数找不到新的定义所在,在网上搜索“OpenCV4.5 CvHaarClassifierCascade”、“OpenCV4.5 cvLoad”、“OpenCV4.5 机器学习”均找不到关于在OpenCV4.5.5状态下怎么加载xml进行机器学习目标检测识别的例程。

 二、思路与解决

        突然想到,我的OpenCV是在官网上下载了源码,然后在本地自行编译形成的OpenCV库,源码中包含了使用了例程Sample,其中一定有关于机器学习ml模块的使用样例,可以参考OpenCV源码自带的样例找到OpenCV4.5.5下机器学习的应用方法。

        最后在.\opencv-4.5.5\samples\cpp下找到一个人脸识别的例程:

  图4 OpenCV4.5.5自带的人脸识别cpp例程

把它拷贝出来加载到程序中,编译没有报错,运行也正常,它是一个启动电脑摄像头拍摄电脑前人员并进行人脸识别的例程:

  图5 OpenCV4.5.5自带的人脸识别cpp例程运行效果(人员做了部分隐藏处理)

        通过对比两个程序,参考OpenCV4.5.5自带的人脸识别例程方法,对github上下载的软件进行重新改编:

 图6 github例程xml加载方法与OpenCV4.5.5自带的人脸识别cpp例程对比

        对比发现,github下载的例程采用的是CvHaarClassifierCascade,用网上最常见的cvLoad(xml_file_path, 0, 0, 0)函数加载xml文件,而OpenCV4.5.5则采用了CascadeClassifier的.load(xml_file_path)函数形式加载。在具体识别上,github例程采用了cvHaarDetectObjects(...)函数,而OpenCV4.5.5例程则采用了.detectMultiScale()函数,并且还对目标做了翻转测试:

 图7 github例程目标检测函数与OpenCV4.5.5自带的人脸识别cpp例程对比

        结合github例程读取本地视频进行测验的方式,我们参考OpenCV4.5.5人脸识别cpp例程改编如下:

#include <opencv2/opencv.hpp>
#include <opencv2\objdetect\objdetect.hpp>
#include <iostream>
#include <string>
#include <fstream>

const int KEY_SPACE = 32;
const int KEY_ESC = 27;

//定义路径
const char *carCascade = "cars.xml";

void detectAndDraw(cv::Mat& img, cv::CascadeClassifier& cascade, double scale, bool tryflip)
{
    double t = 0;
    std::vector<cv::Rect> faces, faces2;
    const static cv::Scalar colors[] =
    {
        cv::Scalar(255,0,0),
        cv::Scalar(255,128,0),
        cv::Scalar(255,255,0),
        cv::Scalar(0,255,0),
        cv::Scalar(0,128,255),
        cv::Scalar(0,255,255),
        cv::Scalar(0,0,255),
        cv::Scalar(255,0,255)
    };
    cv::Mat gray, smallImg;

    cvtColor(img, gray, cv::COLOR_BGR2GRAY);
    double fx = 1 / scale;
    resize(gray, smallImg, cv::Size(), fx, fx, cv::INTER_LINEAR_EXACT);
    equalizeHist(smallImg, smallImg);

    t = (double)cv::getTickCount();
    cascade.detectMultiScale(smallImg, faces,
        1.1, 2, 0
        //|CASCADE_FIND_BIGGEST_OBJECT
        //|CASCADE_DO_ROUGH_SEARCH
        | cv::CASCADE_SCALE_IMAGE,
        cv::Size(30, 30));
    if (tryflip)
    {
        flip(smallImg, smallImg, 1);
        cascade.detectMultiScale(smallImg, faces2,
            1.1, 2, 0
            //|CASCADE_FIND_BIGGEST_OBJECT
            //|CASCADE_DO_ROUGH_SEARCH
            | cv::CASCADE_SCALE_IMAGE,
            cv::Size(30, 30));
        for (std::vector<cv::Rect>::const_iterator r = faces2.begin(); r != faces2.end(); ++r)
        {
            faces.push_back(cv::Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));
        }
    }
    t = (double)cv::getTickCount() - t;
    printf("detection time = %g ms\n", t * 1000 / cv::getTickFrequency());
    for (size_t i = 0; i < faces.size(); i++)
    {
        cv::Rect r = faces[i];
        cv::Mat smallImgROI;
        std::vector<cv::Rect> nestedObjects;
        cv::Point center;
        cv::Scalar color = colors[i % 8];
        int radius;

        double aspect_ratio = (double)r.width / r.height;
        if (0.75 < aspect_ratio && aspect_ratio < 1.3) {
            rectangle(img, cv::Point(cvRound(r.x*scale), cvRound(r.y*scale)),
                cv::Point(cvRound((r.x + r.width - 1)*scale), cvRound((r.y + r.height - 1)*scale)),
                color, 3, 8, 0);
        }
        else {
            center.x = cvRound((r.x + r.width*0.5)*scale);
            center.y = cvRound((r.y + r.height*0.5)*scale);
            radius = cvRound((r.width + r.height)*0.25*scale);
            circle(img, center, radius, color, 3, 8, 0);
        }
    }
    cv::imshow("cars", img);
}

int main(int argc, char** argv)
{
    std::cout << "Using OpenCV " << CV_MAJOR_VERSION << "." << CV_MINOR_VERSION << "." << CV_SUBMINOR_VERSION << std::endl;

    cv::Mat frame;
    cv::Mat frame1;
    cv::Size size;
    int input_resize_percent = 100;
    cv::CascadeClassifier casca;
    cv::VideoCapture vdocap;

    if (!casca.load(carCascade)) {
        std::cout << "CascadeClassifier Load " << carCascade << " Failed" << std::endl;
    }
    else {
        std::cout << "CascadeClassifier Load " << carCascade << " Success" << std::endl;
    }

    if (argc == 4) {
        input_resize_percent = atoi(argv[3]);
        std::cout << "Resizing to: " << input_resize_percent << "%" << std::endl;
    }

    vdocap.open("video1.avi");
    cv::namedWindow("cars", 1);

    vdocap.read(frame1);
    size = cv::Size((int)((frame1.cols*input_resize_percent) / 100), (int)((frame1.rows*input_resize_percent) / 100));
    frame = cv::Mat(size, frame1.depth(), frame1.channels());

    int key = 0;
    do {
        vdocap.read(frame1);
        if (frame1.empty())
            break;

        cv::resize(frame1, frame, size);
        //detect(frame);
        detectAndDraw(frame, casca, 1, true);

        //cv::imshow("video", frame1);
        key = cv::waitKey(40);

        if (key == KEY_SPACE)
            key = cv::waitKey(0);

        if (key == KEY_ESC)
            break;

    } while (1);

    cv::destroyAllWindows();
    frame.release();
    frame1.release();
    vdocap.release();

    return 0;
}
改编后的源码编译无误:

 图8 根据OpenCV4.5.5自带的人脸识别cpp例程改编github例程

        运行效果与python状态相近:

   图9 改编后运行效果图

至此,改编结束,下一步学习怎么训练自己的模型


http://chatgpt.dhexx.cn/article/5AUoavAf.shtml

相关文章

基于YOLOv5的车辆识别系统

基于YOLOv5的车辆识别系统&#xff08;展示&#xff09; 文章目录 基于YOLOv5的车辆识别系统&#xff08;展示&#xff09;前言车牌识别车型识别 前言 YOLO能实现图像或视频中物体的快速识别&#xff0c;在相同的识别类别范围和识别准确率条件下&#xff0c;YOLO识别速度最快。…

Review of Vehicle Recognition Technology - 车辆识别技术综述

Review of Vehicle Recognition Technology - 车辆识别技术综述 ZHANG Qiang, LI Jiafeng, ZHUO Li Faculty of Information Technology, Beijing University of Technology, Beijing 100124, China 北京工业大学信息学部&#xff0c;北京 100124 Beijing University of Tech…

deeplearning.36车辆识别YOLO算法实践

车辆识别 下载相关资料导入相关包数据集定义YOLO模型细节分类阈值过滤非最大值抑制非最大值抑制函数对所有框进行过滤 测试训练好的yolo模型定义分类、锚框、图像维度加载已经训练好的模型模型的输出转换为边界框过滤锚框实际图像中运行计算图实际预测一下 下载相关资料 下载本…

基于python的transform行人车辆识别

Transformer是一种神经网络体系结构&#xff0c;由于它能够有效地处理顺序数据中的长期依赖性&#xff0c;因此在自然语言处理(NLP)任务中受到欢迎。它还被应用于各种其他任务&#xff0c;包括图像分类、对象检测和语音识别。 在车辆和行人识别方面&#xff0c;transformer可用…

使用Python和docTR提取车辆识别号

VIN&#xff08;车辆识别号&#xff09;是一个17个字符的字符串&#xff0c;由数字和大写字母组成&#xff0c;用作汽车的指纹。 它可以帮助识别任何一辆汽车的寿命&#xff0c;并获得有关它的具体信息。该唯一标识符在制造过程中打印在车辆的某个位置&#xff0c;以便人们在租…

Opencv python之车辆识别项目(附代码)

文章目录 图片车辆识别视频车辆识别 图片车辆识别 根据文章搭建好环境后开始进行做项目link import sys import cv2 from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtGui import QIcon, QPalette, QPixmap, QBrush, QRegExpValidatorclass mainWin(QW…

java opencv 之车辆识别

上篇写了人脸识别&#xff0c;因为人脸识别的训练模型 haarcascade_frontalface_alt.xml 之类的官方已经训练好了可以直接用&#xff0c;但是我们要识别车辆或者其它物体就得训练模型&#xff0c;好在废了一点力 找到了一位大神训练好的模型 核心代码 几乎和人脸识别的差不多 s…

如何开发一个车牌识别,车牌识别系统,车辆识别系统毕业设计毕设作品

开发准备 第1步&#xff1a;准备好百度智能云的账号 第2步&#xff1a;在百度智能云领取对应AI开发的免费资源包 第3步&#xff1a;创建对应的应用&#xff0c;然后获取对应的开发信息&#xff0c;主要是下面几个 AppID&#xff1a;应用列表中 API Key&#xff1a;应用列表…

车辆识别

一&#xff1a;简介 车牌识别系统(Vehicle License Plate Recognition&#xff0c;VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息&#xff08;含汉字字符、英文字母、阿拉伯数字及号牌颜色&#xff09;进行处理的技术。车牌识别是现代智能交通系统中的重要组成…

【OpenCV】 车辆识别 运动目标检测

目录 一&#xff1a;车辆识别 运动目标检测 二&#xff1a;车辆识别实现 超详细步骤解析 步骤一&#xff1a;灰度化处理 步骤二&#xff1a;帧差处理 步骤三&#xff1a;二值化处理 步骤四&#xff1a;图像降噪 4-1 腐蚀处理 目的 去除白色噪点 4-2 膨胀处理 目的 把白…

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

目录 前言 一、图像处理 &#x1f4bb;二值化处理 &#x1f4bb;膨胀、腐蚀 &#x1f4bb;开运算、闭运算 二、案例实现 Step1&#xff1a;灰度处理 Step2&#xff1a;对视频进行帧差处理 Step3&#xff1a;二值化处理 Step4&#xff1a;腐蚀处理 Step5&#xff1a…

【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;依次执行清表命…