如果你想要实现一个持续存储图像的功能,可以将图像采集和保存的过程放入一个循环中,并使用线程池来处理存储操作。这里是一个简单的示例,假设你有一个源(例如摄像头)不断地捕获图像并将其存储到文件中。
以下是一个完整的示例代码:
#include <QCoreApplication>
#include <QThreadPool>
#include <QRunnable>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <atomic>
class ImageSaver : public QRunnable {
public:
ImageSaver(const cv::Mat& image, const std::string& filename)
: m_image(image), m_filename(filename) {}
void run() override {
// 保存图像到文件
if (!cv::imwrite(m_filename, m_image)) {
std::cerr << "Failed to save image: " << m_filename << std::endl;
} else {
std::cout << "Image saved: " << m_filename << std::endl;
}
}
private:
cv::Mat m_image;
std::string m_filename;
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
// 创建线程池
QThreadPool threadPool;
threadPool.setMaxThreadCount(2); // 设置最大线程数为2
// 打开摄像头
cv::VideoCapture cap(0);
if (!cap.isOpened()) {
std::cerr << "Error opening video stream or file" << std::endl;
return -1;
}
int imageCount = 0; // 用于命名文件
while (true) {
cv::Mat frame;
// 捕获一帧
cap >> frame;
if (frame.empty()) {
break; // 如果没有捕获到帧,则退出循环
}
// 将图像保存任务提交到线程池中
threadPool.start(new ImageSaver(frame.clone(), "image_" + std::to_string(imageCount++) + ".png"));
// 可选:添加延迟以控制捕获频率(例如每秒捕获5张)
QThread::sleep(1); // 这会使程序每秒捕获一次图像,你可以根据需求调整或移除它。
// 可以在此处加入条件以退出循环,例如检测特定键盘输入等
}
cap.release(); //释放摄像头资源
return a.exec();
}
程序说明:
- 摄像头初始化:使用OpenCV中的
cv::VideoCapture
打开默认摄像头(索引0)。 - 持续读取:在
while
循环中,不断从摄像头捕捉图像。每次捕捉后,将图像传递给ImageSaver
类进行异步保存。 - 文件命名:使用计数器来生成唯一的文件名。
- 可选延迟:使用
QThread::sleep()
来控制帧率,你可以根据需要调整这个时间。 - 资源管理:在结束时释放摄像头资源。
编译和运行:
- 确保已正确安装Qt和OpenCV,并设置好项目文件如前面所述。
- 然后编译并运行程序,它会开始从默认摄像头持续捕获并保存图像。
希望这个例子能够满足你的需求!如果你还有其他问题,请随时询问。
内容由零声教学AI助手提供,问题来源于学员提问