检测图片中的车辆并画出来,保存到指定文件夹

这篇博客通过代码展示了如何检测图片中的车辆,并将检测到的车辆进行标注,最终保存到特定文件夹,详细阐述了图像处理的过程。
摘要由CSDN通过智能技术生成

代码展示

#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using namespace cv;
void Entrance(Mat car,string camName,CascadeClassifier& face_cascade);
int main()
{
    CascadeClassifier face_cascade;
    string cascade_name = "1220_加入960Neg_桃树坪_2700.xml";
    if (!face_cascade.load(cascade_name))
    {
        printf("级联分类器错误,可能未找到文件,拷贝该文件到工程目录下!\n");
        //exit(1);
        return -1;
    }
    string str_array[] = {"QQ截图20170114154353.png","QQ截图20170114154433.png","QQ截图20170114154518.png","QQ截图20170114154614.png",
        "QQ截图20170114154628.png","QQ截图20170114154654.png","QQ截图20170114154716.png","QQ截图20170114154739.png","QQ截图20170114154831.png",
    "QQ截图20170114154847.png","QQ截图20170114154922.png","QQ截图20170114154942.png","QQ截图20170114155006.png"};
    vector<string>str_vec(str_array,str_array+13);
    for(int i = 0; i < str_vec.size();i++)
    {
        Mat img = imread(str_vec[i]);
        resize(img,img,Size(432,240));
        Entrance(img,(str_vec[i]),face_cascade);
        //imshow(str_vec[i],img);
        //waitKey(10);
    }
    system("pause");
    return 0;
}

void Entrance(Mat car,string camName,CascadeClassifier& face_cascade)
{
    std::vector<Rect> cars;
    vector<Rect> cars_filtered;
    Mat car_gray, small_img;
    double scale = 1.3;
    Point pt1, pt2;
    cvtColor(car, car_gray, CV_BGR2GRAY);  //rgb类型转换为灰度类型  
    resize(car_gray, small_img, Size(cvRound(car_gray.cols / scale), cvRound(car_gray.rows / scale)), 0, 0, CV_INTER_LINEAR);
    equalizeHist(small_img, small_img);   //直方图均衡化  
    face_cascade.detectMultiScale(small_img,
        cars,
        1.1,
        5,
        CV_HAAR_DO_CANNY_PRUNING,
        Size(20, 20));

    ///第一次滤除:滤除此存不合适的车辆
    for(vector<Rect>::iterator it = cars.begin();it != cars.end();it++)
    {
        //if((cars[i].x + cars[i].width)*scale - cars[i].x*scale > 150)
        if(((*it).x+(*it).width)*scale  - (*it).x * scale > 120 
            || ((*it).x+(*it).width)*scale  - (*it).x * scale < 30)
        {
            cars.erase(it);
            it--;
        }
    }
    /第二次滤除:滤除嵌套的,留下最内层的
    int m,n;
    for (m = 0; m<cars.size(); m++)
    {
        Rect r = cars[m];
        for(n = 0; n<cars.size(); n++)
            if (n != m && (r & cars[n]) == r)
                break;
        if (n == cars.size())
            cars_filtered.push_back(r);
    }
    /划线,之上不检测,之下检测
    //circle(car, entrance_pt1, 2, cvScalar(0, 0, 255, 0), CV_FILLED, CV_AA, 0);
    //circle(car, entrance_pt2, 2, cvScalar(0, 0, 255, 0), CV_FILLED, CV_AA, 0);
    //line(car, entrance_pt1, entrance_pt2, cvScalar(0, 0, 255, 0), 1, CV_AA, 0);
    //line(car, Point(0,entrance_pt1.y), entrance_pt1, cvScalar(0, 0, 255, 0), 1, CV_AA, 0);
    //line(car, entrance_pt2,Point(car.cols,entrance_pt2.y), cvScalar(0, 0, 255, 0), 1, CV_AA, 0);


    for (int i = 0; i < cars_filtered.size(); i++)
    {
        pt1.x = cars_filtered[i].x*scale;
        pt2.x = (cars_filtered[i].x + cars_filtered[i].width)*scale;
        pt1.y = cars_filtered[i].y*scale;
        pt2.y = (cars_filtered[i].y + cars_filtered[i].height)*scale;
        rectangle(car, pt1, pt2, CV_RGB(255, 255, 0), 2, 8, 0);

    }
    string str_path = "C:\\Users\\Administrator\\Desktop\\检测效果不好_让大师姐测试\\自己检测之后\\";
    imwrite(str_path+camName,car);
    imshow(camName,car);
    waitKey(10);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值