我正在尝试将c++ DCT代码转换为Android。下面是我试图在Android上从c++转换为OpenCV的代码。但是,我得到了这个错误:
. lang。IndexOutOfBoundsException:索引0无效,大小为0
我发现"外平面"是0。是否可以设置数组列表的大小或我错过了什么?老实说,我不是特别确定这段代码是否能工作。请告诉我该怎么做。非常感谢!
Mat secondImage = new Mat();
secondImage = image.clone();
List<Mat> planes = new ArrayList<Mat>();
Core.split(secondImage, planes);
List<Mat> outplanes = new ArrayList<Mat>(planes.size());
Mat trans = new Mat(CvType.CV_32FC1);
Log.d("Planes", Integer.toString(planes.size())); //3
Log.d("Outplanes", Integer.toString(outplanes.size()));
for (int k = 0; k < planes.size(); k++) {
planes.get(k).convertTo(planes.get(k),CvType.CV_32FC1);
Core.dct(planes.get(k), outplanes.get(k));
outplanes.get(k).convertTo(outplanes.get(k),CvType.CV_8UC1);
}
Core.merge(outplanes, trans);
调用:
List<Mat> outplanes = new ArrayList<Mat>(planes.size());
不会为您计算所有的内存——构造函数的参数只是您认为最终可能需要多少内存的一个指南。如果结果证明你需要更多也没关系;当你添加元素时,数组列表会重新调整维度,但如果你事先知道数组的大小,那么告诉它数组的大小会稍微提高性能。
因此,您仍然需要将Mats添加到数组列表中,以使通过planes.size()测量的大小增加。例如,如果我做:
outplanes.addAll(planes);
初始化外平面后,错误就会消失。
还看这个:
在Android上获取图像的DCT (Discrete Cosine Transform)