のための私のソフトウェアの一部として、私はプロジェクターがスクリーンに対して垂直でない角度で表示されている場合、あなたが得ることができる墓石/キーストーン効果を避けるために、台形補正フィルタを書くことを探しています。アルゴリズムは、ソフトウェアキーストーン補正
現在のところ、私は何かが働いていますが、それは信じられないほど遅いです(画像全体で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;
}
は何これを行うについての最良の方法だろうか?カスタムアフィン変換は最初は私が見ようとしていましたが、私は正しい方向に私を向けるためのコード/例を見つけることができませんでした。私は上記よりも良い結果を達成する良い方法がありますか?
OpenCVをご覧ください。それは*本当に*高速であり、事実上あらゆるレンズ歪みを補正する機能を持っています。ここに有望なJavaラッパーがあります:http://code.google.com/p/javacv/ – Blender
@Blenderはそれに感謝します、私はそれを調べます。 JNAの魔法はありますが、可能ならばそれを避けたいと思います。その場合は – berry120
、気にしないでください。私はそれをどのように手助けするのかがはっきりと分かっていませんが、OpenCVや他のライブラリのソースコードを見れば、そういったことをすばやく確認できます。 – Blender