最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++使用opencv調(diào)用級聯(lián)分類器來識別目標物體的詳細流程

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

使用編譯器:Qt Creator 4.2.1 

前言:

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

流程講解:

1.創(chuàng)建一個級聯(lián)分類器對象

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

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

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

讀取一個要識別的視頻路徑

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

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

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

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

效果如下:

4.將多余的空通道進行壓縮

原通道為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),圖一下子小了很多,大大降低了計算量

5.直方圖均衡化

將縮小一半的灰度圖進行均衡化,使其更加黑白分明,增強局部的對比度,便于計算機識別

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

效果如下:

降低了漸進效果的像素數(shù)目,更加的黑白分明

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

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

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

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

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

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

類型(掃描類型)

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

    //調(diào)用級聯(lián)分類器進行模型匹配并框出內(nèi)容
    vector<Rect>cars;
    //此函數(shù)參數(shù)說明: 待檢測的圖片幀  被檢測物體的矩形向量容器  每次搜索減小的圖像比例  
    //檢測目標周圍相鄰矩形的最小個數(shù)(此處設(shè)為2個) 類型 目標區(qū)域的大小尺寸
    cascade.detectMultiScale(smalling,cars,1.05,5,0|CV_HAAR_SCALE_IMAGE,Size(25,25));
    
    vector<Rect>::const_iterator iter;
    //繪制方塊,標記目標,注意,標記要畫在原幀上,要講方框的大小和幀坐標擴大,因為是根據(jù)灰度圖識別的,灰度圖被縮小了
    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)顯示每一幀,最終成果展示:

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

可以根據(jù)實際車流量和車輛距離攝像頭的距離來調(diào)整最小目標大小和最大矩形框個數(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);
 
    //直方圖均衡化:將縮小一半的灰度圖進行均值化   使其更加黑白分明
    equalizeHist(smalling,smalling);
    //imshow("smalling",smalling);
    //調(diào)用級聯(lián)分類器進行模型匹配并框出內(nèi)容
    vector<Rect>cars;
    //此函數(shù)參數(shù)說明: 待檢測的圖片幀  被檢測物體的矩形向量容器  每次搜索減小的圖像比例  檢測目標周圍相鄰矩形的最小個數(shù)(此處設(shè)為2個) 類型 目標區(qū)域的大小尺寸
    cascade.detectMultiScale(smalling,cars,1.05,5,0|CV_HAAR_SCALE_IMAGE,Size(25,25));
 
    vector<Rect>::const_iterator iter;
    //繪制方塊,標記目標,注意,標記要畫在原幀上,要講方框的大小和幀坐標擴大,因為是根據(jù)灰度圖識別的,灰度圖被縮小了
    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;//級聯(lián)分類器(模型)
    cascade.load("D:/Qt_Opencv_Project/cars.xml");//讀取級聯(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);//將讀到的幀顯示出來
        datectCarDaw(frame,cascade,2);//將讀到的幀傳入函數(shù)用作識別
        waitKey(25);//延時25ms,避免播放過快
    }
    return 0;
}

有興趣也可以看看無需使用模型但是只能捕捉動態(tài)目標的幀差法識別:

C++調(diào)用opencv完成運動目標捕捉

Qt Creator配置使用opencv:

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

總結(jié)

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

相關(guān)文章

  • 淺談Windows系統(tǒng)下C語言編程中Glib庫的使用

    淺談Windows系統(tǒng)下C語言編程中Glib庫的使用

    這篇文章主要介紹了Windows系統(tǒng)下C語言編程中Glib庫的使用,Glib庫在多線程編程中經(jīng)常可以用到,需要的朋友可以參考下
    2016-02-02
  • C語言 全局變量和局部變量詳解及實例

    C語言 全局變量和局部變量詳解及實例

    這篇文章主要介紹了C語言 全局變量和局部變量詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • QT使用Http協(xié)議通信的實現(xiàn)示例

    QT使用Http協(xié)議通信的實現(xiàn)示例

    使用QT進行應(yīng)用開發(fā)時,有時候需要進行客戶端和服務(wù)端的網(wǎng)絡(luò)通信,本文主要介紹了QT使用Http協(xié)議通信的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 基于memset()函數(shù)的深入理解

    基于memset()函數(shù)的深入理解

    本篇文章是對memset()函數(shù)又進行了深一步的了解,需要的朋友參考下
    2013-05-05
  • C++中new和delete的使用方法詳解

    C++中new和delete的使用方法詳解

    這篇文章主要介紹了C++中new和delete的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • c++實現(xiàn)簡單的線程池

    c++實現(xiàn)簡單的線程池

    這里給大家介紹了C++中對于pthread線程的一個簡單應(yīng)用以及使用繼承CDoit,實現(xiàn)其中的start和end,有需要的小伙伴可以參考下
    2015-11-11
  • c++引用傳參和指針傳參的區(qū)別及說明

    c++引用傳參和指針傳參的區(qū)別及說明

    這篇文章主要介紹了c++引用傳參和指針傳參的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • c++智能指針unique_ptr的使用

    c++智能指針unique_ptr的使用

    本文主要介紹了c++智能指針unique_ptr的使用,與shared_ptr作用類似,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 淺理解C++ 人臉識別系統(tǒng)的實現(xiàn)

    淺理解C++ 人臉識別系統(tǒng)的實現(xiàn)

    這篇文章主要介紹了淺理解C++ 人臉識別系統(tǒng)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C++中的boost::function庫簡介

    C++中的boost::function庫簡介

    這篇文章介紹了C++中的boost::function庫,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評論

丰县| 星子县| 孟村| 略阳县| 常德市| 武山县| 永丰县| 宜丰县| 塔河县| 华蓥市| 宣威市| 甘南县| 正蓝旗| 德昌县| 丰台区| 松潘县| 长治市| 东至县| 娄底市| 鄂伦春自治旗| 山西省| 盖州市| 华容县| 普兰县| 泉州市| 南安市| 吉林省| 安徽省| 珲春市| 桦南县| 莲花县| 林州市| 渝北区| 聂荣县| 电白县| 全南县| 大同市| 尼玛县| 荆州市| 宜兰市| 岫岩|