void MainWindow::connectToCamera()
{
    // Get next tab index
    int nextTabIndex = (deviceNumberMap.size()+fileNumberMap.size()==0) ? 0 : ui->tabWidget->count();
    // Show dialog
    CameraConnectDialog *cameraConnectDialog = new CameraConnectDialog(this);
    if(cameraConnectDialog->exec()==QDialog::Accepted)
    {
        if(cameraConnectDialog->isCamera()) {
            // Save user-defined device number
            int deviceNumber = cameraConnectDialog->getDeviceNumber();
            // Check if this camera is already connected
            if(!deviceNumberMap.contains(deviceNumber))
            {
                // Create ImageBuffer with user-defined size
                Buffer<Mat> *imageBuffer = new Buffer<Mat>(cameraConnectDialog->getImageBufferSize());
                // Add created ImageBuffer to SharedImageBuffer object
                sharedImageBuffer->add(deviceNumber, imageBuffer);
                // Create CameraView
                cameraViewMap[deviceNumber] = new CameraView(ui->tabWidget, deviceNumber, sharedImageBuffer);
                // Attempt to connect to camera
                if(cameraViewMap[deviceNumber]->connectToCamera(cameraConnectDialog->getDropFrameCheckBoxState(),
                                               cameraConnectDialog->getCaptureThreadPrio(),
                                               cameraConnectDialog->getProcessingThreadPrio(),
                                               cameraConnectDialog->getResolutionWidth(),
                                               cameraConnectDialog->getResolutionHeight(),
                                               cameraConnectDialog->getFpsNumber()))
                {
                    // Add to map
                    deviceNumberMap[deviceNumber] = nextTabIndex;
                    // Save tab label
                    QString tabLabel = cameraConnectDialog->getTabLabel();
                    // Allow tabs to be closed
                    ui->tabWidget->setTabsClosable(true);
                    // If start tab, remove
                    if(nextTabIndex==0)
                        ui->tabWidget->removeTab(0);
                    // Add tab
                    ui->tabWidget->addTab(cameraViewMap[deviceNumber], tabLabel + " [" + QString::number(deviceNumber) + "]");
                    ui->tabWidget->setCurrentWidget(cameraViewMap[deviceNumber]);
                    // Set tooltips
                    setTabCloseToolTips(ui->tabWidget, tr("Disconnect Camera"));
                    //Set Codec
                    cameraViewMap[deviceNumber]->setCodec(saveCodec);
                }
                // Could not connect to camera
                else
                {
                    // Display error message
                    QMessageBox::warning(this,tr("ERROR:"),tr("Could not connect to camera. Please check device number."));
                    // Explicitly delete widget
                    delete cameraViewMap[deviceNumber];
                    cameraViewMap.remove(deviceNumber);
                    // Remove from shared buffer
                    sharedImageBuffer->removeByDeviceNumber(deviceNumber);
                    // Explicitly delete ImageBuffer object
                    delete imageBuffer;
                }
            }
            // Display error message
            else
                QMessageBox::warning(this,tr("ERROR:"),tr("Could not connect to camera. Already connected."));
        }
        // Attempt to load a file
        else if(cameraConnectDialog->isFile()) {
            // Get the filepath from connectDialog
            QString filepath = cameraConnectDialog->getFilepath();
            // String can't be empty
            if(filepath.isEmpty()) {
                QMessageBox::warning(this,tr("ERROR:"),tr("Please enter path to video file."));
                connectToCamera();
                return;
            }
            // Load the File
            QFileInfo file(filepath);
            QString filename = file.fileName();
            if(file.exists()){
                // Create new Videofile entry in QMap
                videoViewMap[filename] = new VideoView(ui->tabWidget,filepath);
                // Attemp to load the video
                if(videoViewMap[filename]->loadVideo(cameraConnectDialog->getPlayerThreadPrio(),
                                                     cameraConnectDialog->getResolutionWidth(),
                                                     cameraConnectDialog->getResolutionHeight(),
                                                     cameraConnectDialog->getFpsNumber()))
                {
                    // Add to map
                    fileNumberMap[filename] = nextTabIndex;
                    // Save tab label
                    QString tabLabel = cameraConnectDialog->getTabLabel();
                    // Allow tabs to be closed
                    ui->tabWidget->setTabsClosable(true);
                    // If start tab remove
                    if(nextTabIndex==0)
                        ui->tabWidget->removeTab(0);
                    // Add tab
                    ui->tabWidget->addTab(videoViewMap[filename], tabLabel+"["+filename+"]");
                    ui->tabWidget->setCurrentWidget(videoViewMap[filename]);
                    // Set tooltips
                    setTabCloseToolTips(ui->tabWidget, tr("Remove Video"));
                    // Set Codec
                    videoViewMap[filename]->setCodec(saveCodec);
                    videoViewMap[filename]->set_useVideoCodec(useVideoCodec);
                }
                // Could not load video
                else {
                    // Display error message
                    QMessageBox::warning(this,tr("ERROR:"),tr("Could not convert Video. Please check file format."));
                    // Explicitly delete widget
                    delete videoViewMap[filename];
                    videoViewMap.remove(filename);
                }
            }
            // Error if file does not exist
            else {
                QMessageBox::warning(this,tr("ERROR:"),tr("File does not exist."));
                connectToCamera();
                return;
            }
        }
    }
    // Delete dialog
    delete cameraConnectDialog;
}
示例#2
0
void MainWindow::connectToCamera()
{
    // We cannot connect to a camera if devices are already connected and stream synchronization is in progress
    if(ui->actionSynchronizeStreams->isChecked() && deviceNumberMap.size()>0 && sharedImageBuffer->getSyncEnabled())
    {
        // Prompt user
        QMessageBox::warning(this, tr("qt-opencv-multithreaded"),
                                    tr("Stream synchronization is in progress.\n\n"
                                       "Please close all currently open streams before attempting to open a new stream."),
                                        QMessageBox::Ok);
    }
    // Attempt to connect to camera
    else
    {
        // Get next tab index
        int nextTabIndex = (deviceNumberMap.size()==0) ? 0 : ui->tabWidget->count();
        // Show dialog
        CameraConnectDialog *cameraConnectDialog = new CameraConnectDialog(this, ui->actionSynchronizeStreams->isChecked());
        if(cameraConnectDialog->exec()==QDialog::Accepted)
        {
            // Save user-defined device number
            int deviceNumber = cameraConnectDialog->getDeviceNumber();
            // Check if this camera is already connected
            if(!deviceNumberMap.contains(deviceNumber))
            {
                // Create ImageBuffer with user-defined size
                Buffer<Mat> *imageBuffer = new Buffer<Mat>(cameraConnectDialog->getImageBufferSize());
                // Add created ImageBuffer to SharedImageBuffer object
                sharedImageBuffer->add(deviceNumber, imageBuffer, ui->actionSynchronizeStreams->isChecked());
                // Create CameraView
                cameraViewMap[deviceNumber] = new CameraView(ui->tabWidget, deviceNumber, sharedImageBuffer);

                // Check if stream synchronization is enabled
                if(ui->actionSynchronizeStreams->isChecked())
                {
                    // Prompt user
                    int ret = QMessageBox::question(this, tr("qt-opencv-multithreaded"),
                                                    tr("Stream synchronization is enabled.\n\n"
                                                       "Do you want to start processing?\n\n"
                                                       "Choose 'No' if you would like to open additional streams."),
                                                    QMessageBox::Yes | QMessageBox::No,
                                                    QMessageBox::Yes);
                    // Start processing
                    if(ret==QMessageBox::Yes)
                    {
                        sharedImageBuffer->setSyncEnabled(true);
                    }
                    // Defer processing
                    else
                    {
                        sharedImageBuffer->setSyncEnabled(false);
                    }
                }

                // Attempt to connect to camera
                if(cameraViewMap[deviceNumber]->connectToCamera(cameraConnectDialog->getDropFrameCheckBoxState(),
                                               cameraConnectDialog->getCaptureThreadPrio(),
                                               cameraConnectDialog->getProcessingThreadPrio(),
                                               cameraConnectDialog->getEnableFrameProcessingCheckBoxState(),
                                               cameraConnectDialog->getResolutionWidth(),
                                               cameraConnectDialog->getResolutionHeight()))
                {
                    // Add to map
                    deviceNumberMap[deviceNumber] = nextTabIndex;
                    // Save tab label
                    QString tabLabel = cameraConnectDialog->getTabLabel();
                    // Allow tabs to be closed
                    ui->tabWidget->setTabsClosable(true);
                    // If start tab, remove
                    if(nextTabIndex==0)
                    {
                        ui->tabWidget->removeTab(0);
                    }
                    // Add tab
                    ui->tabWidget->addTab(cameraViewMap[deviceNumber], tabLabel + " [" + QString::number(deviceNumber) + "]");
                    ui->tabWidget->setCurrentWidget(cameraViewMap[deviceNumber]);
                    // Set tooltips
                    setTabCloseToolTips(ui->tabWidget, "Disconnect Camera");
                    // Prevent user from enabling/disabling stream synchronization after a camera has been connected
                    ui->actionSynchronizeStreams->setEnabled(false);
                }
                // Could not connect to camera
                else
                {
                    // Display error message
                    QMessageBox::warning(this,"ERROR:","Could not connect to camera. Please check device number.");
                    // Explicitly delete widget
                    delete cameraViewMap[deviceNumber];
                    cameraViewMap.remove(deviceNumber);
                    // Remove from shared buffer
                    sharedImageBuffer->removeByDeviceNumber(deviceNumber);
                    // Explicitly delete ImageBuffer object
                    delete imageBuffer;
                }
            }
            // Display error message
            else
            {
                QMessageBox::warning(this,"ERROR:","Could not connect to camera. Already connected.");
            }
        }
        // Delete dialog
        delete cameraConnectDialog;
    }
}