Oct Week 2, Oct8-Oct13

1.Matlab調用CUDA

 

通过matlab的paralell computing toolbox来进行GPU并行运算有两种方式。

第一种方式是matlab内部的加速方法,不会涉及到实际的cu文件和cuda代码。

第二种方式是使用并行运算工具箱的借口来调用cuda代码,进而加速运算。

1.1

使用gpuArray+gather可以方便的把变量放入gpu和读出。

只要是使用存入GPU中的数据,MATLAB中支持GPU运算的所有函数都将自动用GPU来并行运算。

一般加速效果都有2-4倍。

更进一步,使用arrayfun函数。

这个函数是:element operation高效处理的方法。要求所有输入变量矩阵必须有相同的dim。

先把需要处理的数据丢进GPU,然后使用arrayfun,对每个元素操作,最终输出结果。

今天对3000点以上的model与image进行similarity运算,加速达到5.8倍。

 

1.2

把一个写好的cu文件,(我用的这个文件只包含一个函数,但是是否只能包含一个函数,尚不了解)用nvcc -xxx.ptx -xxx.cu编译。

得到ptx文件。

在matlab使用kl= parallel.gpu.kernel(xxx.ptx,xxx.cu) 可以得到一个function handle。

用feval,调用kl,进行计算。

 

2.perspective shape matching paper

2.1.

首先是建立一个正确的model。

这个model包括,{ 点集,梯度向量集,cluster_map, cluster_label }

cluster用kmeans clustering找出。

k-means clustering 目前难的地方在于如何计算K。

现在使用的办法是根据template几何形状,手动输入k。

又根据算法的变化要求,k应该越大越好。

labeling的方法实际上是通过cluster中每个element的梯度向量方向决定的。

如果cluster中大部分element的梯度方向近似,那么normalize之后的向量和会趋近于1。

那么把cluster标记为线。

反之为点。

 

2.2. DLT

这个算法是通过点集来确定转换关系.

对于同样的点集P,在坐标系A下有Pa,坐标系B下有Pb。

所有的坐标均为,homogenious coordiantes

当P的点数大于4,就可以计算出一个Homography。

Pa*H = Pb

Pb * inv(H) = Pa

 

2.3 homography

把perpective deformation 转化为每个cluster的2D affine transformation

这样的解决方案可以简化perpetive transformation 8个自由度的问题。

但是与之而来的就是如何保证template整体的不变形。

 目前来看,是2d transformation之前的cluster centers与之后的centers之间,利用DLT,算出Homography.

然后,利用Homography得到2d transformation之后的template整体形状。

那么与之而来的问题是,Similarity应该基于哪一个template。

有待实验解决。

 

3. OV5640摄像头的颜色模式与压缩的测试

最近调试摄像头,OV5640的相机输出的格式有MJPG,RGB3以及YUYV.

选用1024*768的分辨率,分别读回这些模式之下的raw文件。

其中,RGB3的大小是2.4mb 约等于理论值2.25mb,所以不可能有压缩。

YUYV大小为1.6mb,基于色差的储存模式,也是合理的。

MJPG的大小为121.3kb,完全压缩成jpg格式出来的图。

 

对于在PC端的压缩而言,bmp格式下,RGB3与YUYV都是2.4mb大小,猜测是bmp把色差转为了RGB。

jpg格式下,所有都是121-122kb大小。