OpenCV를 사용하여 카메라에서 비디오 피드를 캡처하는 간단한 Qt 프로그램을 작성하고 있습니다. 루프를 사용하여 이미지를 캡처하여 MainWindow
개체에 공급하는 QThread
개체를 사용하고 있습니다. 이것은 정상적으로 작동합니다.종료시 멀티 스레드 Qt 애플리케이션이 중지되지 않습니다.
문제는 내가 닫을 때 (즉, "X"를 누르면) 카메라 캡처 스레드가 멈추고 GUI가 사라진다는 것입니다. 그러나 프로그램은 여전히 백그라운드에서 실행 중입니다. 또한 응용 프로그램 출력에 다음과 같은 경고 메시지가 표시됩니다.
QThread : 스레드가 실행 중일 때 삭제됩니다.
언제 응용 프로그램을 완전히 종료 할 수 있습니까?
MAIN.CPP
#include <QApplication>
#include "application.h"
using namespace cv;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Application app;
app.init();
return a.exec();
}
application.h
#include "mainwindow.h"
#include "camerathread.h"
#include "mathandler.h"
#include "tools.h"
#include "opencv2/core/core.hpp"
#ifndef APPLICATION
#define APPLICATION
class Application : public MatHandler{
MainWindow w;
CameraThread ct;
public:
Application() {
w.setFixedSize(800,600);
}
void init() {
ct.setMatHandler(this);
ct.start();
w.show();
}
void handleMat(cv::Mat mat) {
QImage qImage = toQImage(mat);
w.setImage(qImage);
}
};
#endif // APPLICATION
camerathread
#include <QThread>
#include "mathandler.h"
#include "opencv2/highgui/highgui.hpp"
#ifndef CAMERATHREAD
#define CAMERATHREAD
class CameraThread : public QThread {
MatHandler *matHandler;
public:
~CameraThread() {
}
void setMatHandler(MatHandler *h) {
matHandler = h;
}
private: void run() {
cv::VideoCapture vc(0);
if (vc.isOpened()) {
for(;;) {
cv::Mat img;
vc >> img;
matHandler->handleMat(img);
}
}
}
};
#endif // CAMERATHREAD
프로그램 C 이보다 더 많은 코드를 제공하지만, 나는 그 질문과 관련이 있다고 생각하는 코드만을 포함하고있다. 필요한 경우 나머지를 게시합니다.
UI 및 카메라 스레드 외에 다른 스레드가 실행되고 있는지 확인하십시오. 사용중인 API가 다른 스레드를 생성 할 수 있습니다. –
나는 이것을 확인하는 방법을 모르겠다 ... 설명해 주시겠습니까? – gromit190
실행중인 스레드를 확인하는 것은 사용중인 IDE에 따라 다릅니다 (소금이면 충분합니다). 예를 들어, 다음 검색 : https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=how%20to%20see%20running%20threads%20in%20eclipse이 결과를 산출했습니다. : http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fanalyzingthreads.html 그러나 다시 말하지만, 귀하의 IDE에 따라 다릅니다. 방금 샘플보기/w Eclipse를 시연했습니다. –