내 소프트웨어의 한 부분으로, 프로젝터가 화면에 수직이 아닌 각도로 표시 될 때 얻을 수있는 삭제 표시/키스톤 효과를 피하기 위해 키스톤 교정 필터를 작성하려고합니다.소프트웨어 키스톤 보정 알고리즘
현재 나는 뭔가 작동하고 있지만 매우 느립니다 (전체 이미지의 경우 ~ 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;
}
무엇이 일에 대해 최선의 방법이 될 것이다? 사용자 정의 affine 변환은 처음에 내가 보려는 것이었지만 올바른 방향으로 나를 가리키는 코드/예제를 찾을 수 없었습니다. 위의 결과보다 더 나은 결과를 얻을 수있는 방법이 있습니까?
OpenCV를 살펴보십시오. 그것은 정말로 빠르며 사실상 모든 렌즈 왜곡을 교정하는 기능을 가지고 있습니다. 유망한 Java 래퍼가 있습니다. http://code.google.com/p/javacv/ – Blender
@Blender 덕분에 그 부분을 살펴 보겠습니다. 가능한 한 유일한 것은 자바로 무언가를 원합니다. 따라서 크로스 플랫폼을 유지할 수 있습니다 - 물론 JNA 매직이 있지만 가능하면 피하고 싶습니다. 이 경우 – berry120
을 입력하십시오. 그렇다면 어떻게 도움을 줄지는 모르겠지만 OpenCV 또는 다른 라이브러리의 소스 코드를 보면 그렇게 빨리 수행 할 수 있습니다. – Blender