1. 程式人生 > >Opencv2.4.9多尺度檢測detectMultiScale函式原始碼分析

Opencv2.4.9多尺度檢測detectMultiScale函式原始碼分析

一、簡介

    在Opencv2.4.9的原始碼中,對modules模組opencv_objdetect子專案中CascadeClasssifier類中的detectMultiScale函式進行了分析,涉及程式碼在cascadedetect.hpp和cascadedetect.cpp中。

    CascadeClassifier為級聯分類器檢測類,使用Adaboost的方法,提取LBP\HOG\HAAR特徵進行目標檢測,載入traincascade進行訓練的分類器。

    detectMultiScale能夠實現多尺度檢測,但多尺度檢測是通過縮放影象來完成的。

二、函式簡介

voidCascadeClassifier::detectMultiScale( const Mat& image, —Mat

型別的影象

                                       vector<Rect>& objects,檢測得到的矩形

                                       doublescaleFactor,影象縮放因子,必須大於1

                                       intminNeighbors,構成檢測目標的相鄰矩形的最小個數

                                       int flags, 舊分類器使用,新分類器棄用

                                       Size minObjectSize,

最小檢測視窗大小

                                       Size maxObjectSize)最大檢測視窗大小(預設是影象大小)

三、函式使用

    在進入detectMultiScal函式之前,首先需要對CascadeClassifier做初始化。

1.    初始化——read函式

CascadeClassifier的初始化很簡單:

cv::CascadeClassifierclassifier;

classifier.load(“cascade.xml”);//這裡的xml是訓練得到的分類器xml

CascadeClassifier類中既有load也有read函式,二者是相同的,load將引用read函式。

1.1  xml的結構

訓練得到的分類器以xml形式儲存,整體上它包括stageType、featureType、height、width、stageParams、featureParams、stageNum、stages、features節點。

除stages和features外,其他主要是一些分類器的引數。

Stages中包含stageNum個stage(訓練程式設定),每個stage中包含多個weakClassifiers,而每個weakClassifier中又包含一個internalNodes和一個leafValues。internalNodes中變數代表一個node,分別為node中的left/right標記、特徵池中的ID和threshold。leafValues中兩個變數代表一個node,分別為left leaf的值和right leaf的值。

而features是分類器的特徵池,每個特徵包含一個矩形。

1.2   read的過程

下面是read程式碼,主要包括從xml中獲取兩部分內容:data和featureEvaluator的讀取。

1.3  read的結果

read的結果一是初始化了分類器的特徵型別、最小檢測視窗size等引數;二是建立級聯的分類器樹;三是提取了xml中的特徵池。

2.    detectMultiscale函式

在load分類器之後,可以呼叫該函式對一幅影象做多尺度檢測。

1.1   顏色通道

如果輸入是彩色影象,程式碼會自動轉為灰度圖。

1.2   縮放尺寸

輸入影象尺寸必須大於分類器樣本尺寸。

影象尺寸經縮放因子後,再四舍五捨得到尺寸。

ex1:

分類器:18*18;輸入影象:24*24;detectMultiScale(frame_gray,vct_rc, 1.05, 1, 0, Size(20,20));

多尺度檢測尺寸:22*22、21*21、20*20、19*19

ex2:

分類器:18*18;輸入影象:24*24;detectMultiScale(frame_gray, vct_rc, 1.05, 1, 0, Size(21,21));

多尺度檢測尺寸:21*21、20*20、19*19

ex3:

分類器:18*18;輸入影象:24*24;detectMultiScale(frame_gray,vct_rc, 1.05, 1, 0, Size(22,22));

多尺度檢測尺寸:20*20、19*19

ex4:

分類器:18*18;輸入影象:26*26;detectMultiScale(frame_gray,vct_rc, 1.05, 1, 0, Size(22,22));

多尺度檢測尺寸:21*21、20*20、19*19

1.3   平行計算

平行計算內容寫在過載操作()函式體中。

classCV_EXPORTS ParallelLoopBody

{

public:

    virtual~ParallelLoopBody();

    virtual void operator() (const Range& range) const= 0;

};

CV_EXPORTSvoid parallel_for_(constRange& range, const ParallelLoopBody&body, double nstripes=-1.);

1)       detectSingleScale函式中,setImage函式計算積分圖,對於X個特徵,根據對應的X個rect,分別計算各個rect的積分圖,並進行儲存。積分圖是16維的int陣列,跟矩形的對應關係如下圖,每個rect產生8維特徵:

2)       setImage函式中,先將原圖進行降取樣,然後提取全圖的積分圖,然後根據updatePtrs函式分配給X個特徵rect的積分圖陣列,放入featurePtr結構體陣列中,有rect和intp[];

X個特徵rect是訓練分類器時分配的,每個rect的寬度和高度為一個block的寬高度;

3)       CV_SUM_PTRS:目的是根據原圖的積分圖,計算特徵rect的積分圖陣列。引數ptr為原圖的積分圖資料,tr為當前計算的rect,step為積分圖的寬度;

#defineCV_SUM_PTRS( p0, p1, p2, p3, sum, rect, step )                        \

    /* (x, y) */                                                         \

    (p0) = sum + (rect).x + (step) *(rect).y,                                   \

    /* (x + w, y) */                                                      \

    (p1) = sum + (rect).x + (rect).width +(step) * (rect).y,                        \

    /* (x , y + h) */                                                       \

    (p2) = sum + (rect).x + (step) * ((rect).y+ (rect).height),                      \

    /* (x + w, y + h)*/                                                   \

    (p3) = sum + (rect).x + (rect).width +(step) * ((rect).y + (rect).height)

4)       calc函式,根據rect的積分圖16維int資料,獲取8位二進位制特徵,所以樣本特徵維數是8*num(rect);

相關推薦

Opencv2.4.9尺度檢測detectMultiScale函式原始碼分析

一、簡介     在Opencv2.4.9的原始碼中,對modules模組opencv_objdetect子專案中CascadeClasssifier類中的detectMultiScale函式進行了分析,涉及程式碼在cascadedetect.hpp和cascadede

VS2013配置OPENCV2.4.9

rac 菜單 s2d 配置 targe itblog 按鈕 控制 cvs 轉載自->這裏 設置opencv SDK解壓目錄,點擊Extract後解壓 我是習慣於解壓到這個位置的。 解壓過程如上圖。 2、 文件目錄介紹 解壓後會在目錄下生成open

VS2013+opencv2.4.9配置

ner 系統設置 opencv pad 動態庫 adding light hot demo VS2013+opencv2.4.9(10)配置[zz] - yifeier12 - 博客園 http://www.cnblogs.com/cuteshongshong/p/4057

opencv2.4.9 + vs2010 配置

mark 打開 bin 文件 第三方 路徑配置 bit x86 系統選擇 要想學好OpenCV,首先當然要知道怎麽配置環境了。 本人系統軟件硬件環境如下: 以本人的配置環境為例,配置步驟如下。 第一步 下載及解壓OpenCV源碼 雖然很多第三方網站及一些學習論壇會提供

4.9 表單切換

b- 百度 class 可用 一個 fir switch AS oot 在 web 應用中經常會遇到 frame 嵌套頁面的應用,頁 WebDriver 每次只能在一個頁面上識別元素,對於 frame 嵌套內的頁面上的元素,直接定位是定位是定位不到的。這個時候就需要通過 s

VS2010+OpenCV2.4.9配置

區分大小寫 debug 控制臺應用程序 features font 編輯 avi 接下來 stitch 第一步 下載及解壓OpenCV源碼 官網的下載速度慢 可以到我的網盤下載,地址如下: 鏈接:https://pan.baidu.com/s/1lcKerBOIZ32yz

ubuntu16.04 python opencv2.4.9安裝

href vision 12px 下載安裝 lease name align red light 1. 安裝python: 一般Ubuntu會自帶,如果需要其他自定版本,請自行下載安裝。 2. 下載OpenCV的源碼 OpenCV官網上有linux版本的源碼包可以下載,不

OpenCV2.4.9在VS2010下的安裝教程及部分安裝問題

官網http://opencv.org/有OpenCV2.4.9,無需進行CMake編譯,直接配置就可使用, 安裝和配置方法挺簡單的。 下載程式 下載windows版本的“opencv-2.4.9.exe”,執行解壓至某目錄資料夾,本文中儲存在D盤: D:\Program Fil

0045-OpenCV2.4.9下載地址及連結器配置檔案列表

因為OpenCV3.0的nonfree模組官方並沒有編譯,所以有時候我們使用OpenCV2.4.9進行影象處理的開發。 OpenCV2.4.9下載連結:https://pan.baidu.com/s/1o8FsD2i 密碼:n6ak 配置方法見帖子:https://blog.csdn.net

VS2015 編譯配置 opencv2.4.9 與 dlib1.10。

按 在VS2015 執行opencv 或 dlib 有許多簡便方式。如使用Win pack 編譯好的可執行檔案。參考步驟 opencv.exe 。 但是由於需要使用 一個開源庫 heads-hands-and-faces-tracking ,簡稱heads庫 https://

vs2015下編譯配置opencv2.4.9

參考: vs2015下配置opencv2.4.9 不同點: 1 cmake 選擇 Visual studio 14 2015 win64. 此後的都在64 下操作。 2 新建屬性表。在Debug | 64上右鍵單擊,選擇新增新專案屬性表。 參考第六步: 屬性表 注意

64bit win7+VS2013+opencv2.4.9配置

我的配置是opencv2.4.9與VS2013,在win7 64bit下。 從opencv官網(http://opencv.org/downloads.html),下載安裝檔案,然後雙擊安裝包,類似於解壓,跟著步驟,就安裝到自己想要安裝的位置。 安裝完成後,就先設定下系統變數。 1、

windows10下VS2013搭建opencv2.4.9吐血之作

1、下載opencv2.4.9.exe檔案,然後雙擊extract檔案到指定目錄 2、按此連結安裝opencv:https://www.cnblogs.com/cuteshongshong/p/4057193.html  (注意:在配置系統path環境變數後要重啟計算機才能生效) 3、配置完2後

ubuntu14.04中安裝opencv2.4.9

https://blog.csdn.net/chcyj/article/details/78424372 http://jaist.dl.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip

VS2010+OpenCV2.4.9環境配置

轉載於:http://blog.csdn.net/bestgonghuibin/article/details/38409613 要想學好OpenCV,首先當然要知道怎麼配置環境了。 本人系統軟體硬體環境如下: 以本人的配置環境為例,配置步驟如下。 第

VS2013+opencv2.4.9配置步驟詳解

1、         下載opencv2.4.9,然後解壓到一個位置 設定opencv SDK解壓目錄,點選Extract後解壓   我是習慣於解壓到這個位置的。 解壓過程如上圖

opencv2.4.9輸出把影象轉換成灰色

#include <stdio.h> #include “stdafx.h” #include"cv.h" #include<highgui.h> using namespace cv; int main() { Mat image=imread(“pic.jpg

配合Opencv2.4.9,CMake3.12.1和VS2010在win10下構建專案踩坑記錄

配合Opencv3,CMake和VS2010在win10下構建專案踩坑記錄 參考https://blog.csdn.net/qq_26623659/article/details/78322782 博文中是x64,但是我配置的是x86。 這個部落格中的內容

Opencv2.4.9原始碼分析——HoughCircles

【原文:http://blog.csdn.net/zhaocj/article/details/50454847】   圖形可以用一些引數進行表示,標準霍夫變換的原理就是把影象空間轉換成引數空間(即霍夫空間),例如霍夫變換的直線檢測就是在距離-角度空間內進行檢測。圓可以表示成:

linux(ubuntu14.04)+cuda7.5+caffe+openCV2.4.9+matlab+cudnn新手配置

ubuntu14.04的安裝 *********************************************************************************