Dear all,

I am trying to display a stream of images that I have access to at a 
certain frame rate. For simplicity, let's assume they are 2D images, 
they all have the same size/extent etc and only the actual pixel data 
changes.

I have been looking at the US module, and particularly at 
UltrasoundSupport.cpp, Where they do the following:

void UltrasoundSupport::DisplayImage()
{
//Update device
m_Device->Modified();
m_Device->Update();

//Only update the view if the image is shown
if(m_Controls.m_ShowImageStream->isChecked())
{
   //Update data node
   mitk::Image::Pointer curOutput = m_Device->GetOutput();
   m_Node->SetData(curOutput);

   // if the geometry changed: reinitialize the ultrasound image
   if((m_OldGeometry.IsNotNull()) &&
      (curOutput->GetGeometry() != NULL) &&
(!mitk::Equal(m_OldGeometry.GetPointer(),curOutput->GetGeometry(),0.0001,false))
     )
   {
     mitk::IRenderWindowPart* renderWindow = this->GetRenderWindowPart();
     if ( (renderWindow != NULL) && 
(curOutput->GetTimeGeometry()->IsValid()) && 
(m_Controls.m_ShowImageStream->isChecked()) )
     {
       renderWindow->GetRenderingManager()->InitializeViews(
       curOutput->GetGeometry(), 
mitk::RenderingManager::REQUEST_UPDATE_ALL, true );
       renderWindow->GetRenderingManager()->RequestUpdateAll();
     }
     m_CurrentImageWidth = curOutput->GetDimension(0);
     m_CurrentImageHeight = curOutput->GetDimension(1);
     m_OldGeometry = 
dynamic_cast<mitk::SlicedGeometry3D*>(curOutput->GetGeometry());
   }
   //if not: only update the view
   else
   {
     this->RequestRenderWindowUpdate();
   }
}

I am basically doing the same thing, with just minor differences due to 
my data structure:


void StreamingView::ImagingHandler(LayerObject::Pointer tlo){

DNLDataHandler::Pointer dataHandler =  DNLDataHandler::Pointer(new 
DNLDataHandler());

     std::vector< vtkSmartPointer<vtkImageData> > imageData;
     {
         imageData = dataHandler->createImage(tlo);
     }
     if (!imageData.size()){
         return;
     }

     this->m_FrameCounter++;

     /// Add the data to the viewer
     {

         /// Option 1: attempt to get data from my RT source
         mitk::Image::Pointer mitkImage = mitk::Image::New();
         mitkImage->Initialize(imageData[0]);
mitkImage->SetVolume(imageData[0]->GetScalarPointer());
         this->m_Node->SetData(mitkImage);

         /// Option 2: generate a random image
         // mitk::Image::Pointer dummyImage = 
mitk::ImageGenerator::GenerateRandomImage<float>(100, 100, 100, 1, 1, 1, 
1, 255,0);
         // this->m_Node->SetData(dummyImage);

          if((this->m_OldGeometry.IsNotNull()) && 
(mitkImage->GetGeometry() != NULL) &&
(!mitk::Equal(m_OldGeometry.GetPointer(),mitkImage->GetGeometry(),0.0001,false)))
 
{
             mitk::IRenderWindowPart* renderWindow = 
this->GetRenderWindowPart();
             if ( (renderWindow != NULL) && 
(mitkImage->GetTimeGeometry()->IsValid()) ) // && 
(this->m_Controls.m_ShowImageStream->isChecked()) )
             {
renderWindow->GetRenderingManager()->InitializeViews(
                             mitkImage->GetGeometry(), 
mitk::RenderingManager::REQUEST_UPDATE_ALL, true );
renderWindow->GetRenderingManager()->RequestUpdateAll();
             }
             this->m_OldGeometry = 
dynamic_cast<mitk::SlicedGeometry3D*>(mitkImage->GetGeometry());
         }
         else
         { //if not: only update the view
             this->RequestRenderWindowUpdate();
mitk::RenderingManager::GetInstance()->RequestUpdateAll();
         }

     }
}

The above function is called every time there is a new image available, 
which happens roughly every 50 ms. Unfortunately when I run  my plugin, 
the app crashes giving the following error:

[Tue Apr 28 12:55:13 20150.573] Logfile: 
xxxxxxxxxxxxxxxxxxx/data/13/mitk-0.log
[1.036] [BlueBerry] LOG: Warning: Detected recursive attempt by part 
org.mitk.views.datamanager to create itself (this is probably, but not 
necessarily, a bug)
[1.209] [BlueBerry] BlueBerry Workbench ready
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
Aborted (core dumped)

Now, if I add a line
     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
just before this->m_Node->SetData(mitkImage);

It does not crash for a little while, shows me the images flowing 
through (for some reason the coronal view does not update , although the 
coronal slice in the 3D view does ) but after  a few seconds, or if I 
try to interact with any of the views, the app crashes with the same 
error as above.

I do not think the error is related to my data source because if I 
comment Option1 above and uncomment Option 2 I get the same result.


Sometimes (not always) I additionally get an extra error bit:

[1.178] [BlueBerry] BlueBerry Workbench ready
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has 
not been called
[xcb] Aborting, sorry about that.
MyApp: ../../src/xcb_io.c:179: dequeue_pending_request: Assertion 
`!xcb_xlib_unknown_req_in_deq' failed.
Aborted (core dumped)

Any advice/help?

Thanks a lot!





-- 
Dr Alberto Gomez
Research Associate
Department of Biomedical Engineering
King's College London

020 7188 7188 ext 50871
4th North Wing
St Thomas' Hospital
SE1 7EH London, UK


------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
mitk-users mailing list
mitk-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mitk-users

Reply via email to