刚使用OpenCV不久,最近在做关于行人检测方面的项目,使用HOG+SVM的方法实现,但是由于维数过高,致使处理时间过长,达不到实时检测的要求,因此选择了对HOG检测子进行了降维。在使用PCA降维的过程中,利用到了gemm函数,这个函数主要是对于矩阵的运算,是在最近版本的OPENCV版本中才集成进来了。代码是C语言写的,2.4.9版本的文件在modules/core/src/matmul.cpp中下面对于函数进行简单的说明:函数定义如下:
函数定于如下:
void cv::gemm( InputArray matA, InputArray matB, double alpha,
InputArray matC, double beta, OutputArray _matD, int flags )
该函数比较复杂,代码量在600行左右,具体计算的是:
当然可以使用OpenBlas来实现矩阵的运算,两者之间的对比如下:
1.OpenBlas第一次运行的时候需要很多时间,其实Opencv也有这个这个现象,第一次启动时运行时间要比第二次运行时间长点点。
2.当矩阵的维数增大时,Opencv所花的矩阵相乘时间成指数增长,而OpenBlas却保持得很好,从下面的30个数据的结果可以看出,OpenBlas所花的时间成线性增长,factor因子是成线性增长的,所以,OpenBlas中的时间复杂度是O(n),这时OpenBlas完胜OpenCV。
结论
1.Opencv中的矩阵乘法函数gemm只适应于矩阵维数小的情况,大概加估计的话,当矩阵阶数是1000以内时,Opencv可以1000ms内完成两个矩阵相乘。
2.OpenBlas适合处理高维矩阵相乘,对于小矩阵有点像杀鸡用牛刀,当矩阵维数为1500*3000时,仍然可以在500ms以内完成两个矩阵相乘。
当然,具体时间可能跟机器有些差别,本结论是程序在Release 32bit配置下运行在AMD3.5GHz,6核64位win7系统上的结果。
参考:http://m.blog.csdn.net/article/details?id=50133505
http://blog.csdn.net/yeyang911/article/details/31816807