欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++使用opencv調(diào)用級(jí)聯(lián)分類器來(lái)識(shí)別目標(biāo)物體的詳細(xì)流程

 更新時(shí)間:2022年05月07日 09:57:52   作者:一個(gè)不同的ID  
所謂級(jí)聯(lián)分類器其實(shí)就是把分類器按照一定的順序聯(lián)合到一起,下面這篇文章主要給大家介紹了關(guān)于C++使用opencv調(diào)用級(jí)聯(lián)分類器來(lái)識(shí)別目標(biāo)物體的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

使用編譯器:Qt Creator 4.2.1 

前言:

相較于幀差法捕捉目標(biāo)物體識(shí)別,級(jí)聯(lián)分類器識(shí)別目標(biāo)物體更加具有針對(duì)性,使用前者只要是動(dòng)的物體都會(huì)被捕捉識(shí)別到,畫面里有一點(diǎn)風(fēng)吹草動(dòng),都會(huì)被捕捉識(shí)別下來(lái),如果我想識(shí)別具體的人或者物,都無(wú)法做到精準(zhǔn)的目標(biāo)識(shí)別,所以有了級(jí)聯(lián)分類器識(shí)別(即模型識(shí)別),會(huì)按照訓(xùn)練好的級(jí)聯(lián)分類器(模型)來(lái)進(jìn)行目標(biāo)識(shí)別

流程講解:

1.創(chuàng)建一個(gè)級(jí)聯(lián)分類器對(duì)象

創(chuàng)建一個(gè)級(jí)聯(lián)分類器對(duì)象,并讀取已經(jīng)已經(jīng)訓(xùn)練好的模型

    CascadeClassifier cascade;//級(jí)聯(lián)分類器(模型)
    cascade.load("D:/Qt_Opencv_Project/cars.xml");//讀取級(jí)聯(lián)分類器

2.創(chuàng)建一個(gè)視頻流

讀取一個(gè)要識(shí)別的視頻路徑

    Mat frame;
    VideoCapture cap("D:/VideoTraining/carMove.mp4");
    while (cap.read(frame))
    {
        imshow("video",frame);//將讀到的幀顯示出來(lái)
        datectCarDaw(frame,cascade,2);//將讀到的幀傳入函數(shù)用作識(shí)別
        waitKey(25);//延時(shí)25ms,避免播放過(guò)快
    }

3.將傳入的視頻幀轉(zhuǎn)換為灰度圖

轉(zhuǎn)換為灰度圖,色彩通道縮小一半,減少圖片數(shù)據(jù)計(jì)算量,提升計(jì)算速度

    Mat gray;
    //轉(zhuǎn)換為灰度圖,色彩通道縮小一半
    cvtColor(frame,gray,CV_RGB2GRAY);

效果如下:

4.將多余的空通道進(jìn)行壓縮

原通道為RGB三通道圖片數(shù)據(jù),轉(zhuǎn)換為灰度圖后,變?yōu)閱瓮ǖ罃?shù)據(jù),多余的通道可以壓縮掉,可以看到圖片減小三分之二

    //再將灰度圖縮小一半
    Mat smalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);
    resize(gray,smalling,smalling.size(),0,0,INTER_LINEAR);

效果如下:

可以發(fā)現(xiàn),圖一下子小了很多,大大降低了計(jì)算量

5.直方圖均衡化

將縮小一半的灰度圖進(jìn)行均衡化,使其更加黑白分明,增強(qiáng)局部的對(duì)比度,便于計(jì)算機(jī)識(shí)別

    //直方圖均衡化:將縮小一半的灰度圖進(jìn)行均值化   使其更加黑白分明
    equalizeHist(smalling,smalling);

效果如下:

降低了漸進(jìn)效果的像素?cái)?shù)目,更加的黑白分明

 6.調(diào)用級(jí)聯(lián)分類器,并將內(nèi)容框出,然后將此幀顯示出來(lái)

調(diào)用讀取已經(jīng)訓(xùn)練好的模型,調(diào)用detectMultiScale函數(shù)器參數(shù)含義為:

待檢測(cè)的圖片幀(此處為均衡化后的圖片幀)

被檢測(cè)物體的矩形向量容器(調(diào)用前聲明了一個(gè)向量容器cars)

每次搜索減小的圖像比例(每次縮小1.05倍,掃描的細(xì)致一點(diǎn))

檢測(cè)目標(biāo)周圍相鄰矩形的最小個(gè)數(shù)(此處設(shè)為5個(gè),此處視道路情況可以適當(dāng)增加個(gè)數(shù))

類型(掃描類型)

目標(biāo)區(qū)域可能的最小尺寸(此處為25*25,太小了會(huì)識(shí)別不到,太大了可能幾輛車貼的很近可能只能識(shí)別出一輛)

    //調(diào)用級(jí)聯(lián)分類器進(jìn)行模型匹配并框出內(nèi)容
    vector<Rect>cars;
    //此函數(shù)參數(shù)說(shuō)明: 待檢測(cè)的圖片幀  被檢測(cè)物體的矩形向量容器  每次搜索減小的圖像比例  
    //檢測(cè)目標(biāo)周圍相鄰矩形的最小個(gè)數(shù)(此處設(shè)為2個(gè)) 類型 目標(biāo)區(qū)域的大小尺寸
    cascade.detectMultiScale(smalling,cars,1.05,5,0|CV_HAAR_SCALE_IMAGE,Size(25,25));
    
    vector<Rect>::const_iterator iter;
    //繪制方塊,標(biāo)記目標(biāo),注意,標(biāo)記要畫在原幀上,要講方框的大小和幀坐標(biāo)擴(kuò)大,因?yàn)槭歉鶕?jù)灰度圖識(shí)別的,灰度圖被縮小了
    for(iter=cars.begin();iter!=cars.end();iter++)
    {
        rectangle(frame,
                  cvPoint(cvRound(iter->x*scale),cvRound(iter->y*scale)),
                  cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),
                  Scalar(0,255,0),2,8
                    );
    }
    imshow("frame",frame);

效果如下:

循環(huán)顯示每一幀,最終成果展示:

博主所使用的這個(gè)模型訓(xùn)練的樣本較為有限,主要訓(xùn)練的是普通轎車的車頭,車尾訓(xùn)練較少,貨車等其他車型沒(méi)有做特別的訓(xùn)練,所以只能保證識(shí)別轎車的車頭

可以根據(jù)實(shí)際車流量和車輛距離攝像頭的距離來(lái)調(diào)整最小目標(biāo)大小和最大矩形框個(gè)數(shù)

代碼:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
 
void datectCarDaw(Mat &frame,CascadeClassifier cascade,double scale)
{
    Mat gray;
    //轉(zhuǎn)換為灰度圖,色彩通道縮小一半
    cvtColor(frame,gray,CV_RGB2GRAY);
    //imshow("huidu",gray);
    //再將灰度圖縮小一半
    Mat smalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);
    resize(gray,smalling,smalling.size(),0,0,INTER_LINEAR);
 
    //直方圖均衡化:將縮小一半的灰度圖進(jìn)行均值化   使其更加黑白分明
    equalizeHist(smalling,smalling);
    //imshow("smalling",smalling);
    //調(diào)用級(jí)聯(lián)分類器進(jìn)行模型匹配并框出內(nèi)容
    vector<Rect>cars;
    //此函數(shù)參數(shù)說(shuō)明: 待檢測(cè)的圖片幀  被檢測(cè)物體的矩形向量容器  每次搜索減小的圖像比例  檢測(cè)目標(biāo)周圍相鄰矩形的最小個(gè)數(shù)(此處設(shè)為2個(gè)) 類型 目標(biāo)區(qū)域的大小尺寸
    cascade.detectMultiScale(smalling,cars,1.05,5,0|CV_HAAR_SCALE_IMAGE,Size(25,25));
 
    vector<Rect>::const_iterator iter;
    //繪制方塊,標(biāo)記目標(biāo),注意,標(biāo)記要畫在原幀上,要講方框的大小和幀坐標(biāo)擴(kuò)大,因?yàn)槭歉鶕?jù)灰度圖識(shí)別的,灰度圖被縮小了
    for(iter=cars.begin();iter!=cars.end();iter++)
    {
        rectangle(frame,
                  cvPoint(cvRound(iter->x*scale),cvRound(iter->y*scale)),
                  cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),
                  Scalar(0,255,0),2,8
                    );
 
    }
    imshow("frame",frame);
}
 
int main(int argc, char *argv[])
{
    CascadeClassifier cascade;//級(jí)聯(lián)分類器(模型)
    cascade.load("D:/Qt_Opencv_Project/cars.xml");//讀取級(jí)聯(lián)分類器
    //cascade.load("D:/Qt_Opencv_Project/face.xml");
    Mat frame;
    VideoCapture cap("D:/VideoTraining/carMove.mp4");
    //VideoCapture cap(0);
    while (cap.read(frame))
    {
        imshow("video",frame);//將讀到的幀顯示出來(lái)
        datectCarDaw(frame,cascade,2);//將讀到的幀傳入函數(shù)用作識(shí)別
        waitKey(25);//延時(shí)25ms,避免播放過(guò)快
    }
    return 0;
}

有興趣也可以看看無(wú)需使用模型但是只能捕捉動(dòng)態(tài)目標(biāo)的幀差法識(shí)別:

C++調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉

Qt Creator配置使用opencv:

Qt Creator下配置opencv環(huán)境

總結(jié)

到此這篇關(guān)于C++使用opencv調(diào)用級(jí)聯(lián)分類器來(lái)識(shí)別目標(biāo)物體的文章就介紹到這了,更多相關(guān)C++ opencv識(shí)別目標(biāo)物體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解 linux c++的編譯器g++的基本使用

    詳解 linux c++的編譯器g++的基本使用

    這篇文章主要介紹了詳解 linux c++的編譯器g++的基本使用的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Windows程序內(nèi)部運(yùn)行機(jī)制實(shí)例詳解

    Windows程序內(nèi)部運(yùn)行機(jī)制實(shí)例詳解

    這篇文章主要介紹了Windows程序內(nèi)部運(yùn)行機(jī)制實(shí)例詳解,對(duì)于學(xué)習(xí)Windows程序設(shè)計(jì)來(lái)說(shuō)是非常重要的一課,需要的朋友可以參考下
    2014-08-08
  • C++二維數(shù)組中數(shù)組元素存儲(chǔ)地址的計(jì)算疑問(wèn)講解

    C++二維數(shù)組中數(shù)組元素存儲(chǔ)地址的計(jì)算疑問(wèn)講解

    今天小編就為大家分享一篇關(guān)于C++二維數(shù)組中數(shù)組元素存儲(chǔ)地址的計(jì)算疑問(wèn)講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • C++模板Template詳解及其作用介紹

    C++模板Template詳解及其作用介紹

    這篇文章主要介紹了C++中模板(Template)的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C語(yǔ)言指針的長(zhǎng)度和類型深入分析

    C語(yǔ)言指針的長(zhǎng)度和類型深入分析

    這篇文章主要介紹了C語(yǔ)言指針的長(zhǎng)度和類型,針對(duì)常見的各個(gè)類型進(jìn)行了相對(duì)詳細(xì)的分析,需要的朋友可以參考下
    2014-09-09
  • C語(yǔ)言 二級(jí)指針詳解及示例代碼

    C語(yǔ)言 二級(jí)指針詳解及示例代碼

    本文主要介紹C語(yǔ)言 二級(jí)指針,這里整理了C語(yǔ)言中二級(jí)指針的基礎(chǔ)資料并附有示例代碼和實(shí)現(xiàn)結(jié)果,幫助大家學(xué)習(xí)理解相關(guān)知識(shí),有學(xué)習(xí)的朋友可以參考下
    2016-08-08
  • C語(yǔ)言中程序如何調(diào)用Python腳本

    C語(yǔ)言中程序如何調(diào)用Python腳本

    由于python有很多功能強(qiáng)大的開源庫(kù),有時(shí)候在寫C語(yǔ)言程序的時(shí)候又想利用一下python強(qiáng)大的模塊,那么C語(yǔ)言中程序如何調(diào)用Python腳本,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++深入探究引用的本質(zhì)與意義

    C++深入探究引用的本質(zhì)與意義

    引用是C++一個(gè)很重要的特性,顧名思義是某一個(gè)變量或?qū)ο蟮膭e名,對(duì)引用的操作與對(duì)其所綁定的變量或?qū)ο蟮牟僮魍耆葍r(jià),這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下
    2022-04-04
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • 如何利用Emacs來(lái)調(diào)試C++程序

    如何利用Emacs來(lái)調(diào)試C++程序

    本文給大家分享的是使用編輯器中的神器Emacs來(lái)調(diào)試C++程序的方法,非常的細(xì)致全面,有需要的小伙伴可以參考下
    2016-03-03

最新評(píng)論