day03:Qt調用opencv完成視頻抓取與圖片處理的學習

OpenCV 視頻抓取

  1. 構建一個項目工程
    1. 創(chuàng)建目錄/文件結構
    2. 工程組織文件(Makefile \to QMake)
  • 附pmain.pro腳本(用于Qt自生成Makefile)
# 控制編譯器C++相關的編譯選項
QMAKE_CXXFLAGS += /source-charset:utf-8
QMAKE_CXXFLAGS += /execution-charset:utf-8
# 1. 配置程序的類型:應用/共享庫
TEMPLATE   = app

# 2. 基本配置
CONFIG    += debug
CONFIG    += console
CONFIG    += thread
CONFIG    += qt

# Qt的模塊庫的配置
QT        += core
QT        += gui
QT        += widgets
# OpenCV的鏈接的相關的庫與頭文件
INCLUDEPATH  += "D:/op/install/include"

LIBS         += -L"D:\op\install\x64\vc16\lib"
LIBS         += -lopencv_core420d
LIBS         += -lopencv_videoio420d
LIBS         += -lopencv_imgcodecs420d
LIBS         += -lopencv_imgproc420d
LIBS         += -lopencv_objdetect420d

# 3. 工程代碼文件
SOURCES   += main.cpp
SOURCES   += cvdialog.cpp
SOURCES   += cvvideo.cpp

HEADERS   += cvdialog.h
HEADERS   += cvvideo.h

FORMS     += video.ui

# 4. 輸出的執(zhí)行文件
TARGET     = main

  1. 創(chuàng)建Qt應用
    1. 通過Qt designer創(chuàng)建合適的對話框
    2. 更改名稱,適配代碼文件
    3. 合理布局
  1. UI交互

    1. 在Qt designer界面搭建信號和槽
    2. 在代碼中引入信號和槽,并定義槽函數
    3. 綁定對話框與槽函數的調用關系
  2. 多線程

  • 引入新線程,用于視頻自采集
CVVideo::CVVideo(QObject *parent):
    QThread(parent),
    dev(new cv::VideoCapture(0, cv::CAP_DSHOW)){
    classifier = new cv::CascadeClassifier("haarcascade_frontalface_alt2.xml");
}

  1. 視頻采集
    • 使用信號發(fā)送給窗體顯示
      1. 定義信號-> 發(fā)送:
      2. 接受信號-> 顯示
void CVDialog::gray(){
    type = 1;
}
void CVDialog::gauss(){
    type = 2;
}

... ...
    if(type == 1){
        ... ...
    }
    if(type == 2){
        ... ...
    }

  • 視頻抓取截圖:

  • OpenCV的視頻采集的相關的類
    1. VideoCapture
      • read()
      • ...
    2. CascadeClassifier
      • detectMultiScale()
      • ...
    • 使用規(guī)律:
      • 打開攝像頭
      • 讀取圖像

OpenCV圖像特征處理

    1. 灰度變換
    cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);
    QImage i_out(img.data, img.cols, img.rows, QImage::Format_Grayscale8);
    
    
    1. Sobel變換
    cv::Sobel(img, sobel_img, -1, 1, 0, 3, 1, 128);
    QImage i_out(sobel_img.data, sobel_img.cols, sobel_img.rows, QImage::Format_RGB888);
    
    
    1. 高斯變換
    cv::GaussianBlur(img, img, cv::Size2i(21, 21), 6.0);
    QImage i_out(img.data, img.cols, img.rows, QImage::Format_RGB888);
    
    
    1. Filter2D:卷積運算
    cv::Mat o_img;
    cv::Mat kernel = (cv::Mat_<int>(3, 3) << 
        -1,  0,  1, 
        -1,  0,  1, 
        -1,  0,  1);
    
    cv::filter2D(img, o_img, -1, kernel, cv::Point2i(-1, -1), 0.0);
    QImage i_out(o_img.data, o_img.cols, o_img.rows, QImage::Format_RGB888);
    
    
  • 灰度轉換后效果截圖:

OpenCV人臉識別(可選)

  1. 人臉偵測
  2. 標識人臉
  • 相關代碼:

    while(true){
        // 視頻采集
        cv::Mat  img;
        dev->read(img);
        // 圖像處理?
        std::vector<cv::Rect> objs; // 用來存儲識別的人臉
        std::vector<int> rejectLeves;  // 返回拒絕的level
        std::vector<double> levelWeights; // level的權重
    
        classifier->detectMultiScale(
            img, // 輸入圖像
            objs,
            rejectLeves,
            levelWeights,
            1.05,      // 人臉搜索的模板
            3,         // 最小領域個數限制 
            1,       // 邊緣檢測(Canny)
            cv::Size(),
            cv::Size(),
            true
        );
        // 標記人臉
        if(!objs.empty()){
            for(int i = 0; i < objs.size(); i++){
                if(levelWeights[i] >= 10.5){
                    cv::rectangle(img, objs[i], cv::Scalar(0, 0, 255), 2);
                }
            }
        }
        // 視頻圖像發(fā)送到窗體顯示
        emit sig_video(img);
        QThread::usleep(1000);
    }
    
    
  • 了解下:

    • 二位碼識別
  • 代碼作業(yè):

    • 完成一個抓取視頻的程序(備份上交)
    • 在上一個程序基礎上,增加圖像效果;
    • 在第一個基礎上,識別人臉,并標記;
  • 筆記整理

    • 完成課堂筆記(說明,代碼,執(zhí)行效果的截圖)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容