diff --git a/Examples/Plugins/org.mitk.example.gui.opencv/files.cmake b/Examples/Plugins/org.mitk.example.gui.opencv/files.cmake index 6d4570edac..47ce55d4fb 100644 --- a/Examples/Plugins/org.mitk.example.gui.opencv/files.cmake +++ b/Examples/Plugins/org.mitk.example.gui.opencv/files.cmake @@ -1,29 +1,35 @@ set(SRC_CPP_FILES ) set(INTERNAL_CPP_FILES videoplayer/QmitkVideoPlayer.cpp + SimpleOpenCVExample.cpp mitkPluginActivator.cpp ) +set(UI_FILES + src/internal/SimpleOpenCVExampleControls.ui +) + set(MOC_H_FILES src/internal/mitkPluginActivator.h src/internal/videoplayer/QmitkVideoPlayer.h + src/internal/SimpleOpenCVExample.h ) set(CACHED_RESOURCE_FILES resources/videoplayer.gif plugin.xml ) set(QRC_FILES ) foreach(file ${SRC_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/${file}) endforeach(file ${SRC_CPP_FILES}) foreach(file ${INTERNAL_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/internal/${file}) endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Examples/Plugins/org.mitk.example.gui.opencv/plugin.xml b/Examples/Plugins/org.mitk.example.gui.opencv/plugin.xml index 16e9d773f5..5f1279edeb 100644 --- a/Examples/Plugins/org.mitk.example.gui.opencv/plugin.xml +++ b/Examples/Plugins/org.mitk.example.gui.opencv/plugin.xml @@ -1,14 +1,20 @@ <?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.0"?> <plugin> <extension point="org.blueberry.ui.views"> <view id="org.mitk.views.videoplayer" name="VideoPlayer" category="org.mitk.views.example" icon="resources/videoplayer.gif" class="QmitkVideoPlayer" /> + <view + id="org.mitk.views.simpleopencvexample" + name="Simple OpenCV Example" + category="org.mitk.views.example" + icon="resources/videoplayer.gif" + class="SimpleOpenCVExample" /> </extension> </plugin> 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 new file mode 100644 index 0000000000..0938f1d1e4 --- /dev/null +++ b/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExample.cpp @@ -0,0 +1,90 @@ +/*=================================================================== + +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 <berryISelectionService.h> +#include <berryIWorkbenchWindow.h> + +// Qmitk +#include "SimpleOpenCVExample.h" + +// mitk image +#include <mitkImage.h> + +#include "opencv2/opencv.hpp" + +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())); +} + +SimpleOpenCVExample::SimpleOpenCVExample() : m_running(false) { + +} + +SimpleOpenCVExample::~SimpleOpenCVExample() +{ + +} + +void SimpleOpenCVExample::OnStartGrabbing() +{ + if (!m_running) + { + m_running = true; + m_Controls.m_StartGrabbing->setText("Stop Video Grabbing"); + if (m_Controls.m_SeparateWindow->isChecked()) + { + cv::VideoCapture cap = cv::VideoCapture(); // open the default camera + cap.open(0); + if (!cap.isOpened()) // check if we succeeded + return; + + cv::namedWindow("Video", 1); + + while (m_running) + { + cv::Mat frame; + cap >> frame; // get a new frame from camera + imshow("Video", frame); + + // imwrite("C:/temp/output.jpg", frame); + + // Press 'c' to escape + if (cv::waitKey(30) == 'c') + break; + } + } + + } + else + { + m_running = false; + m_Controls.m_StartGrabbing->setText("Start Video Grabbing"); + cv::destroyWindow("Video"); + } + +} 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 new file mode 100644 index 0000000000..8e67f64b48 --- /dev/null +++ b/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExample.h @@ -0,0 +1,56 @@ +/*=================================================================== + +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 <berryISelectionListener.h> + +#include <QmitkAbstractView.h> + +#include "ui_SimpleOpenCVExampleControls.h" + +/** + \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(); + +protected: + virtual void CreateQtPartControl(QWidget *parent) override; + + virtual void SetFocus() override; + + bool m_running; + + Ui::SimpleOpenCVExampleControls m_Controls; +}; + +#endif // SimpleOpenCVExample_h diff --git a/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExampleControls.ui b/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExampleControls.ui new file mode 100644 index 0000000000..8dcfd0cd6b --- /dev/null +++ b/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/SimpleOpenCVExampleControls.ui @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>SimpleOpenCVExampleControls</class> + <widget class="QWidget" name="SimpleOpenCVExampleControls"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>222</width> + <height>287</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="windowTitle"> + <string>QmitkTemplate</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Input ID</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="m_InputID"/> + </item> + </layout> + </item> + <item> + <widget class="QRadioButton" name="m_SeparateWindow"> + <property name="text"> + <string>Render in Separate Window</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="m_MITKImage"> + <property name="text"> + <string>Render as MITK Image</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="m_StartGrabbing"> + <property name="text"> + <string>Start Video Grabbing</string> + </property> + </widget> + </item> + <item> + <spacer name="spacer1"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Expanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>220</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <layoutdefault spacing="6" margin="11"/> + <resources/> + <connections/> +</ui> diff --git a/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/mitkPluginActivator.cpp b/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/mitkPluginActivator.cpp index b3fe63e564..6ecd0a8169 100644 --- a/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/mitkPluginActivator.cpp +++ b/Examples/Plugins/org.mitk.example.gui.opencv/src/internal/mitkPluginActivator.cpp @@ -1,31 +1,33 @@ /*=================================================================== 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. ===================================================================*/ #include "mitkPluginActivator.h" #include "src/internal/videoplayer/QmitkVideoPlayer.h" +#include "src/internal/SimpleOpenCVExample.h" #include <mitkPersistenceService.h> namespace mitk { void PluginActivator::start(ctkPluginContext *context) { mitk::PersistenceService::LoadModule(); BERRY_REGISTER_EXTENSION_CLASS(QmitkVideoPlayer, context) + BERRY_REGISTER_EXTENSION_CLASS(SimpleOpenCVExample, context) } void PluginActivator::stop(ctkPluginContext *context) { Q_UNUSED(context) } } diff --git a/Modules/QtWidgetsExt/src/QmitkVideoBackground.cpp b/Modules/QtWidgetsExt/src/QmitkVideoBackground.cpp index 3beff5cf40..20dabea2b4 100644 --- a/Modules/QtWidgetsExt/src/QmitkVideoBackground.cpp +++ b/Modules/QtWidgetsExt/src/QmitkVideoBackground.cpp @@ -1,292 +1,294 @@ /*=================================================================== 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. ===================================================================*/ #include "QmitkVideoBackground.h" // MITK includes #include "mitkRenderingManager.h" #include "mitkVtkLayerController.h" // QT includes #include <QTimer> // itk includes #include <itkCommand.h> // VTK includes #include <vtkCallbackCommand.h> #include <vtkCamera.h> #include <vtkCommand.h> #include <vtkCommand.h> #include <vtkImageActor.h> #include <vtkImageImport.h> #include <vtkMapper.h> #include <vtkObjectFactory.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkSmartPointer.h> #include <vtkSystemIncludes.h> QmitkVideoBackground::QmitkVideoBackground(QObject *parent) : QObject(parent), m_QTimer(new QTimer(this)), m_VideoSource(nullptr), m_VideoSourceObserverTag(0) { this->ResetVideoBackground(); } QmitkVideoBackground::QmitkVideoBackground(mitk::VideoSource *v, int) : QObject(nullptr), m_QTimer(new QTimer(this)), m_VideoSource(nullptr), m_VideoSourceObserverTag(0) { this->SetVideoSource(v); this->ResetVideoBackground(); } void QmitkVideoBackground::ResetVideoBackground() { m_QTimer->setInterval(25); connect(m_QTimer, SIGNAL(timeout()), SLOT(UpdateVideo())); m_renderWindowVectorInfo.clear(); } QmitkVideoBackground::~QmitkVideoBackground() { this->Disable(); } void QmitkVideoBackground::AddRenderWindow(vtkRenderWindow *renderWindow) { if (!renderWindow || !m_VideoSource) { MITK_WARN << "No Renderwindow or VideoSource set!"; return; } this->RemoveRenderWindow(renderWindow); vtkRenderer *videoRenderer = vtkRenderer::New(); vtkImageActor *videoActor = vtkImageActor::New(); vtkImageImport *videoImport = vtkImageImport::New(); videoImport->SetDataScalarTypeToUnsignedChar(); videoImport->SetNumberOfScalarComponents(3); if (m_VideoSource->GetImageWidth() == 0) m_VideoSource->FetchFrame(); videoImport->SetWholeExtent(0, m_VideoSource->GetImageWidth() - 1, 0, m_VideoSource->GetImageHeight() - 1, 0, 1 - 1); videoImport->SetDataExtentToWholeExtent(); VideoBackgroundVectorInfo v; v.renWin = renderWindow; v.videoRenderer = videoRenderer; v.videoActor = videoActor; v.videoImport = videoImport; // callback for the deletion of the renderwindow vtkSmartPointer<vtkCallbackCommand> deleteCallback = vtkSmartPointer<vtkCallbackCommand>::New(); deleteCallback->SetCallback(QmitkVideoBackground::OnRenderWindowDelete); deleteCallback->SetClientData(this); v.renderWindowObserverTag = renderWindow->AddObserver(vtkCommand::DeleteEvent, deleteCallback); m_renderWindowVectorInfo.push_back(v); // completes the initialization this->Modified(); } void QmitkVideoBackground::RemoveRenderWindow(vtkRenderWindow *renderWindow) { this->RemoveRenderWindow(renderWindow, true); } void QmitkVideoBackground::RemoveRenderWindow(vtkRenderWindow *renderWindow, bool removeObserver) { // search for renderwindow and remove it for (auto it = m_renderWindowVectorInfo.begin(); it != m_renderWindowVectorInfo.end(); it++) { if ((*it).renWin == renderWindow) { mitk::VtkLayerController *layerController = mitk::VtkLayerController::GetInstance((*it).renWin); // unregister video backround renderer from renderwindow if (layerController) layerController->RemoveRenderer((*it).videoRenderer); (*it).videoRenderer->Delete(); (*it).videoActor->Delete(); (*it).videoImport->Delete(); // remove listener if (removeObserver) renderWindow->RemoveObserver((*it).renderWindowObserverTag); m_renderWindowVectorInfo.erase(it); break; } } } bool QmitkVideoBackground::IsRenderWindowIncluded(vtkRenderWindow *renderWindow) { for (auto it = m_renderWindowVectorInfo.begin(); it != m_renderWindowVectorInfo.end(); it++) { if ((*it).renWin == renderWindow) return true; } return false; } void QmitkVideoBackground::Pause() { m_QTimer->stop(); } void QmitkVideoBackground::Resume() { m_QTimer->start(); } /** * Enables drawing of the color Video background. * If you want to disable it, call the Disable() function. */ void QmitkVideoBackground::Enable() { UpdateVideo(); Modified(); m_QTimer->start(); } /** * Disables drawing of the color Video background. * If you want to enable it, call the Enable() function. */ void QmitkVideoBackground::Disable() { if (this->IsEnabled()) { mitk::VtkLayerController *layerController = nullptr; for (auto it = m_renderWindowVectorInfo.begin(); it != m_renderWindowVectorInfo.end(); it++) { layerController = mitk::VtkLayerController::GetInstance((*it).renWin); if (layerController) layerController->RemoveRenderer((*it).videoRenderer); } m_QTimer->stop(); } } bool QmitkVideoBackground::IsEnabled() { return m_QTimer->isActive(); } void QmitkVideoBackground::UpdateVideo() { if (m_renderWindowVectorInfo.size() > 0) { unsigned char *src = nullptr; try { src = m_VideoSource->GetVideoTexture(); } catch (const std::logic_error &error) { MITK_DEBUG << error.what(); emit EndOfVideoSourceReached(m_VideoSource); return; } if (src) { for (auto it = m_renderWindowVectorInfo.begin(); it != m_renderWindowVectorInfo.end(); it++) { (*it).videoImport->SetImportVoidPointer(src); (*it).videoImport->Modified(); (*it).videoImport->Update(); mitk::RenderingManager::GetInstance()->RequestUpdate((*it).renWin); } emit NewFrameAvailable(m_VideoSource); } else MITK_WARN << "No video texture available"; } } void QmitkVideoBackground::Modified() { // ensures registration of video backrounds in each renderwindow for (auto it = m_renderWindowVectorInfo.begin(); it != m_renderWindowVectorInfo.end(); it++) { (*it).videoImport->Update(); (*it).videoActor->SetInputData((*it).videoImport->GetOutput()); (*it).videoRenderer->AddActor2D((*it).videoActor); (*it).videoRenderer->ResetCamera(); (*it).videoRenderer->InteractiveOff(); (*it).videoRenderer->GetActiveCamera()->ParallelProjectionOn(); (*it).videoRenderer->GetActiveCamera()->SetParallelScale(m_VideoSource->GetImageHeight() / 2); mitk::VtkLayerController *layerController = mitk::VtkLayerController::GetInstance((*it).renWin); if (layerController && !layerController->IsRendererInserted((*it).videoRenderer)) + { layerController->InsertBackgroundRenderer((*it).videoRenderer, true); + } } } void QmitkVideoBackground::SetVideoSource(mitk::VideoSource *videoSource) { if (m_VideoSource == videoSource) return; if (m_VideoSource) m_VideoSource->RemoveObserver(m_VideoSourceObserverTag); m_VideoSource = videoSource; if (m_VideoSource) { itk::MemberCommand<QmitkVideoBackground>::Pointer _ModifiedCommand = itk::MemberCommand<QmitkVideoBackground>::New(); _ModifiedCommand->SetCallbackFunction(this, &QmitkVideoBackground::OnVideoSourceDelete); m_VideoSourceObserverTag = m_VideoSource->AddObserver(itk::DeleteEvent(), _ModifiedCommand); } } void QmitkVideoBackground::SetTimerDelay(int ms) { m_QTimer->setInterval(ms); } mitk::VideoSource *QmitkVideoBackground::GetVideoSource() { return m_VideoSource; } int QmitkVideoBackground::GetTimerDelay() { return m_QTimer->interval(); } void QmitkVideoBackground::OnVideoSourceDelete(const itk::Object *, const itk::EventObject &) { this->Disable(); // will only disable if enabled m_VideoSource = nullptr; } void QmitkVideoBackground::OnRenderWindowDelete(vtkObject *object, unsigned long, void *clientdata, void *) { QmitkVideoBackground *instance = static_cast<QmitkVideoBackground *>(clientdata); instance->RemoveRenderWindow(static_cast<vtkRenderWindow *>(object), false); }