qt opencv线程存图加上线程锁并在存图完成后关闭线程
时间: 2023-05-16 16:05:50 浏览: 81
非常感谢您的提问。以下是一个可能的解决方案:
```cpp
#include <QCoreApplication>
#include <QThread>
#include <QMutex>
#include <opencv2/opencv.hpp>
using namespace cv;
class ImageSaver : public QThread
{
public:
ImageSaver(const std::string& filename, const Mat& image, QMutex& mutex)
: m_filename(filename), m_image(image), m_mutex(mutex)
{}
void run() override
{
m_mutex.lock();
imwrite(m_filename, m_image);
m_mutex.unlock();
}
private:
std::string m_filename;
Mat m_image;
QMutex& m_mutex;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
VideoCapture cap(0);
if (!cap.isOpened())
{
qDebug() << "Failed to open camera!";
return -1;
}
Mat frame;
namedWindow("Camera", WINDOW_NORMAL);
QMutex mutex;
ImageSaver* saver = nullptr;
while (true)
{
cap >> frame;
if (frame.empty())
{
qDebug() << "Failed to capture frame!";
break;
}
imshow("Camera", frame);
if (saver == nullptr || !saver->isRunning())
{
if (saver != nullptr)
{
saver->wait();
delete saver;
}
std::string filename = "image_" + std::to_string(time(nullptr)) + ".jpg";
saver = new ImageSaver(filename, frame, mutex);
saver->start();
}
int key = waitKey(1);
if (key == 'q')
{
break;
}
}
if (saver != nullptr)
{
saver->wait();
delete saver;
}
destroyAllWindows();
return a.exec();
}
```
这是一个使用 Qt 和 OpenCV 实现的程序,可以从摄像头捕获图像,并在后台线程中将图像保存到文件。为了避免多个线程同时访问同一个文件,我们使用了一个互斥锁来保护文件访问。当一个线程正在保存图像时,其他线程会等待,直到互斥锁被释放。
在主循环中,我们检查当前是否有一个图像保存线程正在运行。如果没有,我们创建一个新的线程,并将当前帧保存到文件。如果有,我们等待当前线程完成,然后删除它,并创建一个新的线程来保存当前帧。
请注意,这只是一个简单的示例,可能需要根据您的具体需求进行修改。
阅读全文