分類器的訓練進行目標識別,以車輛識別爲例

目錄ios

1、從網絡上下載或者本身找到的圖片中裁剪挑選出合適的圖片。網絡

2、在negdata和posdata文件夾準備好以後,使用命令提示符(win + r),輸入cmd,把位置切換到posdata文件夾的位置。測試

3、找到本身下載的OpenCV文件夾,打開opencv,打開build,打開x64,打開vc14,打開bin文件夾。ui

4、打開cmd,在該文件目錄下輸入「 opencv_createsamples.exe -vec pos.vec -info pos.txt -num 32 -w 100 -h 40 」 。spa

5、在主文件夾下建立一個txt文檔,命名爲「traincascade」。3d

6、 以後能夠運行VS,新建一個VC++項目。輸入一下代碼以後進行測試。xml


1、從網絡上下載或者本身找到的圖片中裁剪挑選出合適的圖片。

圖片的大小和格式都要相同,準備好兩個文件夾,分別命名爲posdata(正樣本)和negdata(負樣本),全部樣本的尺寸必須一致,若是不一致的或者尺寸較大的,能夠先將全部樣本統一縮放到100*40。posdata中的圖片爲車輛樣本。給分類器展現的是正確的樣本。blog

negdata中的圖片爲一些背景樣本,裏面不包含車輛,是用來告訴分類器哪些是錯誤的樣本。雖然負樣本就是樣本中不存在正樣本的內容,但最好是根據不一樣的項目選擇不一樣的負樣本,好比一個項目是作機場的人臉檢測,那麼就最好從現場拍攝一些圖片數據回來,從中採集負樣本。 圖片

2、在negdata和posdata文件夾準備好以後,使用命令提示符(win + r),輸入cmd,把位置切換到posdata文件夾的位置。

而後在裏面輸入「 dir /b/s/p/w *.jpg > pos.txt 」,將會在posdata文件夾中產生一個pos.txt的文檔。打開pos.txt,選擇編輯-替換,在查找中搜索jpg,替換爲jpg 1 0 0 100 40,以後保存,將pos.txt複製到上一級目錄中。文檔

 以後對negdata文件夾進行相同的操做,在cmd中輸入的語句爲「 dir /b/s/p/w *.jpg > neg.txt 」。

3、找到本身下載的OpenCV文件夾,打開opencv,打開build,打開x64,打開vc14,打開bin文件夾。

選擇opencv_createsamples.exe和opencv_traincascade.exe兩項,將其複製到須要的文件夾中,與negdata、posdata並列。 

 

4、打開cmd,在該文件目錄下輸入「 opencv_createsamples.exe -vec pos.vec -info pos.txt -num 32 -w 100 -h 40 」 。

        pos.txt 代表這是正樣本;

        num 32 表明正樣本照片數量;

       w 100  h40表示圖片分辨率(寬和高)

以後在該文件夾中會出現pos.vec

以後重複該步驟,cmd輸入的語句換爲「 opencv_createsamples.exe -vec neg.vec -info neg.txt -num 100 -w 100 -h 40 」,產生neg.vec。

5、在主文件夾下建立一個txt文檔,命名爲「traincascade」。

在該txt中輸入「 

opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 32 -numNeg 100 -numStages 20 -w 100 -h 40 -mode ALL


pause

numPos 32 表明正樣本照片數量   numNeg100 表示負樣本照片數量     numStage 20表示檢測次數   pause爲暫停

對「traincascade.txt」進行重命名,將後綴名改成bat。

 以後雙擊「traincascade.bat」。會產生以下效果

 訓練分類器時佔用CPU空間多,電腦運行將會變卡,處理時間較長。處理完成以後將會在文件夾下生成一個cascade.xml。

6、 以後能夠運行VS,新建一個VC++項目。輸入一下代碼以後進行測試。

代碼爲:

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

using namespace cv;
using namespace std;

String filename = "F:/車輛樣本2/cascade.xml";  //以前cascade.xml放置的位置
CascadeClassifier car_classifier;

int main(int argc, char**argv)
{
    if (!car_classifier.load(filename))
    {
        printf("could not laod car feature data..\n");
        return -1;
    }

    Mat src = imread("D:/圖片/15.jpg"); //須要檢測的圖片
    if (src.empty())
    {
        printf("could not laod image...\n");
        return -1;
    }
    imshow("inupt image", src);
    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    equalizeHist(gray, gray);

    vector<Rect>cars;
    car_classifier.detectMultiScale(gray, cars, 1.1, 3, 0, Size(50, 50));
    for (size_t t = 0; t < cars.size(); t++)
    {
        rectangle(src, cars[static_cast<int>(t)], Scalar(0, 0, 255), 2, 8, 0);
    }

    imshow("detect cars", src);
    waitKey(0);
    return 0;

}

 以後點擊運行,由於設置的正負樣本過少的緣由,效果不是很明顯。出現效果以下:

相關文章
相關標籤/搜索