Opencv-Haar-Cascade分類器進行鼠標識別

檢測思路

  1. 計算積分圖驶乾,使用積分圖(Integral Image)對Haar-like進行特征求值
  2. 挑選最優(yōu)分類器;
  3. 使用AdaBoost算法把這些分類器訓練成一個強分類器图谷,用于區(qū)分鼠標和非鼠標
  4. 級聯(lián)蔗崎,也就是強分類器的強強聯(lián)手。把強分類器級聯(lián)到一起促绵,提高準確率

檢測方法

利用haar特征,結(jié)合級聯(lián)分類器進行鼠標檢測: Haar分類器 = Haar-like特征 + 積分圖方法 + AdaBoost +級聯(lián)

檢測目標選擇

選擇特征明顯的物體(顏色和輪廓)

樣本構(gòu)建方法

樣本分為正樣本(有目標)、負樣本(無目標)

  • 正樣本
    正樣本構(gòu)建:
    拍20張败晴,通過畫圖軟件編輯圖片大小50*50(圖片尺寸可以減少訓練的時間)浓冒,通過python程序分別調(diào)節(jié)每張目標圖片的亮度各5張、對比度各5張尖坤,正樣本最終篩選數(shù)量為191張,并生成描述文件稳懒。
  • 調(diào)節(jié)亮度和對比度的python代碼
from PIL import Image
from PIL import ImageEnhance
import os

root = "C:/Users/空雨衣/Desktop/test/"
fileList = os.listdir(root)
contrasparam = 0.3
brightparam = 0.3
sharpparam = 0.2
contrcounter = 1
brightcounter = 1
sharpcounter = 1
counter = 0
for filename in fileList:
    path = root  + filename
    img = Image.open(path)
    enh_con = ImageEnhance.Contrast(img)
    enh_bri = ImageEnhance.Brightness(img)
    enh_sha = ImageEnhance.Sharpness(img)
    #調(diào)節(jié)對比度
    for i in range(1,6):
        image_contrasted = enh_con.enhance(contrasparam * i * counter*0.06)
        newname1 = root + str(contrcounter) + "1contrast1" + str(i)+".jpg"
        image_contrasted.save(newname1)
    contrcounter += 1
    #調(diào)節(jié)亮度
    for i in range(1, 6):
        image_bright = enh_bri.enhance(brightparam * i * counter*0.06)
        newname2 = root + str(contrcounter) + "1brightness1" + str(i)+".jpg"
        image_bright.save(newname2)
    brightcounter += 1
    counter += 1
  • 負樣本:
    爬取百度圖片870張并生成描述文件。
import json
import itertools
import urllib
import requests
import os
import re
import sys
word=input("請輸入關(guān)鍵字:")
path='C:/Users/空雨衣/Desktop/negativePicture/ii'
if not os.path.exists(path):
    os.mkdir(path)
word=urllib.parse.quote(word)
url = r"http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&fp=result&queryWord={word}&cl=2&lm=-1&ie=utf-8&oe=utf-8&st=-1&ic=0&word={word}&face=0&istype=2nc=1&pn={pn}&rn=60"
urls=(url.format(word=word,pn=x)for x in itertools.count(start=0,step=60))
index=0
str_table = {
    '_z2C$q': ':',
    '_z&e3B': '.',
    'AzdH3F': '/'
}

char_table = {
    'w': 'a',
    'k': 'b',
    'v': 'c',
    '1': 'd',
    'j': 'e',
    'u': 'f',
    '2': 'g',
    'i': 'h',
    't': 'i',
    '3': 'j',
    'h': 'k',
    's': 'l',
    '4': 'm',
    'g': 'n',
    '5': 'o',
    'r': 'p',
    'q': 'q',
    '6': 'r',
    'f': 's',
    'p': 't',
    '7': 'u',
    'e': 'v',
    'o': 'w',
    '8': '1',
    'd': '2',
    'n': '3',
    '9': '4',
    'c': '5',
    'm': '6',
    '0': '7',
    'b': '8',
    'l': '9',
    'a': '0'
}
i=1
char_table = {ord(key): ord(value) for key, value in char_table.items()}
for url in urls:
    html=requests.get(url,timeout=10).text
    a=re.compile(r'"objURL":"(.*?)"')
    downURL=re.findall(a,html)
    for t in downURL:
        for key, value in str_table.items():
                t = t.replace(key, value)
        t=t.translate(char_table)
        try:
            html_1=requests.get(t)
            if str(html_1.status_code)[0]=="4":
                print('失敗1')
                continue
        except Exception as e:
            print('失敗2')
            continue
        with open(path+"/"+str(i)+".jpg",'wb') as f:
            f.write(html_1.content)
        i=i+1

訓練模型參數(shù)

model.jpg

訓練級數(shù).jpg

模型檢驗

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <io.h>
using namespace std;
using namespace cv;
void detectAndDisplay( Mat frame );
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
int _count = 0;
int main()
{

    //Load the cascades
    if( !face_cascade.load("cascade.xml") )
    {
        cout << "--(!)Error loading face cascade\n";
        return -1;
    };
    //read file
    char *filename = "C:\\cascade\\*.jpg";
    struct _finddata_t fileinfo;
    long handle;
    handle = _findfirst(filename,&fileinfo);
    if(handle == -1) cout<<"fail..."<<endl;
    else
        cout<<fileinfo.name<<endl;
    while(!_findnext(handle,&fileinfo))
    {
        cout<<fileinfo.name<<endl;
       Mat image=imread(fileinfo.name);
        detectAndDisplay(image);
    }
    cout<<_count<<endl;
    _findclose(handle);
    system("pause");
    waitKey(0);
    return 0;
}
void detectAndDisplay( Mat frame )
{
    Mat frame_gray;
    cvtColor( frame, frame_gray, COLOR_BGR2GRAY );
    equalizeHist( frame_gray, frame_gray );
    //-- Detect mouse
    std::vector<Rect> faces;
    face_cascade.detectMultiScale( frame_gray, faces );
    for ( size_t i = 0; i < faces.size(); i++ )
    {
        Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 );
        ellipse( frame, center, Size( faces[i].width/2, faces[i].height/2 ), 0, 0, 360, Scalar( 255, 0, 255 ), 4 );
        Mat faceROI = frame_gray( faces[i] );
    }
    if(!faces.empty()){
        _count += 1;
    }
    //-- Show what you got
    imshow( "Capture - Face detection", frame );
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慢味,一起剝皮案震驚了整個濱河市僚祷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贮缕,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俺榆,死亡現(xiàn)場離奇詭異感昼,居然都是意外死亡,警方通過查閱死者的電腦和手機罐脊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門定嗓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萍桌,你說我怎么就攤上這事宵溅。” “怎么了上炎?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵恃逻,是天一觀的道長。 經(jīng)常有香客問我藕施,道長寇损,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任裳食,我火速辦了婚禮矛市,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诲祸。我一直安慰自己浊吏,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布救氯。 她就那樣靜靜地躺著找田,像睡著了一般。 火紅的嫁衣襯著肌膚如雪着憨。 梳的紋絲不亂的頭發(fā)上午阵,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音,去河邊找鬼底桂。 笑死植袍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的籽懦。 我是一名探鬼主播于个,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暮顺!你這毒婦竟也來了厅篓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捶码,失蹤者是張志新(化名)和其女友劉穎羽氮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惫恼,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡档押,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祈纯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片令宿。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖腕窥,靈堂內(nèi)的尸體忽然破棺而出粒没,到底是詐尸還是另有隱情,我是刑警寧澤簇爆,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布癞松,位于F島的核電站,受9級特大地震影響入蛆,放射性物質(zhì)發(fā)生泄漏拦惋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一安寺、第九天 我趴在偏房一處隱蔽的房頂上張望厕妖。 院中可真熱鬧,春花似錦挑庶、人聲如沸言秸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽举畸。三九已至,卻和暖如春凳枝,著一層夾襖步出監(jiān)牢的瞬間抄沮,已是汗流浹背跋核。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叛买,地道東北人砂代。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像率挣,于是被迫代替她去往敵國和親刻伊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容