目錄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
圖片的大小和格式都要相同,準備好兩個文件夾,分別命名爲posdata(正樣本)和negdata(負樣本),全部樣本的尺寸必須一致,若是不一致的或者尺寸較大的,能夠先將全部樣本統一縮放到100*40。posdata中的圖片爲車輛樣本。給分類器展現的是正確的樣本。blog
negdata中的圖片爲一些背景樣本,裏面不包含車輛,是用來告訴分類器哪些是錯誤的樣本。雖然負樣本就是樣本中不存在正樣本的內容,但最好是根據不一樣的項目選擇不一樣的負樣本,好比一個項目是作機場的人臉檢測,那麼就最好從現場拍攝一些圖片數據回來,從中採集負樣本。 圖片
而後在裏面輸入「 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 」。
選擇opencv_createsamples.exe和opencv_traincascade.exe兩項,將其複製到須要的文件夾中,與negdata、posdata並列。
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。
在該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。
代碼爲:
#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;
}
以後點擊運行,由於設置的正負樣本過少的緣由,效果不是很明顯。出現效果以下: