Как включить Multiple Windows в Qt, используя OpenCV? - PullRequest
0 голосов
/ 03 апреля 2019

Я разрабатываю приложение, которое требует проверки определенного производственного процесса с использованием прямой трансляции видео с одной камеры.Я хочу знать, возможно ли создать multiple windows, используя только одну камеру.Кроме того, каждый window будет иметь свой Region Of Interest.Я запускаю этот код в QThread
Вот код, который я пробовал, но он вылетает, как только я его запускаю.

mythread.cpp

#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.
            }
        }
   }

Может кто-нибудь сказать мне, где я иду не так?

1 Ответ

1 голос
/ 03 апреля 2019

Вы можете сделать это абсолютно. Просто создайте несколько видов и свяжите выходные данные камеры (через некоторый сигнал обновления) с функциональностью отображения в окне, которым вы хотите (через некоторый слот обновления и рендеринга). Итак, концептуально:

  • Создание нескольких представлений
  • Установить область интересов в каждом представлении
  • Подключите выход камеры к каждому виду
  • Если новое изображение прибывает, уведомите представление. Каждое представление извлекает интересующую область и отображает ее.

Тогда каждое представление запускает свой собственный цикл обработки событий, так что все должно быть в порядке. Общее примечание: AFAIK считается плохой практикой подкласс QThread или делать подобные вещи. Я бы предпочел рабочий подход здесь.

...