找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2834|回复: 6

[VTK] VTK例子23-用鼠标获取二维图像中某点的坐标值

[复制链接]

291

主题

401

回帖

2545

积分

管理员

积分
2545

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2015-12-6 12:30:30 | 显示全部楼层 |阅读模式
用鼠标获取二维图像中某点的坐标值
#include "stdafx.h"
/*
用鼠标获取二维图像中某点的坐标值

解决方法如下
1.  把窗口二维坐标转换为空间三维坐标, 用个vtkWorldPointPicker 就可以了
2.  利用图像点和三维空间坐标的映射关系,  把空间三维坐标, 转换为图像像素位置(i,j,k)
3.  i,j,k 一般情况都是浮点数,  利用差值算法( 临近, 线性等)计算出此点对应的像素值
其实任何时候都可以使用vtkRenderWindowInteractor中的GetEventPosition ();来获取鼠标位置的坐标。不需要那么多转换
*/
#include <iostream>
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkDICOMImageReader.h"
#include "vtkImageViewer.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkImageViewer.h"
#include "vtkImageActor.h"
#include "vtkImageCast.h"
#include "vtkPointPicker.h"
#include "vtkCallbackCommand.h"
#include "vtkImageData.h"

void left(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata);
void MyExecute(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata);
vtkPointPicker *picker;
vtkInteractorStyleTrackballCamera *style;
vtkRenderWindowInteractor *viewerinter;
vtkDICOMImageReader   *dr;
int main()
{
    dr =  vtkDICOMImageReader::New();
          dr->SetDataByteOrderToLittleEndian();
          dr->SetFileName("C://DATADIR/brain/brain_007.dcm");
          dr->SetDataOrigin(0.0,0.0,0.0);
    vtkImageViewer  *viewer = vtkImageViewer::New();
          viewer->SetInput(dr->GetOutput());
          viewer->SetColorWindow(1024);//这就是传说中的窗宽
          viewer->SetColorLevel(512/2);//窗位
          viewer->Render();
    viewerinter = vtkRenderWindowInteractor::New();
          viewer->SetupInteractor(viewerinter);
        picker=vtkPointPicker::New();
    vtkCallbackCommand * cmd1 = vtkCallbackCommand::New();
          cmd1->SetCallback(MyExecute);
          picker->AddObserver(vtkCommand::EndPickEvent, cmd1);
          viewerinter->SetPicker(picker);
    style=vtkInteractorStyleTrackballCamera::New();
          viewerinter-> SetInteractorStyle(style);
    vtkCallbackCommand * cmd = vtkCallbackCommand::New();
            cmd->SetCallback(left);
         
    style-> AddObserver (vtkCommand::LeftButtonPressEvent,cmd);
        viewerinter->Initialize();
    viewerinter->Start();
   
    return 0;
}
void left(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata)
{
    int selPt[2];
        viewerinter->GetEventPosition (selPt);
        printf("X: %d, Y: %d\n",selPt[0],selPt[1]);
        float temp=dr->GetOutput()->GetScalarComponentAsFloat(selPt[0],selPt[1],0,0);
        printf("像素为:  %f\n",temp);
        style->OnLeftButtonDown();
}
void MyExecute(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata)
{
    double selPt[3];
        picker->GetSelectionPoint(selPt);
        printf("X:  %f, Y:  %f\n",selPt[0],selPt[1]);
        float temp=dr->GetOutput()->GetScalarComponentAsFloat(selPt[0],selPt[1],0,0);
        printf("像素为:  %d\f",temp);
/*
        double globalCoordinate[3];
        picker->GetPickPosition(globalCoordinate);
        printf("X:  %f, Y:  %f, Z:  %f\n",
                   globalCoordinate[0],globalCoordinate[1],globalCoordinate[2]);
*/
        style->OnLeftButtonDown();
}
23.png
回复

使用道具 举报

149

主题

457

回帖

1601

积分

版主

积分
1601

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-4-6 12:36:20 | 显示全部楼层
谢谢楼主分享!!!
回复

使用道具 举报

13

主题

430

回帖

1104

积分

版主

积分
1104

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-11 08:59:54 | 显示全部楼层
学习学习。。。
回复

使用道具 举报

37

主题

419

回帖

1159

积分

版主

积分
1159

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-11 18:38:30 | 显示全部楼层
留个脚印
回复

使用道具 举报

0

主题

394

回帖

794

积分

高级会员

积分
794

最佳新人

发表于 2016-5-15 20:30:54 | 显示全部楼层
谢谢楼主!
回复

使用道具 举报

0

主题

401

回帖

804

积分

高级会员

积分
804

最佳新人

发表于 2016-5-21 08:52:06 | 显示全部楼层
看看学习一下!
回复

使用道具 举报

1

主题

434

回帖

1086

积分

版主

积分
1086

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-23 00:57:48 | 显示全部楼层
次贴无用,检定完毕!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于我们|医维基|网站地图|Archiver|手机版|医疗之家 ( 沪ICP备2023001278号-1 )

GMT+8, 2025-4-5 11:37 , Processed in 0.366443 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表