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大小。