diff --git a/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExample.cpp b/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExample.cpp index f0b22eeb24..6a1176106f 100644 --- a/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExample.cpp +++ b/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExample.cpp @@ -1,200 +1,215 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "SimpleOpenCVExample.h" // mitk image #include #include #include #include #include const std::string SimpleOpenCVExample::VIEW_ID = "org.mitk.views.simpleopencvexample"; void SimpleOpenCVExample::SetFocus() {} void SimpleOpenCVExample::CreateQtPartControl(QWidget *parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); connect(m_Controls.m_StartGrabbing, SIGNAL(clicked()), this, SLOT(OnStartGrabbing())); connect(m_UpdateTimer, SIGNAL(timeout()), this, SLOT(OnUpdateImage())); } SimpleOpenCVExample::SimpleOpenCVExample() : m_running(false), m_UpdateTimer(new QTimer()) {} SimpleOpenCVExample::~SimpleOpenCVExample() {} void SimpleOpenCVExample::OnStartGrabbing() { if (!m_running) { grabbedFrames = 0; grabbingStart = std::chrono::system_clock::now().time_since_epoch(); m_running = true; m_Controls.m_StartGrabbing->setText("Stop Video Grabbing"); m_VideoCapture = new cv::VideoCapture(); // open the default camera m_VideoCapture->open(m_Controls.m_InputID->value()); if (!m_VideoCapture->isOpened()) { return; } // check if we succeeded if (m_Controls.m_enableResolution->isChecked()) { m_VideoCapture->set(CV_CAP_PROP_FRAME_WIDTH, m_Controls.m_resX->value()); m_VideoCapture->set(CV_CAP_PROP_FRAME_HEIGHT, m_Controls.m_resY->value()); } if (m_Controls.m_secondStream->isChecked()) { m_VideoCapture2 = cv::VideoCapture(); m_VideoCapture2.open(m_Controls.m_InputID_2->value()); } int millisPerFrame = 1000.0 / m_Controls.m_UpdateRate->value(); int fps = m_Controls.m_UpdateRate->value(); if (m_Controls.m_writeFile->isChecked()) { - cv::Size S = cv::Size((int)m_VideoCapture->get(CV_CAP_PROP_FRAME_WIDTH), // Acquire input size - (int)m_VideoCapture->get(CV_CAP_PROP_FRAME_HEIGHT)); - std::string name = m_Controls.m_firstFile->text().toStdString(); - m_outputVideo1 = cv::VideoWriter(); - m_outputVideo1.open(name, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, S, true); m_ImageCollection1 = std::vector(); if (m_Controls.m_secondStream->isChecked()) { - cv::Size S = cv::Size((int)m_VideoCapture->get(CV_CAP_PROP_FRAME_WIDTH), // Acquire input size - (int)m_VideoCapture->get(CV_CAP_PROP_FRAME_HEIGHT)); - m_outputVideo2 = cv::VideoWriter(); - m_outputVideo2.open( - m_Controls.m_secondFile->text().toStdString(), cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, S, true); m_ImageCollection2 = std::vector(); } } if (m_Controls.m_SeparateWindow->isChecked()) { cv::namedWindow("Video", 1); if (m_Controls.m_secondStream->isChecked()) cv::namedWindow("Video2", 1); } else if (m_Controls.m_MITKImage->isChecked()) { mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetName("Open CV Example Image Stream"); imageNode->SetData(mitk::Image::New()); m_conversionFilter = mitk::OpenCVToMitkImageFilter::New(); this->GetDataStorage()->Add(imageNode); OnUpdateImage(); // Initialize view on Image mitk::IRenderWindowPart *renderWindow = this->GetRenderWindowPart(); if (renderWindow != NULL) renderWindow->GetRenderingManager()->InitializeViews( imageNode->GetData()->GetGeometry(), mitk::RenderingManager::REQUEST_UPDATE_2DWINDOWS, true); } // Start timer for update loop + m_UpdateTimer->setTimerType(Qt::PreciseTimer); m_UpdateTimer->setInterval(millisPerFrame); m_UpdateTimer->start(); } else { grabbingEnd = std::chrono::system_clock::now().time_since_epoch(); m_UpdateTimer->stop(); + + auto grabbedMillis = std::chrono::duration_cast(grabbingEnd).count() - + std::chrono::duration_cast(grabbingStart).count(); + MITK_INFO << "Grabbed " << grabbedFrames << " frames in " << grabbedMillis << " ms"; + double fps = grabbedFrames / (grabbedMillis / 1000); + m_reachedFPS = fps; + + if (m_Controls.m_writeFile->isChecked()) + { + cv::Size S = cv::Size((int)m_VideoCapture->get(CV_CAP_PROP_FRAME_WIDTH), // Acquire input size + (int)m_VideoCapture->get(CV_CAP_PROP_FRAME_HEIGHT)); + std::string name = m_Controls.m_firstFile->text().toStdString(); + m_outputVideo1 = cv::VideoWriter(); + m_outputVideo1.open(name, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, S, true); + + if (m_Controls.m_secondStream->isChecked()) + { + cv::Size S = cv::Size((int)m_VideoCapture->get(CV_CAP_PROP_FRAME_WIDTH), // Acquire input size + (int)m_VideoCapture->get(CV_CAP_PROP_FRAME_HEIGHT)); + m_outputVideo2 = cv::VideoWriter(); + m_outputVideo2.open( + m_Controls.m_secondFile->text().toStdString(), cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, S, true); + } + } + MITK_INFO << "Reached framerate (frames per second): " << fps; + if (m_Controls.m_writeFile->isChecked()) { for (cv::Mat frame1 : m_ImageCollection1) m_outputVideo1.write(frame1); + MITK_INFO << "Saved file 1 to " << m_Controls.m_firstFile->text().toStdString(); if (m_Controls.m_secondStream->isChecked()) { for (cv::Mat frame2 : m_ImageCollection2) m_outputVideo2.write(frame2); + MITK_INFO << "Saved file 2 to " << m_Controls.m_secondFile->text().toStdString(); } } m_ImageCollection1.clear(); m_ImageCollection2.clear(); m_outputVideo1 = cv::VideoWriter(); m_outputVideo2 = cv::VideoWriter(); m_running = false; m_Controls.m_StartGrabbing->setText("Start Video Grabbing"); cv::destroyWindow("Video"); cv::destroyWindow("Video2"); mitk::DataNode::Pointer imageNode = this->GetDataStorage()->GetNamedNode("Open CV Example Image Stream"); this->GetDataStorage()->Remove(imageNode); m_VideoCapture->release(); delete m_VideoCapture; - auto grabbedMillis = std::chrono::duration_cast(grabbingEnd).count() - - std::chrono::duration_cast(grabbingStart).count(); - MITK_INFO << "Grabbed " << grabbedFrames << " frames in " << grabbedMillis << " ms"; - double fps = grabbedFrames / (grabbedMillis/1000); - MITK_INFO << "Framerate (frames per second): " << fps; + } } void SimpleOpenCVExample::OnUpdateImage() { grabbedFrames++; if (m_Controls.m_MITKImage->isChecked()) updateMITKImage(); else updateOpenCVWindow(); } void SimpleOpenCVExample::updateMITKImage() { cv::Mat image; *m_VideoCapture >> image; IplImage ipl_img = image; m_conversionFilter->SetOpenCVImage(&ipl_img); m_conversionFilter->Update(); this->GetDataStorage()->GetNamedNode("Open CV Example Image Stream")->SetData(m_conversionFilter->GetOutput()); this->RequestRenderWindowUpdate(mitk::RenderingManager::REQUEST_UPDATE_ALL); } void SimpleOpenCVExample::updateOpenCVWindow() { cv::Mat frame; *m_VideoCapture >> frame; // get a new frame from camera m_ImageCollection1.push_back(frame); if (m_Controls.m_ShowImages->isChecked()) imshow("Video", frame); if (m_Controls.m_secondStream->isChecked()) { cv::Mat frame2; m_VideoCapture2 >> frame2; if (m_Controls.m_ShowImages->isChecked()) imshow("Video2", frame2); if (m_Controls.m_writeFile->isChecked()) m_ImageCollection2.push_back(frame2); // m_outputVideo2.write(frame2); } //if (m_Controls.m_writeFile->isChecked()) // m_outputVideo1.write(frame); } diff --git a/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExample.h b/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExample.h index 6efd4e168a..a9d98d8e48 100644 --- a/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExample.h +++ b/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExample.h @@ -1,79 +1,80 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef SimpleOpenCVExample_h #define SimpleOpenCVExample_h #include #include #include #include "ui_SimpleOpenCVExampleControls.h" #include "mitkOpenCVToMitkImageFilter.h" #include "opencv2/opencv.hpp" #include /** \brief TODO */ class SimpleOpenCVExample : public QmitkAbstractView { Q_OBJECT public: static const std::string VIEW_ID; SimpleOpenCVExample(); virtual ~SimpleOpenCVExample(); protected slots: /// \brief Called when the user clicks the GUI button void OnStartGrabbing(); void OnUpdateImage(); protected: virtual void CreateQtPartControl(QWidget *parent) override; virtual void SetFocus() override; bool m_running; cv::VideoCapture *m_VideoCapture; cv::VideoCapture m_VideoCapture2; cv::VideoWriter m_outputVideo1; cv::VideoWriter m_outputVideo2; std::chrono::system_clock::duration grabbingStart; std::chrono::system_clock::duration grabbingEnd; int grabbedFrames; + int m_reachedFPS; std::vector m_ImageCollection1; std::vector m_ImageCollection2; mitk::OpenCVToMitkImageFilter::Pointer m_conversionFilter; Ui::SimpleOpenCVExampleControls m_Controls; QTimer *m_UpdateTimer; void updateMITKImage(); void updateOpenCVWindow(); }; #endif // SimpleOpenCVExample_h