Opencv-Haar-Cascade分类器进行鼠标识别

检测思路

  1. 计算积分图,使用积分图(Integral Image)对Haar-like进行特征求值
  2. 挑选最优分类器;
  3. 使用AdaBoost算法把这些分类器训练成一个强分类器,用于区分鼠标和非鼠标
  4. 级联,也就是强分类器的强强联手。把强分类器级联到一起,提高准确率

检测方法

利用haar特征,结合级联分类器进行鼠标检测: Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost +级联

检测目标选择

选择特征明显的物体(颜色和轮廓)

样本构建方法

样本分为正样本(有目标)、负样本(无目标)

  • 正样本
    正样本构建:
    拍20张,通过画图软件编辑图片大小50*50(图片尺寸可以减少训练的时间),通过python程序分别调节每张目标图片的亮度各5张、对比度各5张,正样本最终筛选数量为191张,并生成描述文件。
  • 调节亮度和对比度的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)
    #调节对比度
    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
    #调节亮度
    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("请输入关键字:")
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

训练模型参数

model.jpg

训练级数.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 );
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容