Image类(Leap::Image)和ImageList类(Leap::ImageList)

来源:互联网 发布:java电商高并发视频 编辑:程序博客网 时间:2024/06/05 01:56

Image类(Leap::Image)

这个类描述了其中一个Leap Motion相机的单独的图片。除了图片数据之外,Image对象还提供了一个畸变图谱用来修正透镜畸变。Image对象也可以是无效的,可以通过Image::isValid()函数来测试有效性。
int bytesPerPixel(): 表示每个像素中的字节数目。用这个值,结合函数Image::width()和Image::height()来计算数据缓冲区的大小。
用法:int bufferSize=image. bytesPerPixel()*image::width()*image::height();
const unsigned char *data(): 表示图片数据。这个图片数据是个8位整型值的集合。缓冲区的长度为Image. bytesPerPixel()*Image::width()*Image::height()个字节。返回的是包含传感器亮度值的无符号字符型数组。
const float * distortion(): 表示这幅图片的畸变标定图谱。这个校正图谱是64×64的网格点,每个点被定义为一对32位的浮点型值。图谱中的每个点代表投射到相机中的一条射线。网格点的值定义了图片数据中的像素,包含了由进入的光和相应的射线产生的亮度值。通过网格数据点之间的插值,可以得到任何一条投射进来的射线的亮度值。落在0到1范围之外的网格值在图片数据中并没有对应的亮度值,应该忽略这些点。
标定图谱可以用来呈现一个无畸变的图片,还可以用来得到从相机到原始图片中的一个特征的角度。这个畸变图谱本身是设计来和GLSL着色器程序一起使用的。在非实时环境中,用Image::rectify()和Image::warp()函数更方便。如果无法用着色器,可以直接用畸变图谱。如果很好的优化的话,这要比用warp()函数要快。
畸变是由透镜几何和透镜与传感器窗口中的瑕疵造成的。这个标定图谱是由工厂每个设备执行标定过程中创建的。在以后的release中每幅图片可能会有两个畸变图谱,一个包含了水平值另一个包含了垂直值。
用法:const float * distortion_buffer=image. distortion();
int distortionHeight(): 表示畸变图谱的高,通常固定为64.
用法:int correctionGridHeight=image. distortionHeight();
int distortionWidth(): 表示畸变图谱的宽。因为在64×64元素的畸变图谱中的每个点在缓冲中都有两个值。步幅是网格大小的2倍。(步幅通常固定为2*64=128)
用法:int correctionGridWidth=image. distortionWidth();
FormatType format(): 表示图片的格式。
用法:if (image.format() == Leap::Image::INFRARED){
std::string openGL_format = “GL_RED”;
std::string openGL_type = “GL_UNSIGNED_BYTE”;
}
int height(): 表示图片的高。
用法:int height=image.height();
int width(): 表示图片的宽。
用法:int width=image. width();
int32_t id(): 表示图片的ID值。带有ID值为0的图片来自左相机,带有ID值为1的图片来自右相机(当绿色的小灯朝向操作者,设备处于标准的操作位置)。
Image(): 构造一个无效的Image对象。没有初始化的对象被认为是无效的。从ImageList对象中得到有效的Image对象,而ImageList对象则是从Frame::images()中得到。
bool isValid(): 判断这个Image实例中是否包含有效的数据。当且仅当图片有效时返回True。
bool operator!=(const Image &): 比较Image对象是否不相等。如果两个对象都是有效的,在同一帧中有且仅有这两个对象表示同样的实体,则这两个对象相等。
bool operator==(const Image &): 比较Image对象是否相等。如果两个对象都是有效的,在同一帧中有且仅有这两个对象表示同样的实体,则这两个对象相等。
float rayOffsetX(): 表示水平射线补偿。用来在处于0到1范围内的归一化坐标和处于-4到4范围内的光束角之间的转化。
说明:Leap::Vector raySlopes(-3.28, 1.76, 0);
Leap::Vector normRay =
Leap::Vector(raySlopes.x * image.rayScaleX() + image.rayOffsetX(),
raySlopes.y * image.rayScaleY() + image.rayOffsetY(), 0);
float rayOffsetY(): 表示垂直射线补偿。用来在处于0到1范围内的归一化坐标和处于-4到4范围内的光束角之间的转化。
说明:Leap::Vector normSlopes(.09, .72, 0);
Leap::Vector slope((normSlopes.x - image.rayOffsetX()) / image.rayScaleX(),
(normSlopes.y - image.rayOffsetY()) / image.rayScaleY(), 0);
float rayScaleX(): 表示水平射线缩放因子。用来在处于0到1范围内的归一化坐标和处于-4到4范围内的光束角之间的转化。
说明:Leap::Vector raySlopes(-3.28, 1.76, 0);
Leap::Vector normRay =
Leap::Vector(raySlopes.x * image.rayScaleX() + image.rayOffsetX(),
raySlopes.y * image.rayScaleY() + image.rayOffsetY(), 0);
float rayScaleY(): 表示垂直射线缩放因子。用来在处于0到1范围内的归一化坐标和处于-4到4范围内的光束角之间的转化。
说明:Leap::Vector normSlopes(.09, .72, 0);
Leap::Vector slope((normSlopes.x - image.rayOffsetX()) / image.rayScaleX(),
(normSlopes.y - image.rayOffsetY()) / image.rayScaleY(), 0);
Vector rectify(const Vector & uv): 提供纠正的相机射线(截获了图片中的指定点)。给定一个图片上的点,这个函数可以纠正相机畸变,返回从相机到Leap Motion视线内图片点来源的正确方向。
对于方向向量[x,y,0],用的是二维的相机坐标系,x轴平行于较长的尺寸(通常是水平的),y轴平行于较短的尺寸。相机的坐标系与三维的Leap Motion坐标系并不相关。
该函数中的参数uv是包含了图片中一个像素位置的向量,返回的是包含了射线方向的向量,其中向量的z元素总是0.
用法:Leap::Vector feature(127, 68, 0);
Leap::Vector slopes = image.rectify(feature);
int64_t sequenceld(): 表示图片序列的ID值。
int64_t timestamp(): 返回的是这一帧开始被设备捕获的时间标记。
std::string toString(): 一个包含简略描述该Image对象的字符串。
Vector warp(const Vector & xy): 提供了与投影到相机上的射线相对应的点。给定一个以一个指定的方向投影到相机上的射线,该函数可以修正相机畸变,返回图片上对应的像素坐标。射线的方向是基于对相机的考虑来指定的第一个元素关联于水平视角,第二个元素关联于垂直视角。
如果向一个没有记录数据的点投影射线,则该函数将返回图片边界以外的像素坐标。这个函数速度不快,没法实现实时畸变校正。为了更好的效果,需要用到GPU上的着色器。
用法:参数xy是包含射线方向的向量。
float horizontal_slope = tan(65 * Leap::PI / 180);
float vertical_slope = tan(15 * Leap::PI / 180);
Leap::Vector pixel = image.warp(Leap::Vector(horizontal_slope, vertical_slope, 0));
if (pixel.x >= 0 && pixel.y >= 0 && pixel.x <= image.width() && pixel.y <= image.height()){
int data_index = floor(pixel.y) * image.width() + floor(pixel.x);
unsigned char brightness = image.data()[data_index];
}
const Image & invalid(): 返回一个无效Image对象。也可以用Imge::isValid()函数。

ImageList类(Leap::ImageList)

这个类代表了Image对象的列表。通过调用Frame::images()可以得到一个与跟踪数据的Frame相关的ImageList对象。通过调用Controller::images()函数得到最近的图片集,这要比创建当前帧所用到的图片要新。
ImageList & append(const ImageList & other): 表示把指定的一个ImageList的成员添加到这个ImageList对象中。参数other表示一个ImageList对象,其中包含Image对象,将要添加到这个ImageList对象末端。
const_iterator begin(): 表示C++的迭代器,设置在这个ImageList对象的开始。
int count(): 表示这个列表中图片的数目。
const_iterator end(): 表示C++的迭代器,设置在这个ImageList对象的结束。
ImageList(): 表示构造一个没有实体的空列表。
bool isEmpty(): 判断这个列表是否为空。如果没有成员,返回True。
Image operator[](int index): 表示对列表中一个成员位置的访问。返回的是指定索引下的Image对象。

译自:https://developer.leapmotion.com/documentation/cpp/api/Leap.Image.html
https://developer.leapmotion.com/documentation/cpp/api/Leap.ImageList.html

0 0
原创粉丝点击