【OpenCV学习】使用OpenCV打开摄像头并实现拍照功能
OpenCV中的HighGUI模块可以和摄像头中读取的实时数据流进行交互
这种方法很接近使用cv::VideoCapture从硬盘读取视频的方式(在我的上上一篇博客中有相关代码)
cv::VideoCapture对磁盘上的文件和摄像头是有一致接口的,对于前者,需要给一个读取文件名的路径,对于后者而言,需要给一个相机ID号,如果只有一个摄像头链接,则这个ID号通常为0,当ID值为-1时则代表任意选择一个
代码如下:
// 从摄像头中读取
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2//highgui/highgui.hpp>
#include <iostream>
int main() {
cv::namedWindow("暴风影音", cv::WINDOW_AUTOSIZE);
cv::VideoCapture cap;
// 读取摄像头
cap.open(0);
// 判断摄像头是否打开
if (!cap.isOpened()) {
std::cerr << "Could't open capture" << std::endl;
return -1;
}
cv::Mat frame;
// 接收键盘上的输入
char keyCode;
// 保存的图片名称
std::string imgName = "123.jpg";
while (1) {
// 把读取的摄像头传入Mat对象中
cap >> frame;
// 判断是否成功
if (frame.empty()) {
break;
}
// 把每一帧图片表示出来
cv::imshow("暴风影音", frame);
// 在30毫秒内等待是否存在键盘输入
keyCode = cv::waitKey(30);
if (keyCode == 's') {
// 把图片保存起来
cv::imwrite(imgName, frame);
imgName.at(0)++;
frame.release();
} else if (keyCode == 27) {
break;
}
}
return 0;
}
结果如图:
如果按s,则可以保存图片
如果按esc则可以退出