将 Mat 对象中的图像转换为 Android 中的浮点数组

Posted

技术标签:

【中文标题】将 Mat 对象中的图像转换为 Android 中的浮点数组【英文标题】:Convert image in Mat object to a Float Array in Android 【发布时间】:2017-11-07 05:24:50 【问题描述】:

我正在 android 中读取图像,我想访问图像的像素值。

我正在阅读这样的图像

Mat img1 = new Mat();
img1 = Highgui.imread(filePath1);

有没有有效的方法将 Mat 对象转换为浮点数组?

目前,我正在这样做,而且速度非常慢。

private float[][] convertToFloatArray(String filePath1)

    img1 = Highgui.imread(filePath1);
    String output = img1.dump();
    float[][] flt = new float[img1.rows()][img1.cols()];

    // slowest step but necessary to remove [, ;, etc.
    String array1[] = output.split("[^0-9]+"); 

    int k = 0;
    for(int i = 0;i<img1.rows();i++) 
        for(int j = 0;j<img1.cols();j++) 
            flt[i][j] = (Float.valueOf(array1[k])).floatValue();
            k += 1;
        
    

【问题讨论】:

不敢相信你应该先转储到一个字符串。然后拆分字符串以获取像素值。一定有更简单的方法。 你为什么要花车?为什么不是整数? @greenapps:即使是整数也可以。你知道转换成整数的方法吗? 我什么都不知道。我只是想知道为什么你会先将所有内容转储到一个字符串中,然后将字符串拆分为值。我说我认为会有其他更好的方法。你对此没有反应。 如果我知道更好的方法,我就不会在这里问了^-^ 【参考方案1】:

找到解决办法

        img1 = new Mat();
        img1 = Highgui.imread(filePath1, 0);
        int buff[] = new int[(int)img1.total() * img1.channels()];
        img1.get(0, 0, buff);
        return buff;

【讨论】:

【参考方案2】:

你提到 int 数组就可以了。您可以跳过上面使用的字符串浮点数和字符串行,直接使用:

  int k = 0;
    for(int i = 0;i<img1.rows();i++) 
        for(int j = 0;j<img1.cols();j++) 
            int_arr[i][j] = static_cast<unsigned>(img1.data[k]);
            k += 1;
        
    

同时记录您拥有的频道数量。

【讨论】:

Static_cast 在 Java 中不是一个东西。这不起作用

以上是关于将 Mat 对象中的图像转换为 Android 中的浮点数组的主要内容,如果未能解决你的问题,请参考以下文章

从 IplImage 转换为 Mat 且 cvarrToMat 缺少/跳过图像数据字节

将 Mat 中的 RGB 图像转换为 MFC 中的 BYTE *

android:如何将 int[] 转换为 OpenCV Mat c++?

如何将 Mat 数据(OpenCV,图像数据格式)转换为统一的 3d 纹理

使用android相机捕获图像后将Bitmap转换为Mat

Mat 图像和 BMP格式图像的相互转换