Java 将3x3 OpenCV Mat转换为Android矩阵

Java 将3x3 OpenCV Mat转换为Android矩阵,java,android,opencv,matrix,Java,Android,Opencv,Matrix,我得到了一个OpenCV格式的3x3矩阵(org.OpenCV.core.Mat),我想复制到android.graphics.matrix中。知道怎么做吗 [编辑] 以下是以@elmiguelao为灵感的最终版本。源矩阵来自OpenCV,目标矩阵来自Android static void transformMatrix(Mat src, Matrix dst) { int columns = src.cols(); int rows = src.rows(); fl

我得到了一个OpenCV格式的3x3矩阵(org.OpenCV.core.Mat),我想复制到android.graphics.matrix中。知道怎么做吗

[编辑]

以下是以@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);
}
静态矩阵(Mat src、矩阵dst){
int columns=src.cols();
int rows=src.rows();
float[]值=新的float[列*行];
int指数=0;
对于(int x=0;x
大致如下:

cv.Mat opencv_矩阵;
矩阵和u矩阵;
if(opencv_matrix.iscontinuous()){
android_matrix.setValues(cv.MatOfFloat(opencv_matrix.ptr()).toArray());
}否则{
浮点[]opencv_矩阵_值=新浮点[9];
//未记录的.get(行、列、浮点[]),但似乎是批量复制。
获取(0,0,opencv_矩阵值);
android_matrix.setValues(opencv_matrix_values);
}

大致如下:

cv.Mat opencv_矩阵;
矩阵和u矩阵;
if(opencv_matrix.iscontinuous()){
android_matrix.setValues(cv.MatOfFloat(opencv_matrix.ptr()).toArray());
}否则{
浮点[]opencv_矩阵_值=新浮点[9];
//未记录的.get(行、列、浮点[]),但似乎是批量复制。
获取(0,0,opencv_矩阵值);
android_matrix.setValues(opencv_matrix_values);
}

大致如下:

cv.Mat opencv_矩阵;
矩阵和u矩阵;
if(opencv_matrix.iscontinuous()){
android_matrix.setValues(cv.MatOfFloat(opencv_matrix.ptr()).toArray());
}否则{
浮点[]opencv_矩阵_值=新浮点[9];
//未记录的.get(行、列、浮点[]),但似乎是批量复制。
获取(0,0,opencv_矩阵值);
android_matrix.setValues(opencv_matrix_values);
}

大致如下:

cv.Mat opencv_矩阵;
矩阵和u矩阵;
if(opencv_matrix.iscontinuous()){
android_matrix.setValues(cv.MatOfFloat(opencv_matrix.ptr()).toArray());
}否则{
浮点[]opencv_矩阵_值=新浮点[9];
//未记录的.get(行、列、浮点[]),但似乎是批量复制。
获取(0,0,opencv_矩阵值);
android_matrix.setValues(opencv_matrix_values);
}

此函数还尊重
Mat
的数据类型(浮点或双精度):

静态矩阵cvMat2Matrix(Mat源){
if(source==null | | source.empty()){
返回null;
}
float[]matrixValuesF=new float[source.cols()*source.rows()];
if(CvType.depth(source.type())==CvType.CV_32F){
source.get(0,0,matrixValuesF);
}否则{
double[]matrixValuesD=新的双精度[matrixValuesF.length];
获取(0,0,matrixValuesD);
//如果类型不是CvType.CV_64F,则将抛出java.lang.UnsupportedOperationException

对于(int i=0;i此函数还考虑了
Mat
的数据类型(float或double):

静态矩阵cvMat2Matrix(Mat源){
if(source==null | | source.empty()){
返回null;
}
float[]matrixValuesF=new float[source.cols()*source.rows()];
if(CvType.depth(source.type())==CvType.CV_32F){
source.get(0,0,matrixValuesF);
}否则{
double[]matrixValuesD=新的双精度[matrixValuesF.length];
获取(0,0,matrixValuesD);
//如果类型不是CvType.CV_64F,则将抛出java.lang.UnsupportedOperationException

对于(int i=0;i此函数还考虑了
Mat
的数据类型(float或double):

静态矩阵cvMat2Matrix(Mat源){
if(source==null | | source.empty()){
返回null;
}
float[]matrixValuesF=new float[source.cols()*source.rows()];
if(CvType.depth(source.type())==CvType.CV_32F){
source.get(0,0,matrixValuesF);
}否则{
double[]matrixValuesD=新的双精度[matrixValuesF.length];
获取(0,0,matrixValuesD);
//如果类型不是CvType.CV_64F,则将抛出java.lang.UnsupportedOperationException

对于(int i=0;i此函数还考虑了
Mat
的数据类型(float或double):

静态矩阵cvMat2Matrix(Mat源){
if(source==null | | source.empty()){
返回null;
}
float[]matrixValuesF=new float[source.cols()*source.rows()];
if(CvType.depth(source.type())==CvType.CV_32F){
source.get(0,0,matrixValuesF);
}否则{
double[]matrixValuesD=新的双精度[matrixValuesF.length];
获取(0,0,matrixValuesD);
//如果类型不是CvType.CV_64F,则将抛出java.lang.UnsupportedOperationException

对于(int i=0),if语句的一部分在Android中不起作用,因为没有这样的方法(ISCONTIQUATEOR或PTR)。您是对的,我仍然在第一部分中考虑C++:)我想第二个是唯一的选择。那么,是错误的。是的,不知您的代码没有正常工作,但我明白了;在我的文章中添加了我的最终代码。if语句的第一部分在Android中不起作用,因为没有这样的方法(ISCONTIATIONET/PTR)。你说的对,我还在思考C++的第一部分:)我想第二个是唯一的选择。那么,是错误的。是的,不知为什么你的代码不能正常工作,但是我明白了。在上面的帖子中添加了我的最终代码。if语句的第一部分在Android中不起作用,因为没有这样的方法(iscontigous或ptr)你是对的,我仍然在思考C++的第一部分:“我想第二个是唯一的选择。那么,是错误的。是的,不知为什么你的代码不能正常工作,但是我明白了。”把我的最终代码添加到上面的文章中。
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;
}