Я делаю приложение Qt GUI, которое использует пользовательский QLabel
класс (имя как ImageInteraction
) показывать изображения с потоковой камеры, а также разрешать взаимодействие мыши с изображением. Поскольку у GUI есть другие функции, настроенный класс QLabel выполняет работу по извлечению изображения из камеры и обновлению показанного изображения через while
цикл в функции, которая запускается в другом потоке. Код для этого, как показано ниже:
void ImageInteraction::startVideo()
{
if (!capture.open(streamUrl))
{
QMessageBox::warning(this, "Error", "No input device availabe!");
}
else
{
QFuture<void> multiprocess = QtConcurrent::run(this, &ImageInteraction::loadVideo);
}
}
void ImageInteraction::loadVideo()
{
while(loopContinue){
cv::Mat frame;
capture.read(frame);
if(!frame.empty())
{
cv::cvtColor(frame, frame, CV_BGR2RGBA);
cv::resize(frame, frame, cv::Size(this->width(), this->height()), 0, 0);
QImage image(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGBA8888);
this->setPixmap(QPixmap::fromImage(image));
}
}
capture.release();
}
Вот capture
имеет тип cv::VideoCapture
а также loopContinue
является логическим типом, который изначально установлен как true
, Eсть closeEvent()
функция, которая вызывает метод для остановки захвата изображения с камеры.
void MainWindow::closeEvent(QCloseEvent *event)
{
liveVideo->stopVideoThread();//liveVideo is a pointer to an object of ImageInteraction
event->accept();
}
где stopVideoThread
просто устанавливает логический флаг loopContinue
в false
и имеет следующий простой код:
void ImageInteraction::stopVideoThread()
{
mutex.lock();//QMutex mutex;
loopContinue = false;
mutex.unlock();
}
В моем понимании while
зациклиться loadVideo
метод должен быть остановлен один раз stopVideoThread
метод вызывается и loopContinue
установлено в false. Но на самом деле, когда кнопка закрытия нажата, видимо она не останавливается while
цикл и приложение вылетает с сообщением:
The inferior stopped because it received a signal from the operating system.
Signal name : SIGSEGV
Signal meaning : Segmentation fault
Я использую QtConcurrent::run
метод и QMutex
ошибочно возразить? Не могли бы вы определить, в чем проблема? К вашему сведению, ОС — это Ubuntu 14.04, а IDE — QtCreator.
Спасибо!
Следующее — только идея улучшений, упомянутых в комментариях выше.
class ImageInteraction
{
public:
~ImageInteraction()
{
multiprocess_.waitForFinished();
}
void startVideo()
{
if (!capture.open(streamUrl))
{
QMessageBox::warning(this, "Error", "No input device availabe!");
}
else
{
multiprocess_ = QtConcurrent::run(this, &ImageInteraction::loadVideo);
}
}
void loadVideo()
{
while(loopContinue_)
{
cv::Mat frame;
capture.read(frame);
if(!frame.empty())
{
cv::cvtColor(frame, frame, CV_BGR2RGBA);
cv::resize(frame, frame, cv::Size(this->width(), this->height()), 0, 0);
QImage image(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGBA8888);
this->setPixmap(QPixmap::fromImage(image));
}
}
capture.release();
}
void stopVideoThread()
{
loopContinue_ = false;
//multiprocess_.waitForFinished(); // you can call this here if you want to make sure that the thread has finished before returning
}
private:
QFuture<void> multiprocess_;
std::atomic<bool> loopContinue_;
};
Других решений пока нет …