Java 将打开的cv矩阵转换为整数数组

Java 将打开的cv矩阵转换为整数数组,java,opencv,java-native-interface,mat,Java,Opencv,Java Native Interface,Mat,我正在尝试将cv_8UC3(RGB)类型的开放cv mat转换为整数数组 void copyMatToJIntArray(Mat m,jint* jia) { Mat tempMat; cvtColor(m,tempMat,CV_BGRA2RGB); jint size = tempMat.rows*tempMat.cols* tempMat.elemSize(); u_char * uchars = new u_char[size]; for(i

我正在尝试将cv_8UC3(RGB)类型的开放cv mat转换为整数数组

void copyMatToJIntArray(Mat m,jint* jia)
{

    Mat tempMat;
    cvtColor(m,tempMat,CV_BGRA2RGB);
    jint size = tempMat.rows*tempMat.cols* tempMat.elemSize();
    u_char * uchars = new u_char[size];  

    for(int r=0;r<tempMat.rows;r++)
    {
        for(int c=0;c<tempMat.cols;c++)
        {
            u_char r=*(tempMat.data+ r*tempMat.step + c);
            u_char g=*(tempMat.data+ r*tempMat.step + c+1);
            u_char b=*(tempMat.data+ r*tempMat.step + c+2);
            uchars[r*tempMat.step+c]=r;
            uchars[r*tempMat.step+c+1]=g;
            uchars[r*tempMat.step+c+2]=b;
        }
    }

    for (int i = 0; i < tempMat.rows*tempMat.cols; i++)
    {
        jia[i] = uchars[i];
    }
}
但是当我在android测试手机上查看时,图像上有一个蓝色的色调

试试这个

jintArray resultImage = env->NewIntArray(h.total());
jint *_data = new jint[h.total()];
for (int i = 0; i < h.total(); i++) {
    char b = h.data[h.channels() * i];
    char g = h.data[h.channels() * i + 1];
    char r = h.data[h.channels() * i + 2];
    char a = 255;
    _data[i] = (((jint) a << 24) & 0xFF000000) + (((jint) r << 16) & 0x00FF0000) +
               (((jint) g << 8) & 0x0000FF00) + ((jint) b & 0x000000FF);
}
env->SetIntArrayRegion(resultImage, 0, h.total(), _data);
delete[]_data;

我不知道
Java
,但它几乎与
c++
中的
opencv
相同,您可以使用我的
c++
版本:

typedef std::vector<std::vector<int> > Matrix;

Matrix int_Im(3, std::vector<int>(m.cols*m.rows,0));
Matrix copyMatToJIntArray(Mat m,jint* jia)
{
   for(auto j=0, k = 0;j<m.rows;j++)
        for(auto i=0;i<m.cols;i++)
        {
            int_Im[k][0] = m.at<uchar>(j,i)[0];
            int_Im[k][1] = m.at<uchar>(j,i)[1];
            int_Im[k][2] = m.at<uchar>(j,i)[2];
            k++;
        }
  return int_Im;
}
typedef std::向量矩阵;
矩阵int_Im(3,std::vector(m.cols*m.rows,0));
矩阵复制矩阵(矩阵m,jint*jia)
{

对于(自动j=0,k=0;j阵列数据格式应符合以下要求的Mat类型

public static Mat arrayToMat(双[][]数组,int-height,int-width,int-matType)
{
垫图像=新垫(高度、宽度、垫类型);
对于(int i=0;i
int[] result = yourfunction();
Bitmap bitmap = Bitmap.createBitmap(result, yourimagewidth, yourimageheight, Bitmap.Config.ARGB_8888);
typedef std::vector<std::vector<int> > Matrix;

Matrix int_Im(3, std::vector<int>(m.cols*m.rows,0));
Matrix copyMatToJIntArray(Mat m,jint* jia)
{
   for(auto j=0, k = 0;j<m.rows;j++)
        for(auto i=0;i<m.cols;i++)
        {
            int_Im[k][0] = m.at<uchar>(j,i)[0];
            int_Im[k][1] = m.at<uchar>(j,i)[1];
            int_Im[k][2] = m.at<uchar>(j,i)[2];
            k++;
        }
  return int_Im;
}
    public static Mat arrayToMat(double[][] array,int height, int width, int matType)
    {
        Mat image = new Mat(height,width,matType);
        for (int i=0; i<height; i++)
        {
            for (int j=0; j<width; j++)
            {
                image.put(i,j,array[i][j]);
            }
        }
        return image;
    }

    public static double[][] matToArray(Mat frame)
    {
        double array[][] = new double[frame.height()][frame.width()];
        for (int i=0; i < frame.height(); i++)
        {
            for (int j=0; j < frame.width(); j++)
            {
                array[i][j] = frame.get(i,j)[0];
            }
        }
        return array;
    }