将 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++?