C++ 如何使用OpenCV在Qt中启用多个窗口?
我正在开发一个应用程序,它需要使用来自单个摄像头的实时视频源来检查某些工业过程。我想知道是否可以只使用一个摄像头创建多个窗口。此外,每个窗口都有不同的关注区域。 我正在QThread中运行此代码 这是我一直在尝试的代码,但一运行它就崩溃了 mythread.cppC++ 如何使用OpenCV在Qt中启用多个窗口?,c++,qt,opencv,ubuntu-16.04,C++,Qt,Opencv,Ubuntu 16.04,我正在开发一个应用程序,它需要使用来自单个摄像头的实时视频源来检查某些工业过程。我想知道是否可以只使用一个摄像头创建多个窗口。此外,每个窗口都有不同的关注区域。 我正在QThread中运行此代码 这是我一直在尝试的代码,但一运行它就崩溃了 mythread.cpp 谁能告诉我哪里出了问题吗?你绝对可以这样做。 只需创建多个视图,并通过一些更新信号将相机的输出链接到窗口中的显示功能,您希望它通过一些更新和渲染槽显示。 因此,在概念上: 创建多个视图 在每个视图中设置感兴趣的区域 将相机输出连接到每
谁能告诉我哪里出了问题吗?你绝对可以这样做。 只需创建多个视图,并通过一些更新信号将相机的输出链接到窗口中的显示功能,您希望它通过一些更新和渲染槽显示。 因此,在概念上: 创建多个视图 在每个视图中设置感兴趣的区域 将相机输出连接到每个视图 如果新图像到达,通知视图。每个视图都将提取感兴趣的区域并进行渲染。 然后,每个视图都运行自己的事件循环,这样就可以了。 一般注意事项:AFAIK将QThread子类化或执行类似操作被认为是不好的做法。我更喜欢这里的咖啡
#include "mythread.h"
#include "mainwindow.h"
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
char key;
MyThread::MyThread(QObject *parent, bool b) : QThread(parent), Stop(b)
{
}
// run() will be called when a thread starts
void MyThread::run()
{
cvNamedWindow("Camera_Output", 1); //Create window
cvNamedWindow("Camera_Output1", 1);
CvCapture* capture = cvCaptureFromCAM(0); //Capture using camera 0 connected to system
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 );
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 );
CvCapture* capture1 = cvCaptureFromCAM(0); //Capture using camera 0 connected to system
cvSetCaptureProperty( capture1, CV_CAP_PROP_FRAME_WIDTH, 640 );
cvSetCaptureProperty( capture1, CV_CAP_PROP_FRAME_HEIGHT, 480 );
//Create loop for live streaming
while(1){
IplImage* framein = cvQueryFrame(capture); //Create image frames from capture
IplImage* framein1 = cvQueryFrame(capture1);
/* sets the Region of Interest - rectangle area has to be __INSIDE__ the image */
cvSetImageROI(framein, cvRect(200, 200, 320, 240));
cvSetImageROI(framein1, cvRect(500, 500, 320, 240));
/* create destination image - cvGetSize will return the width and the height of ROI */
IplImage *frameout = cvCreateImage(cvGetSize(framein), framein->depth, framein->nChannels);
IplImage *frameout1 = cvCreateImage(cvGetSize(framein1), framein1->depth, framein1->nChannels);
/* copy subimage */
cvCopy(framein, frameout, NULL);
cvCopy(framein1, frameout1, NULL);
/* always reset the Region of Interest */
cvResetImageROI(framein);
cvResetImageROI(framein1);
cvShowImage("Camera_Output", frameout); //Show image frames on created window
cvShowImage("Camera_Output1", frameout1);
key = cvWaitKey(10); //Capture Keyboard stroke
if (char(key) == 27){
break; //ESC key loop will break.
}
}
}