level 1
Drrrr9
楼主
程序是在python下写的,是读取一个二维灰度图像,然后统计各个灰度范围的像素数量。程序出来后显示的是白屏,我感觉问题可能是在 actor上。
按照教程上说barchartactor 的setinput 需要的是 vtkdataobject 数据类型,需要一个vtkIntarray数组来储存值,然后通过一个vtkdataobject来接收数组,从而得到该数据类型。
但是我的问题是,在python里,通过地址来访问数值,需要用到ctypes里的cast方法,但是我按照网上内容编译,在得到值的最后一步,会直接结束,即使在debug模式下也是,我找不到原因,其中pointer得到的地址是 十六进制加_p_void的形式,好像和python的地址格式不太一样。
所以我直接用vtkImageAccumulate.GetOutputDataObject(0))得到的似乎也是vtkdataobject格式的输出,我不太清楚是不是这个原因,希望大佬能看一下![[泪]](/static/emoticons/u6cea.png)
import vtkmodules.all as vtk
import ctypes
PNG_Reader = vtk.vtkPNGReader()
PNG_Reader.SetFileName('C:/Users/asus/PycharmProjects/test/graypic/001.png')
PNG_Reader.Update()
pointer=PNG_Reader.GetOutput().GetScalarPointer(4,5,0)
get_value=ctypes.cast(pointer, ctypes.py_object ).value
以上是在python下根据地址得到值的代码
下面是直方图的代码
import vtkmodules.all as vtk
#图片读取
PNG_Reader = vtk.vtkPNGReader()
PNG_Reader.SetFileName('C:/Users/asus/PycharmProjects/test/graypic/152.png')
PNG_Reader.Update()
bins=16
vitaccumulate=vtk.vtkImageAccumulate()
#vitaccumulate.SetInputConnection(PNG_Reader.GetOutputPort())
vitaccumulate.SetInputData(PNG_Reader.GetOutput())
vitaccumulate.SetComponentExtent(0,bins-1,0,0,0,0)
vitaccumulate.SetComponentOrigin(0,0,0)
vitaccumulate.SetComponentSpacing(256.0/bins,0,0)
vitaccumulate.Update()
bar=vtk.vtkBarChartActor()
bar.SetInput(vitaccumulate.GetOutputDataObject(0))
bar.SetPosition(0.05,0.05)
bar.SetPosition2(0.95,0.95)
bar.GetProperty().SetColor(1,1,1)
bar.SetTitle("GGGGGGGGGG")
i=0
while i< bins:
bar.SetBarColor(i,0,0,0)
i+=1
renderer = vtk.vtkRenderer()
renderer.SetBackground([1, 1, 1])
renderer.AddActor(bar)
#界面
window = vtk.vtkRenderWindow()
window.SetSize(512, 512)
window.AddRenderer(renderer)
#交互
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(window)
# 初始化
window.Render()
interactor.Initialize()
interactor.Start()
2021年03月01日 08点03分
1
按照教程上说barchartactor 的setinput 需要的是 vtkdataobject 数据类型,需要一个vtkIntarray数组来储存值,然后通过一个vtkdataobject来接收数组,从而得到该数据类型。
但是我的问题是,在python里,通过地址来访问数值,需要用到ctypes里的cast方法,但是我按照网上内容编译,在得到值的最后一步,会直接结束,即使在debug模式下也是,我找不到原因,其中pointer得到的地址是 十六进制加_p_void的形式,好像和python的地址格式不太一样。
所以我直接用vtkImageAccumulate.GetOutputDataObject(0))得到的似乎也是vtkdataobject格式的输出,我不太清楚是不是这个原因,希望大佬能看一下
import vtkmodules.all as vtk
import ctypes
PNG_Reader = vtk.vtkPNGReader()
PNG_Reader.SetFileName('C:/Users/asus/PycharmProjects/test/graypic/001.png')
PNG_Reader.Update()
pointer=PNG_Reader.GetOutput().GetScalarPointer(4,5,0)
get_value=ctypes.cast(pointer, ctypes.py_object ).value
以上是在python下根据地址得到值的代码
下面是直方图的代码
import vtkmodules.all as vtk
#图片读取
PNG_Reader = vtk.vtkPNGReader()
PNG_Reader.SetFileName('C:/Users/asus/PycharmProjects/test/graypic/152.png')
PNG_Reader.Update()
bins=16
vitaccumulate=vtk.vtkImageAccumulate()
#vitaccumulate.SetInputConnection(PNG_Reader.GetOutputPort())
vitaccumulate.SetInputData(PNG_Reader.GetOutput())
vitaccumulate.SetComponentExtent(0,bins-1,0,0,0,0)
vitaccumulate.SetComponentOrigin(0,0,0)
vitaccumulate.SetComponentSpacing(256.0/bins,0,0)
vitaccumulate.Update()
bar=vtk.vtkBarChartActor()
bar.SetInput(vitaccumulate.GetOutputDataObject(0))
bar.SetPosition(0.05,0.05)
bar.SetPosition2(0.95,0.95)
bar.GetProperty().SetColor(1,1,1)
bar.SetTitle("GGGGGGGGGG")
i=0
while i< bins:
bar.SetBarColor(i,0,0,0)
i+=1
renderer = vtk.vtkRenderer()
renderer.SetBackground([1, 1, 1])
renderer.AddActor(bar)
#界面
window = vtk.vtkRenderWindow()
window.SetSize(512, 512)
window.AddRenderer(renderer)
#交互
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(window)
# 初始化
window.Render()
interactor.Initialize()
interactor.Start()