opencv使用級聯(lián)分類器實現(xiàn)圖像識別功能的教程【Qt】

#include <openCV2/core.hpp>????// OpenCV的核心功能,包括矩陣等基本數(shù)據(jù)結構
#include <openCV2/imgcodecs.hpp>?// 圖像編解碼相關的功能
#include <openCV2/highgui.hpp>??// 圖形用戶界面(GUI)相關的功能
#include <openCV2\opencv.hpp>
#include <iostream>
#include <vector>
#include <qthread.h>
#include <QtWidgets/QApplication>
using namespace cv;
using namespace std;
// 繪制矩形框在圖像上
void DrawRect(Mat& src, vector<Rect>& object) {
if (object.empty()) {
return;
}
for (int i = 0; i < object.size(); i++) {
int x = object[i].tl().x;??// 矩形框左上角 x 坐標
int y = object[i].tl().y;??// 矩形框左上角 y 坐標
int w = object[i].width;??// 矩形框寬度
int h = object[i].height;??// 矩形框高度
// 如果矩形框的寬度或高度大于100像素,則不繪制
if (w > 100 || h > 100)
return;
// 繪制矩形框,使用紅色顏色,線寬為6
rectangle(src, Rect(x, y, w, h), Scalar(255, 0, 0), 6);
}
}
// 顯示視頻并進行目標檢測
void ShowVideo() {
VideoCapture cap("G:\\video\\qwe.mp4");?// 打開視頻文件
if (!cap.isOpened()) {
cout << "視頻打開失敗" << endl;
return;
}
cout << "視頻打開成功" << endl;
CascadeClassifier cascade;?// 創(chuàng)建級聯(lián)分類器對象
if (!cascade.load("G:\\img\\data\\cascade.xml")) {?// 加載級聯(lián)分類器的 XML 文件
cout << "級聯(lián)分類器加載失敗" << endl;
return;
}
cout << "級聯(lián)分類器加載成功" << endl;
vector<Rect> rects;
Mat img;
while (cap.read(img))?// 讀取視頻幀
{
rects.clear();
cascade.detectMultiScale(img, rects);?// 對圖像進行目標檢測,返回矩形框的位置
if (!rects.empty()) {
DrawRect(img, rects);?// 繪制檢測到的矩形框
imshow("video", img);?// 顯示帶有矩形框的圖像
}
QCoreApplication::processEvents();?// 處理Qt事件
QThread::msleep(30);?// 等待30毫秒,控制視頻播放速度
}
cap.release();?// 釋放視頻資源
return;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);?// 創(chuàng)建Qt應用程序對象
ShowVideo();?// 調用函數(shù)顯示視頻并進行目標檢測
return a.exec();?// 運行Qt應用程序的事件循環(huán)
}