OpenCV 視頻抓取
- 構建一個項目工程
- 創(chuàng)建目錄/文件結構
- 工程組織文件(Makefile
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
- 創(chuàng)建Qt應用
- 通過Qt designer創(chuàng)建合適的對話框
- 更改名稱,適配代碼文件
- 合理布局

-
UI交互
- 在Qt designer界面搭建信號和槽
- 在代碼中引入信號和槽,并定義槽函數
- 綁定對話框與槽函數的調用關系
多線程
- 引入新線程,用于視頻自采集
CVVideo::CVVideo(QObject *parent):
QThread(parent),
dev(new cv::VideoCapture(0, cv::CAP_DSHOW)){
classifier = new cv::CascadeClassifier("haarcascade_frontalface_alt2.xml");
}
- 視頻采集
- 使用信號發(fā)送給窗體顯示
- 定義信號-> 發(fā)送:
- 接受信號-> 顯示
- 使用信號發(fā)送給窗體顯示
void CVDialog::gray(){
type = 1;
}
void CVDialog::gauss(){
type = 2;
}
... ...
if(type == 1){
... ...
}
if(type == 2){
... ...
}
- 視頻抓取截圖:

- OpenCV的視頻采集的相關的類
- VideoCapture
- read()
- ...
- CascadeClassifier
- detectMultiScale()
- ...
- 使用規(guī)律:
- 打開攝像頭
- 讀取圖像
- VideoCapture
OpenCV圖像特征處理
-
- 灰度變換
cv::cvtColor(img, img, cv::COLOR_BGR2GRAY); QImage i_out(img.data, img.cols, img.rows, QImage::Format_Grayscale8); -
- 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); -
- 高斯變換
cv::GaussianBlur(img, img, cv::Size2i(21, 21), 6.0); QImage i_out(img.data, img.cols, img.rows, QImage::Format_RGB888); -
- 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人臉識別(可選)
- 人臉偵測
- 標識人臉
-
相關代碼:
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í)行效果的截圖)