VTK读取缓冲区像素数据

来源:互联网 发布:centos安装内核源码 编辑:程序博客网 时间:2024/06/15 18:50

最近,我在做并行图像合成的工作,所以我需要把VTK管线中画好的图在显示之前把这些像素点取出来,并与其它进程所绘制的像素点相融合,进行深度测试。所以需要了解VTK在像素缓冲区的读取上是怎么做的。

我们都知道,在OpenGL中我们都知道,是用glReadPixels()和glGetTexImage()这样的函数把像素读取到内存在来的,然后调用glMapBuffer()或者glGetBufferSubData()访问缓冲区中对象中的数值,这两个函数我不是很熟悉,这里就不多说了。

因为我现在做的这个东西,是基于VTK来实现的,而VTK对这一操作是有封装的,所以首先我们需要知道VTK是在哪个类的那个函数中对这一功能进行了封装实现。我们想到这个功能应该是基于窗口的,在VTK中,vtkRenderWinodw这个类他是管理所有与窗口相关的事情,像各种OpenGL的初始化的参数,上下文的设定,都是由这个类实现的。所以我们可以想到这个类应该是直接与OpenGL在参数设定方面相关的,也就是在整个流水线的开始绘制之前,和绘制之后的事情,应该是在这里实现的。最终我们发现在vtkOpenGLRenderWindow这个类中有对这个功能的封装,它分别提供了获取像素:

GetRGBAPixelData(int x1,int y1,int x2,int y2,int front),返回类型为float*。

和写入像素:

SetRGBAPixelData(int x1,int y1,int x2,int y2,float *data,int front,int blend)

其中x1,y1,x2,y2是一块矩形像素的左下角和右上角,这里需要注意的是,按坐标系来讲,这里VTK把屏幕设为从左下角开始往右填,然后再往上。也就是如果从二维来讲,左下角为原点,横坐标正方向为向右,纵坐标正方向为往上。但是我们要知道的是,从这两个函数中取出来的像素为一维的一个数组,他的顺序其实就是从原点开始按x正方向开始填满每一行往上的一个顺序。

这里还有一个要注意的是,int x1,int y1,int x2,int y2它是取出的来的像素点的个数是(x2-x1+1)*(y2-y1+1)个像素点,而不是我们想的(x2-x1)*(y2-y1)个,所以他是两边都取到,同样的在Set中也是这样的,你放进去的像素点不够的话就可能出现错位和出现白条的现象。

所以我们在使用的时候。例如分辨率是1920*1080的,我们就要取的是(0,0,1920-1,1080-1),这样的话才能拿到的是完整的图形,如果不减1的话拿到的图形会是在右边多一个白条。因为里面是没有像素的。开始的时候我就遇到了这个问题,在范围和像素上没有取得同步,导致图形发生偏斜并且出现一个白条。并且需要注意的是我们这样取到的像素点也是闭区间的,两边像素点都是有的。

这里还有一个需要注意的是,屏幕原来是从左下角开始填充像素点的。

综上所述,我在基于VTK做图像的拼合的时候,在像素读取和写入这个过程中遇到以上两个问题:

1.读取像素处理完之后写进去,发生偏移,在调试的时候一直不理解为啥有一条从下往左上斜的白线,原来是那个函数取的是闭区间的像素点,在算每一行的像素个数的时候要记得+1.或者for循环的时候就不要采用<=,采用<。

2.我们得到的像素的一维数组这个数组是从屏幕的左下角开始填满整个屏幕的。

0 0
原创粉丝点击