2014-02-14 128 views
0

我得到了一個OpenCV格式(org.opencv.core.Mat)的3x3矩陣,我想要複製到android.graphics.Matrix中。任何想法如何?轉換3x3 OpenCV墊到Android矩陣

[編輯]

這裏是爲啓發@elmiguelao的最終版本。源矩陣來自OpenCV,目標矩陣來自Android。

static void transformMatrix(Mat src, Matrix dst) { 

    int columns = src.cols(); 
    int rows = src.rows(); 

    float[] values = new float[columns * rows]; 
    int index = 0; 
    for (int x = 0; x < columns; x++) 
     for (int y = 0; y < rows; y++) { 
      double[] value = src.get(x, y); 
      values[index] = (float) value[0]; 

      index++; 
     } 

    dst.setValues(values); 
} 

回答

2

東西沿着這些路線:

cv.Mat opencv_matrix; 
Matrix android_matrix; 
if (opencv_matrix.isContiguous()) { 
    android_matrix.setValues(cv.MatOfFloat(opencv_matrix.ptr()).toArray()); 
} else { 
    float[] opencv_matrix_values = new float[9]; 
    // Undocumented .get(row, col, float[]), but seems to be bulk-copy. 
    opencv_matrix.get(0, 0, opencv_matrix_values); 
    android_matrix.setValues(opencv_matrix_values); 
} 
+0

if語句的第一部分不在Android中工作,因爲沒有這樣的方法(isContiguous或ptr)。 – Matthias

+0

你是對的,我仍然在考慮C++的第一部分:)我想那麼第二個是唯一的選擇。 [此API文檔](http://docs.opencv.org/java/org/opencv/core/Mat.html#isContinuous())是錯誤的。 – miguelao

+0

是的,不知何故你的代碼無法正常工作,但我明白了;)我的最終代碼添加到我的帖子上面。 – Matthias

0

這個功能也尊重Mat的數據類型(float或double):

static Matrix cvMat2Matrix(Mat source) { 
    if (source == null || source.empty()) { 
     return null; 
    } 
    float[] matrixValuesF = new float[source.cols()*source.rows()]; 

    if (CvType.depth(source.type()) == CvType.CV_32F) { 
     source.get(0,0, matrixValuesF); 
    } else { 
     double[] matrixValuesD = new double[matrixValuesF.length]; 
     source.get(0, 0, matrixValuesD); 
     //will throw an java.lang.UnsupportedOperationException if type is not CvType.CV_64F 
     for (int i=0; i<matrixValuesD.length; i++) { 
      matrixValuesF[i] = (float) matrixValuesD[i]; 
     } 
    } 

    Matrix result = new Matrix(); 
    result.setValues(matrixValuesF); 
    return result; 
}