OpenCV學習代碼記錄——人臉檢測
阿新 • • 發佈:2018-04-05
puts tro 按鍵 img IE source cpu cpp gray
很久之前學習過一段時間的OpenCV,當時沒有做什麽筆記,但是代碼都還在,這裏把它貼出來做個記錄。
代碼放在碼雲上,地址在這裏https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/imgproc.hpp>
#include <cstdio>
// g++ face.cpp -o face -std=c++11 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_objdetect
// 文件在opencv的安裝目錄下有
static const char* cascade_name = "D:\\OpenCV\\share\\OpenCV\\haarcascades\\"
"haarcascade_frontalface_alt2.xml";
// http://wiki.opencv.org.cn/index.php/%E4%BA%BA%E8%84%B8%E6%A3%80%E6%B5%8B
void frameFaceDetection(cv::Mat& src, cv::CascadeClassifier& cascade,
const char* showWindowName);
int FaceDetection(int c,char**v)
{
//cv::Mat src,gray; // 源圖像,灰度圖像
cv::VideoCapture capture; // 視頻捕獲對象
cv::Mat frame; // 視頻幀
cv::CascadeClassifier cascade; //級聯分類器
/**
// 加載源圖像
const char* picpath = "../Image/sisy.jpg";
if (c > 1) { picpath = v[1]; }
src = cv::imread(picpath);
if (src.empty()) {
puts("圖片加載失敗!!!");
return -1;
}
*/
// 打開視頻文件
if (!capture.open("../Image/video.mov")) {
puts("打開視頻文件失敗!!!");
return -1;
}
// 加載人臉識別級聯分類器文件
if (!cascade.load(cascade_name)){
puts("人臉識別級聯分類器文件加載失敗!!!");
return 0;
}
// 創建顯示窗口
cv::namedWindow("src");
cv::Mat src_scale;
src_scale.create(cv::Size(480, 320), CV_8SC3);
// 循環取幀並顯示
while (capture.read(frame)) {
// 進行縮放
cv::resize(frame, src_scale, src_scale.size());
// 檢測並顯示
frameFaceDetection(src_scale, cascade, "src");
// 等待按鍵事件
// 此處等待也為顯示圖像函數提供足夠的時間完成顯示
// 等待事件可以按照CPU速度進行調節
if (cv::waitKey(1) >= 0) {
break; // 按鍵就退出
}
}
//cv::waitKey();
cv::destroyAllWindows();
return 0;
}
void frameFaceDetection(cv::Mat& src,
cv::CascadeClassifier& cascade,
const char* showWindowName)
{
std::vector<cv::Rect> faces;
cv::Mat gray;
// 獲取源圖像的灰度圖像
gray.create(src.size(), CV_8UC1);
cv::cvtColor(src, gray, CV_BGR2GRAY);
// 使灰度圖象直方圖均衡化
cv::equalizeHist(gray, gray);
// 獲取初步檢測結果
cascade.detectMultiScale(
gray/*源圖像*/,
faces/*檢測出的物體邊緣(得到被檢測物體的矩形框向量組)*/,
1.1/*每一個圖像尺度中的尺度參數,默認值為1.1*/,
2/*每一個級聯矩形應該保留的鄰近個數*/,
CV_HAAR_SCALE_IMAGE,
cv::Size(30, 30)/*最小可能的對象的大小,小於的對象將被忽略*/);
// 將檢測得到的結果,繪制到原圖像上
for (auto face : faces) {
// 繪制紅色矩形
cv::rectangle(src, face, cv::Scalar(0, 0, 255), 3);
}
// 顯示圖像
cv::imshow(showWindowName, src);
}
OpenCV學習代碼記錄——人臉檢測