0

I am generating and saving Saggital Reconstuction of the Dicom CBCT images by using Vtk and PyQt application. During the Flow of Program it open the Vtk PyQT win32 Open GL window for some seconds and then save the file in png. But I donot want to open that window during the flow of program. I just want to save the image, donot want to render it.

import sys
import vtkmodules.all as vtk
from PyQt5 import QtCore, QtWidgets
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
import pydicom
import os
from vtkmodules.vtkIOImage import (
    vtkBMPWriter,
    vtkJPEGWriter,
    vtkPNGWriter,
    vtkPNMWriter,
    vtkPostScriptWriter,
    vtkTIFFWriter
)
from datetime import datetime
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer,
    vtkWindowToImageFilter
)
from flask import Flask, request, send_file
import base64

app = Flask(__name__)

savePath = r'F:\Nixaam\Jan 2023\Saggital View'
savePath = savePath + '\\'

def create_reader(dir):
    
    reader = vtk.vtkDICOMImageReader()
    reader.SetDirectoryName(dir)
    reader.Update()
    
    return reader

def create_center(reader):
    
    (xMin, xMax, yMin, yMax, zMin, zMax) = reader.GetExecutive().GetWholeExtent(reader.GetOutputInformation(0))
    (xSpacing, ySpacing, zSpacing) = reader.GetOutput().GetSpacing()
    (x0, y0, z0) = reader.GetOutput().GetOrigin()
    
    center = [x0 + xSpacing * 0.5 * (xMin + xMax),
            y0 + ySpacing * 0.5 * (yMin + yMax),
            z0 + zSpacing * 0.5 * (zMin + zMax)]
    
    return center

def create_sagittal_slice_matrix(center):
    
    #Create Sagittal Slice Matrix
    sagittal = vtk.vtkMatrix4x4()
    sagittal.DeepCopy((0, 0, -1, center[0],
                        1, 0, 0, center[1],
                        0, -1, 0, center[2],
                        0, 0, 0, 1))
    
    return sagittal
    
    
def create_resliced_image(reader, sagittal, frame):
    
    # Reslice image
    widget = QVTKRenderWindowInteractor(frame)
    slice = vtk.vtkImageReslice()
    slice.SetInputConnection(reader.GetOutputPort())
    slice.SetOutputDimensionality(2)
    slice.SetResliceAxes(sagittal)
    slice.SetInterpolationModeToLinear()
    
    return widget, slice

def create_display_image_actor(slice):    
    
    # Display the image
    actor = vtk.vtkImageActor()
    actor.GetMapper().SetInputConnection(slice.GetOutputPort())
    # renderer = vtk.vtkRenderer()
    
    return actor
        
def adjust_renderer_settings(renderer, widget, actor):

    # Remove Renderer And Reset
    renderer.RemoveAllViewProps()
    renderer.ResetCamera()
    widget.GetRenderWindow().Render()
    renderer.AddActor(actor)
    
    widget.GetRenderWindow().AddRenderer(renderer)
    return widget

def setup_interaction(widget):
    # Set up the interaction
    slice_interactorStyle = vtk.vtkInteractorStyleImage()
    slice_interactor = widget.GetRenderWindow().GetInteractor()
    slice_interactor.SetInteractorStyle(slice_interactorStyle)
    widget.GetRenderWindow().SetInteractor(slice_interactor)
    widget.GetRenderWindow().Render()
    
    return slice_interactor
    # Start interaction
    # slice_interactor.Start()

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, path, parent = None):
        QtWidgets.QMainWindow.__init__(self, parent)
        
        self.frame = QtWidgets.QFrame()
        self.vl = QtWidgets.QVBoxLayout()
        
        reader = create_reader(path)
        
        center = create_center(reader)
        sagittal = create_sagittal_slice_matrix(center)
        
        self.vtkWidget, slice = create_resliced_image(reader, sagittal, self.frame)
        self.vl.addWidget(self.vtkWidget)
        
        vtk_out = vtk.vtkOutputWindow()
        vtk_out.SetInstance(vtk_out)
        
        # create renderer
        renderer = vtk.vtkRenderer()
        
        # create actor
        actor = create_display_image_actor(slice)
        
        self.vtkWidget = adjust_renderer_settings(renderer, self.vtkWidget, actor) 
         
        slice_interactor = setup_interaction(self.vtkWidget)
        
        renWin = vtkRenderWindow()
        renWin.AddRenderer(renderer)
        slice_interactor.SetRenderWindow(renWin)
        
        renWin.SetSize(1366,768)
        # renWin.SetWindowName('Window')
        # renWin.Render()
        
        windowto_image_filter = vtkWindowToImageFilter()
        windowto_image_filter.SetInput(renWin)
        windowto_image_filter.SetScale(1)  # image quality
        windowto_image_filter.SetInputBufferTypeToRGB()
        # # Read from the front buffer.
        # windowto_image_filter.ReadFrontBufferOff()
        # windowto_image_filter.Update()
                
        writer = vtkPNGWriter()
        path = r'F:\Nixaam\Jan 2023\Saggital View'
        path = path + '\\'
        writer.SetFileName(f'{path}saggital_view.png')
        writer.SetInputConnection(windowto_image_filter.GetOutputPort())
        writer.Write()

seriesFilePath = r'F:\Nixaam\Jan 2023\Saggital View\Decompressed\2023-01-13 21-10-32'
app = QtWidgets.QApplication(sys.argv)
window = MainWindow(seriesFilePath)

I donot want this window during the program.

enter image description here

eyllanesc
  • 235,170
  • 19
  • 170
  • 241

0 Answers0