[vtkusers] picking vtkImageSlice using vtkCellPicker?
Miro Drahos
mdrahos at robodoc.com
Tue Mar 25 17:25:00 EDT 2014
David,
thank you very much for valuable feedback. I will heed your advice and
enforce positive spacing in the images.
This seems like the best approach and avoid other potential issues down
the road.
Best,
Miro
On 03/25/2014 12:49 PM, David Gobbi wrote:
> Hi Miro,
>
> As far as I know, no VTK components whatsoever are tested for images
> with negative spacing, and no-one is working to fix the components
> that are known to break with negative spacing.
>
> In my own software, whenever I read an image that has negative
> spacing, I always reverse the slice order to make the spacing
> positive. This means that I have to modify the orientation/position
> matrix to account for the reversal, and it also means that I have to
> create a map that will map imagedata slice indices to the original
> file slice indices. All of this adds complexity to my programs,
> obviously, but at least it means that I can be confident that all the
> rendering, contouring, filtering, and picking tools will properly work
> with my data.
>
> Since I'm familiar with the image picking code, I can take a look to
> see why it doesn't work for negative spacing. But I strongly
> recommend that you do not use images with negative spacing in VTK.
> If you use negative spacing, then some things will work, it's true, but
> some things will break.
>
> David
>
> On Tue, Mar 25, 2014 at 1:24 PM, Miro Drahos <mdrahos at robodoc.com> wrote:
>> Hi David,
>> I investigated this issue further and indeed vtkCellPicker works fine with
>> vtkImageActor/vtkImageSlice when I plug in different images.
>> It so happens that my image has negative spacing (in z-direction), and that
>> seems to cause issues. If I load the same image and flip the z-spacing sign,
>> picking works fine. I had a look at the vtkImageActor class and saw the
>> if-clauses taking care of the spacing sign (when setting display bounds),
>> but I have not seen a similar treatment in vtkImageSliceMapper -- is it
>> possible that the issue is there?
>> I have had issues with images with negative spacing before, in particular
>> marching cubes filter as well as volumeMapper don't support the negative
>> spacing (in vtk 5.10). I was able to work around this by flipping the
>> spacing (and changing the origin) but I would rather keep the negative
>> spacing as is, since that's how the slices were acquired, in the -z
>> direction.
>> Do you (or anyone else?) know where in the vtk codebase could this problem
>> (picking dependent on the spacing sign of the image) be?
>> I believe that picking takes into consideration just the actor bounds, but
>> the rendering works just fine, so I am quite puzzled.
>> I am hoping that once I know where the problem is, I can derive a class
>> implementing the correct behavior and use that instead.
>> Any advice is greatly appreciated, as always.
>> Best,
>> Miro
>>
>>
>>
>>
>> On 03/20/2014 02:29 PM, David Gobbi wrote:
>>> Hi Miro,
>>>
>>> I checked through the git logs, the only recent fix to vtkCellPicker
>>> had to do with the fact that GetMapper() returned null for
>>> vtkImageSlice (but it still returned the prop and position just fine).
>>> However, I noticed that the only nightly test for picking images uses
>>> a vtkImageActor (a subclass of vtkImageSlice) instead of using
>>> vtkImageSlice directly. This shouldn't make a difference, but it
>>> might be worth investigating.
>>>
>>> David
>>>
>>> On Thu, Mar 20, 2014 at 2:17 PM, Miro Drahos <mdrahos at robodoc.com> wrote:
>>>> Hi David,
>>>> thank you for your prompt response.
>>>>
>>>> I am using VTK 5.10 and doing nothing special as far as I can tell. Here
>>>> is
>>>> some more details:
>>>>
>>>> I have a vector of vtkSmartPointer<vtkImageSlice> objects to display
>>>> images
>>>> [my 3D CT image has several segments with different slice thicknesses, so
>>>> that's why I have a vector of them]. All the reslicing and visualization
>>>> is
>>>> working as expected, so I don't suspect an issue there.
>>>> Now I am observing LeftMouseEvent of the interactor and processing it in
>>>> my
>>>> callback class to recognize when the surface model is picked. If it is,
>>>> then
>>>> user can translate and rotate it. The callback class is derived from both
>>>> vtkCommand and QObject (to be able to use signal/slots of Qt that this is
>>>> part of) and I am implementing FindPickedActor(int x, int y) method as I
>>>> have seen it throughout VTK many times.
>>>> I have tried to use different pickers, and decided for vtkCellPicker
>>>> instead
>>>> of vtkPropPicker, to be able to set tolerance (user can make the surface
>>>> model transparent and then might want to pick just the outline --
>>>> intersection of the surface and the image reslice plane. Picking outline
>>>> is
>>>> hard with no tolerance).
>>>> Picking surface model works just fine.
>>>>
>>>> Here is the Print() of one of my vtkImageSlice instance:
>>>>
>>>> vtkImageSlice (0x4ecbd30)
>>>> Debug: Off
>>>> Modified Time: 64690
>>>> Reference Count: 3
>>>> Registered Events: (none)
>>>> Dragable: On
>>>> Pickable: On
>>>> AllocatedRenderTime: 860.822
>>>> EstimatedRenderTime: 0
>>>> NumberOfConsumers: 1
>>>> RenderTimeMultiplier: 0.863803
>>>> Visibility: On
>>>> PropertyKeys: none.
>>>> useBounds: 1
>>>> IsIdentity: true
>>>> Position: (0, 0, 0)
>>>> Orientation: (0, 0, 0)
>>>> Origin: (0, 0, 0)
>>>> Scale: (1, 1, 1)
>>>> Bounds:
>>>> Xmin,Xmax: (-100, 100)
>>>> Ymin,Ymax: (-100, 100)
>>>> Zmin,Zmax: (-90.625, -2.5)
>>>> UserTransform: (none)
>>>> UserMatrix: (none)
>>>> Property:
>>>> Debug: Off
>>>> Modified Time: 64690
>>>> Reference Count: 3
>>>> Registered Events: (none)
>>>> ColorWindow: 260.1
>>>> ColorLevel: 119.85
>>>> UseLookupTableScalarRange: Off
>>>> LookupTable: 0x156088a0
>>>> Opacity: 1
>>>> Ambient: 0.3
>>>> Diffuse: 1
>>>> InterpolationType: Linear
>>>> LayerNumber: 0
>>>> Checkerboard: Off
>>>> CheckerboardSpacing: 10 10
>>>> CheckerboardOffset: 0 0
>>>> Backing: Off
>>>> BackingColor: 0 0 0
>>>> Mapper:
>>>> Debug: Off
>>>> Modified Time: 96181
>>>> Reference Count: 3
>>>> Registered Events: (none)
>>>> Executive: 0x4ecc950
>>>> ErrorCode: Success
>>>> Information: 0x4ecc440
>>>> AbortExecute: Off
>>>> Progress: 1
>>>> Progress Text: (None)
>>>> TimeToDraw: 0
>>>> ClippingPlanes: (none)
>>>> SlicePlane: 0x4691280
>>>> SliceAtFocalPoint: Off
>>>> SliceFacesCamera: Off
>>>> Border: On
>>>> Background: Off
>>>> NumberOfThreads: 8
>>>> JumpToNearestSlice: Off
>>>> AutoAdjustImageQuality: On
>>>> SeparateWindowLevelOperation: On
>>>> ResampleToScreenPixels: On
>>>> SlabThickness: 0
>>>> SlabType: Mean
>>>> SlabSampleFactor: 2
>>>> ImageSampleFactor: 1
>>>> Interpolator: 0x4ecf330
>>>> Bounds: (-100, 100) (-100) (100) (-90.625) (-2.5)
>>>>
>>>> I will make a simple mock program and try to isolate the problem.
>>>> Thank you once again!
>>>> Miro
>>>>
>>>>
>>>>
>>>>
>>>> On 03/20/2014 12:31 PM, David Gobbi wrote:
>>>>> Hi Miro,
>>>>>
>>>>> You'll have to provide more details, because I use vtkCellPicker on
>>>>> vtkImageSlice all the time. It's even part of the nightly VTK testing.
>>>>> Is there anything special about the way you use the vtkImageSlice?
>>>>> What version of VTK are you using?
>>>>>
>>>>> David
>>>>>
>>>>> On Thu, Mar 20, 2014 at 1:15 PM, Miro Drahos <mdrahos at robodoc.com>
>>>>> wrote:
>>>>>> Hi all,
>>>>>> I am rendering an image slice using vtkImageSlice and a surface
>>>>>> (vtkActor).
>>>>>> When I perform picking using vtkCellPicker, I always pick the surface
>>>>>> actor,
>>>>>> even if it is in the background, behind the vtkImageSlice.
>>>>>> If I try to pick the vtkImageSlice (and the ray does not intersect the
>>>>>> surface actor), the Pick() method returns 0, as well as
>>>>>> picker->GetPath()
>>>>>> returns NULL. The vtkImageSlice is set to be pickable.
>>>>>> I am quite baffled by this, since I'd expect to be able to pick
>>>>>> vtkImageSlice with vtkCellPicker, since it is a vtkProp3D.
>>>>>> If I use vtkPropPicker, I can pick the image slice fine, but I would
>>>>>> prefer
>>>>>> to use vtkCellPicker so that I can specify picking tolerance.
>>>>>> Can someone shed some light on this?
>>>>>> Thank you tons!
>>>>>> Miro
>>>>
>> _______________________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the VTK FAQ at:
>> http://www.vtk.org/Wiki/VTK_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtkusers
More information about the vtkusers
mailing list