OpenCV 视频抓取
- 构建一个项目工程
- 创建目录/文件结构
- 工程组织文件(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. 输出的执行文件
TARGET = main
- 创建Qt应用
- 通过Qt designer创建合适的对话框
- 更改名称,适配代码文件
- 合理布局
-
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");
}
- 视频采集
- 使用信号发送给窗体显示
- 定义信号-> 发送:
- 接受信号-> 显示
- 使用信号发送给窗体显示
void CVDialog::gray(){
type = 1;
}
void CVDialog::gauss(){
type = 2;
}
... ...
if(type == 1){
... ...
}
if(type == 2){
... ...
}
- 视频抓取截图:
- OpenCV的视频采集的相关的类
- VideoCapture
- read()
- ...
- CascadeClassifier
- detectMultiScale()
- ...
- 使用规律:
- 打开摄像头
- 读取图像
- 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); } } } // 视频图像发送到窗体显示 emit sig_video(img); QThread::usleep(1000); }
-
了解下:
- 二位码识别
-
代码作业:
- 完成一个抓取视频的程序(备份上交)
- 在上一个程序基础上,增加图像效果;
- 在第一个基础上,识别人脸,并标记;
-
笔记整理
- 完成课堂笔记(说明,代码,执行效果的截图)