Linux系统使用opencv训练xml分类器进行车辆识别

linux系统下打开usb摄像头:
“虚拟机--可移动设备--camera -- 连接”
通过opencv中自带的opencv_createsamples(用于准备训练数据的正样本和测试样本)和opencv_traincascade进行训练生成分类器。
首先准备好要参与训练的正样本和负样本。可从以下链接自取opencv汽车分类训练正负样本
请添加图片描述
请添加图片描述
接下来创建一个名为train的新文件夹,在新建的文件夹train里面再新建两个文件夹,car_pos文件夹放正样本,car_neg文件夹放负样本。将opencv自带的两个分类器复制过来train里面(这里博主使用的是opencv4.5,没有自带的分类器,opencv3.4.1有两个可执行文件opencv_createsamples.exe和opencv_traincascade.exe。将这两个文件拷贝到训练文件夹下。这里提供一个可在windows下使用的分类器opencv3.4.1分类器)。

为正样本创建描述文件格式文件pos.txt,即在car_pos文件夹里新建pos.txt文件,然后在cmd里cd到car_pos文件夹下,执行

dir /b > pos.txt

然后在pos.txt文件里搜索 ‘pos.txt’ ,将这一行删除,最终为下图所示
在这里插入图片描述
对于负样本也同样在car_neg文件夹里新建neg.txt文件,然后在cmd里cd到car_neg文件夹下,执行

dir /b > neg.txt

在neg.txt文件里搜索 ‘neg.txt’ ,将这一行删除,最终为下图所示
在这里插入图片描述
接下来在train文件中创建一个data文件,data文件是用来装训练之后输出的xml文本的。
在train文件中打开终端,输入以下命令

opencv_createsamples.exe info pos.txt -vec pos_samples.vec -num 840 -w 32 -h 24

其中,-info字段填写正样本描述文件;-vec用于保存制作的正样本;-num制定正样本的数目;-w和-h分别指定正样本的宽和高。

输出文件是以.vec为后缀的包含图像信息的二进制数据类型。
继续输入以下命令即将开始训练。

opencv_traincascade.exe -data data -vec pos_samples.vec -bg neg.txt -numPos 610 -numNeg 1500 -numStages 15 -featureType HAAR -w 32 -h 24

在这里插入图片描述
报这个错是因为负样本的路径问题。或者文件内有空格
改成以下即可
在这里插入图片描述
再次运行,开始漫长的训练过程
在这里插入图片描述
请添加图片描述
至此训练结束,在data文件夹中生成了很多xml文件,有用的只有cascade.xml

在vscode中新建main.cpp,配置opencv库(参考前几篇博客),之后输入以下代码。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

String cascade_name = "/home/llw/桌面/tt/data/cascade.xml";
String window_name = "Capture - car detection";
CascadeClassifier customFaceDetector;

Mat image;
Mat gray_src;

int main() {
    //cout << "Built with OpenCV " << CV_VERSION << endl;
    VideoCapture capture; //VideoCapture(0) 打开摄像头
    capture.open(0);
    if(capture.isOpened()){
        cout << "Capture is opened" << endl;

        for(;;) //死循环
        {
            vector<Rect> faces;
            capture >> image;

            if (!customFaceDetector.load(cascade_name))
            {
                cout<<"could not load face data...\n"<<endl;
                return 0;
            }

            if(image.empty())
                break;

            //namedWindow("IMAGE",WINDOW_AUTOSIZE);
            //imshow("image", image);

            cvtColor(image, gray_src, COLOR_BGR2GRAY); //gray灰色
            equalizeHist(gray_src, gray_src); //均衡化

            customFaceDetector.detectMultiScale(gray_src, faces, 1.1, 2, 0, Size(50, 50));

            for (size_t t = 0; t < faces.size(); t++){
                rectangle(image, faces[t], Scalar(0, 0, 255), 3); 
            }

            //namedWindow(window_name, CV_WINDOW_AUTOSIZE);
            imshow(window_name, image);

            /*char c=waitKey(1);
            if(c==3){
                break;
            }*/

            if(waitKey(3) >= 0) 
                break;
        }
    }

    else
    {
        cout << "No capture" << endl;
        image = Mat::zeros(480, 640, CV_8UC1);
        //drawText(image);
        imshow("Test", image);
        waitKey(0);
    }

    return 0;
}

运行效果如下。
请添加图片描述
至此完成了使用opencv进行车辆识别的功能。

互联网学习 文章被收录于专栏

互联网知识点

全部评论
看着真专业啊
点赞 回复 分享
发布于 2022-08-10 15:24

相关推荐

已经入职字节快一个月了,突然想起来之前那段时间的面经没有发,先发一下timeline吧。Tiktok&nbsp;内容安全平台(人才库电话捞我):电话10.28&nbsp;-&gt;&nbsp;一面10.30(我觉得你跟我们组业务挺match的,然后过了三天问hr挂了,应该是别人流程更快)阿里淘天:投递11.11-&gt;约面11.12-&gt;一面11.14(问得很简单,30分钟,手撕八股全过无后续)Kpi面腾讯wxg&nbsp;微信小程序:投递11.13&nbsp;-&gt;约面11.14-&gt;&nbsp;一面11.17&nbsp;(究极无敌拷打,问我多模态大模型涉及的算法?但是人很好)-&gt;11.19流程终止小红书&nbsp;风控平台:投递11.16&nbsp;—约面11.17&nbsp;&nbsp;-&gt;一面11.18&nbsp;(抽象的面试官,面试感觉一般,问得前端网页安全相关的,确实没准备)-&gt;11.20挂百度&nbsp;百家号:投递11.14&nbsp;—&gt;约面11.14&nbsp;-&gt;一面11.14(当场约2面)-&gt;二面11.24-&gt;口头告知offer,&nbsp;拒绝(原因是业务不太好)美团&nbsp;技术平台投递11.17&nbsp;-&gt;&nbsp;约面(忘记了,没多久)&nbsp;-&gt;一面11.19&nbsp;-&gt;二面11.21&nbsp;(字节offer不想面了)快手&nbsp;电商业务投递11.17&nbsp;-&gt;&nbsp;约面11.18&nbsp;-&gt;一面11.19&nbsp;-&gt;&nbsp;二面11.21(拒了)腾讯wxg&nbsp;微信支付(被捞):(直接发面试邮件)技术一面12.05&nbsp;-&gt;技术二面12.11&nbsp;-&gt;技术三面12.17&nbsp;-&gt;&nbsp;hr面已拒绝(了解业务后拒绝,但是有转正hc,感觉还蛮可惜)字节跳动&nbsp;xxxx:东家就不放具体的时间线了,大概是面完第二天就能知道结果,除了有几天ld请假了没填面评。不去wxg还有个原因是还在期末周,深圳学校来回太麻烦了,至少现在在的组感觉能学到很多的东西,自己的选择应该也没错。还是感概一下,一年前大二的时候投简历海投基本上石沉大海,无论大小厂约面比例很少。现在基本上投了就有面试,还都是以前梦寐以求的大厂,现在自己也有了更多的选择,也没有投太多简历。也感谢上一段实习的经历,很有意思的项目,无论是字节,腾讯,还是美团基本都有聊这个项目。面经需要等一下,也许等周末有空了再发给各位uu,感兴趣可以关注一下~有想要交流学习的同学也可以私信我,目前人在北京大钟寺~,可以找搭子~
正能量的牛可乐:这么多大厂面试下来,不仅摸清了不同公司的面试风格,还能精准避雷业务不匹配的岗位,血赚
实习简历求拷打
点赞 评论 收藏
分享
评论
2
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务