作为我的软件的一部分,我想写一个keystone校正过滤器,以避免当投影仪以不垂直于屏幕的角度显示时出现的墓碑/ keystone效果。
目前我已经得到了一些工作,但它是令人难以置信的慢(整个图像约100ms),理想情况下,我希望有更快的东西(最好在10ms范围内)。我基本上只是逐个像素地循环整个图像,并将我想要的像素复制到一个新的数组中,然后将新图像的rgb内容设置到这个新的数组中:
public BufferedImage getCorrectedImage() {
double width = originalImage.getWidth(null) * 0.5;
double increment = (originalImage.getWidth(null) - width)/originalImage.getHeight();
BufferedImage ret = new BufferedImage(originalImage.getWidth(null), originalImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
for (int h = 0; h < originalImage.getHeight(); h++) {
int[] arr = new int[originalImage.getWidth()];
for (int w = 0; w < originalImage.getWidth(); w++) {
arr[w] = originalImage.getRGB(w, h);
}
int[] newPixels = getShortLine(arr, (int) (width + 0.5));
for (int w = 0; w < originalImage.getWidth(); w++) {
ret.setRGB(w, h, newPixels[w]);
}
width += increment;
}
return ret;
}
private int[] getShortLine(int[] original, int newSize) {
int[] newArr = new int[original.length];
double scale = original.length / newSize;
int start = (original.length - newSize) / 2;
int end = original.length - ((original.length - newSize) / 2);
for (int i = start; i < end-1; i++) {
newArr[i] = original[(int) ((i - start) * scale)];
}
return newArr;
}做这件事最好的方法是什么?自定义仿射变换最初是我要看的,但我找不到任何代码/示例来为我指明正确的方向。有没有比上述更好的方法来达到我想要的结果呢?
发布于 2011-09-05 08:48:36
有几件事你可以做来加速你现有的代码。需要注意的是,这些代码会让你的代码变得更混乱,更难阅读……和调试。但是,如果算法是有效的,那么重构以获得更好的性能可能并不太困难:
请查看ImageJ,它完全是用Java语言编写的。
https://stackoverflow.com/questions/7302970
复制相似问题