使用c语言在Linux系统中,使用opencv调用摄像头显示图像,在按下p键后将当前画面保存到路径/root/20204367yyh下,并从photo1开始为每个照片命名同时在画面左上角显示当前已保存图片数,按下q键后退出窗口。请给出代码并逐句解释
时间: 2023-05-28 17:05:36 浏览: 355
摄像头c语言
```c
#include <opencv2/opencv.hpp> // 包含opencv头文件
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap(0); // 打开摄像头
if (!cap.isOpened()) // 检查摄像头是否打开成功
{
cout << "Failed to open camera!" << endl;
return -1;
}
int count = 0; // 已保存图片数
string path = "/root/20204367yyh/"; // 保存路径
string filename; // 文件名
namedWindow("camera", WINDOW_NORMAL); // 创建窗口
while (true)
{
Mat frame;
cap >> frame; // 读取摄像头画面
imshow("camera", frame); // 显示画面
int key = waitKey(30); // 等待按键
if (key == 'p') // 按下p键保存图片
{
count++; // 更新已保存图片数
filename = "photo" + to_string(count) + ".jpg"; // 构造文件名
imwrite(path + filename, frame); // 保存图片
putText(frame, "Saved: " + to_string(count), Point(10, 30), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 2); // 在画面左上角显示已保存图片数
}
else if (key == 'q') // 按下q键退出窗口
{
break;
}
}
cap.release(); // 释放摄像头
destroyAllWindows(); // 销毁所有窗口
return 0;
}
```
代码解释:
1. `#include <opencv2/opencv.hpp>`:包含opencv头文件。
2. `using namespace cv;`:声明使用cv命名空间。
3. `VideoCapture cap(0);`:打开编号为0的摄像头。
4. `if (!cap.isOpened()) {...}`:检查摄像头是否打开成功。
5. `int count = 0;`:初始化已保存图片数为0。
6. `string path = "/root/20204367yyh/";`:指定保存路径。
7. `string filename;`:声明文件名变量。
8. `namedWindow("camera", WINDOW_NORMAL);`:创建名为"camera"的窗口。
9. `while (true) {...}`:循环读取摄像头画面并显示。
10. `Mat frame; cap >> frame;`:读取摄像头画面。
11. `imshow("camera", frame);`:显示画面。
12. `int key = waitKey(30);`:等待按键,每30ms检查一次。
13. `if (key == 'p') {...}`:按下p键保存当前画面。
14. `count++;`:已保存图片数加1。
15. `filename = "photo" + to_string(count) + ".jpg";`:构造文件名,例如"photo1.jpg"。
16. `imwrite(path + filename, frame);`:保存当前画面到指定路径。
17. `putText(frame, "Saved: " + to_string(count), Point(10, 30), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 2);`:在画面左上角显示已保存图片数。
18. `else if (key == 'q') {...}`:按下q键退出窗口。
19. `cap.release();`:释放摄像头资源。
20. `destroyAllWindows();`:销毁所有窗口。
21. `return 0;`:程序正常结束。
阅读全文