文章目录
-
- 一、视频的播放
- 二、打开摄像头,并拍照
- [三、人脸检测 + 自动拍照(检测到人脸时保存照片)](#三、人脸检测 + 自动拍照(检测到人脸时保存照片))
一、视频的播放
cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// 打开默认摄像头(0 表示第一个摄像头)
VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "无法打开摄像头!" << endl;
return -1;
}
// 获取摄像头帧率
double fps = cap.get(CAP_PROP_FPS);
cout << "Camera FPS: " << fps << endl;
Mat frame;
int imgCount = 0;
while (true) {
cap >> frame; // 捕获一帧
if (frame.empty()) {
cerr << "无法获取摄像头图像!" << endl;
break;
}
imshow("Camera", frame);
int key = waitKey(30);
if (key == 27) { // ESC 退出
break;
} else if (key == 32) { // 空格键拍照
string filename = "photo_" + to_string(imgCount++) + ".jpg";
imwrite(filename, frame);
cout << "已保存: " << filename << endl;
}
}
cap.release();
destroyAllWindows();
return 0;
}
二、打开摄像头,并拍照
cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// 打开默认摄像头(0 表示第一个摄像头)
VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "无法打开摄像头!" << endl;
return -1;
}
// 获取摄像头帧率
double fps = cap.get(CAP_PROP_FPS);
cout << "Camera FPS: " << fps << endl;
Mat frame;
int imgCount = 0;
while (true) {
cap >> frame; // 捕获一帧
if (frame.empty()) {
cerr << "无法获取摄像头图像!" << endl;
break;
}
imshow("Camera", frame);
int key = waitKey(30);
if (key == 27) { // ESC 退出
break;
} else if (key == 32) { // 空格键拍照
string filename = "photo_" + to_string(imgCount++) + ".jpg";
imwrite(filename, frame);
cout << "已保存: " << filename << endl;
}
}
cap.release();
destroyAllWindows();
return 0;
}
三、人脸检测 + 自动拍照(检测到人脸时保存照片)
cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// 加载人脸分类器(OpenCV 自带的 XML 文件)
CascadeClassifier face_cascade;
if (!face_cascade.load("haarcascade_frontalface_default.xml")) {
cerr << "无法加载人脸检测模型!" << endl;
return -1;
}
// 打开摄像头
VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "无法打开摄像头!" << endl;
return -1;
}
Mat frame, gray;
while (true) {
cap >> frame;
if (frame.empty()) break;
// 转灰度图(检测人脸时建议用灰度图)
cvtColor(frame, gray, COLOR_BGR2GRAY);
equalizeHist(gray, gray); // 直方图均衡化,提高检测效果
// 检测人脸
vector<Rect> faces;
face_cascade.detectMultiScale(
gray, faces,
1.1, // 缩放因子
3, // 最小邻居数
0, // 标志位
Size(30, 30) // 最小检测目标
);
// 在原图上画矩形框
for (size_t i = 0; i < faces.size(); i++) {
rectangle(frame, faces[i], Scalar(0, 255, 0), 2); // 绿色框
}
imshow("Face Detection", frame);
// 按 ESC 退出
if (waitKey(30) == 27) break;
}
cap.release();
destroyAllWindows();
return 0;
}