Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用OpenCV在Qt中启用多个窗口?_C++_Qt_Opencv_Ubuntu 16.04 - Fatal编程技术网

C++ 如何使用OpenCV在Qt中启用多个窗口?

C++ 如何使用OpenCV在Qt中启用多个窗口?,c++,qt,opencv,ubuntu-16.04,C++,Qt,Opencv,Ubuntu 16.04,我正在开发一个应用程序,它需要使用来自单个摄像头的实时视频源来检查某些工业过程。我想知道是否可以只使用一个摄像头创建多个窗口。此外,每个窗口都有不同的关注区域。 我正在QThread中运行此代码 这是我一直在尝试的代码,但一运行它就崩溃了 mythread.cpp 谁能告诉我哪里出了问题吗?你绝对可以这样做。 只需创建多个视图,并通过一些更新信号将相机的输出链接到窗口中的显示功能,您希望它通过一些更新和渲染槽显示。 因此,在概念上: 创建多个视图 在每个视图中设置感兴趣的区域 将相机输出连接到每

我正在开发一个应用程序,它需要使用来自单个摄像头的实时视频源来检查某些工业过程。我想知道是否可以只使用一个摄像头创建多个窗口。此外,每个窗口都有不同的关注区域。 我正在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.
            }
        }
   }