OpenCV矩阵按行求均值

来源:互联网 发布:头戴耳机 隔音 知乎 编辑:程序博客网 时间:2024/06/05 22:56

              最近在做一个基于PCA的人脸识别系统JAVA版(系统具体过程后期会更博)时,发现OpenCV在求矩阵平均值时不能够像MATLAB那样得到我需要的结果。我自己在opencv的库上进行了扩展。下面将对两种工具求均值进行分析。

          1.MATLAB中的均值方法

>> A=[1 2 3;3 3 6;4 6 8;4 7 7];>> mean(A)ans =    3.0000    4.5000    6.0000>> mean(A,2)ans =     2     4     6     6>> 
  MATLAB中的均值方法为mean(A),其中mean(A)是按照矩阵的列求其平均值,最后形成一个1*N的行向量;mean(A,2)是按照矩阵的行求其平均值最后形成M*1的列向量。在这个PCA的人脸识别系统中我需要按行求训练矩阵的平均值时 MATLAB中就可以直接使用mean(A,2)返回值就是我需要的均值矩阵。

   但是在OpenCV中使用这个mean方法求解平均值时得到的结果跟我需要并不一样(本人是OpenCV新人大笑,也许是因为我用的不对,如有知道的大神,请不吝赐教啊)。下面是我扩展的方法

      2.扩展OpenCV中的均值方法(JAVA版)

    

 /**    * 矩阵按行求均值    * @param mat    * @return 返回行均值向量    */   public static Mat horizontalMean(Mat mat){   Mat meanVector=new Mat();   meanVector.create(mat.rows(),1,CvType.CV_64FC1);   //遍历mat矩阵   for (int i = 0; i < mat.rows(); i++) {   Mat rowRange = mat.rowRange(i,i+1);   Scalar mean = Core.mean(rowRange);   meanVector.put(i, 0,mean.val[0]);}   return meanVector;   }
    这个做法其实很简单,只是将需要求解的行数据拿出来然后调用mean方法即可。当然这种方法在超高维矩阵时效率应该是很低,并不值得推广,本人也只是解燃眉之急。