package application; import java.io.File; import javafx.application.Application; import javafx.scene.image.Image; import javafx.scene.image.PixelReader; import javafx.stage.Stage; /** * aparapiの動作確認プログラム2-2 * 『単純なパターンマッチング(pure java)』 * 画像 : https://www.pakutaso.com/20120450102post-1371.html * * @author karura * */ public class TestAparapi2_2 extends Application { // 探索対象画像情報 private float target[]; // 探索画像のピクセル配列 private int targetHeight; // 探索画像の高さ private int targetWidth; // 探索画像の幅 // パターン画像情報 private float pattern[]; // パターン画像のピクセル配列 private int patternHeight; // パターン画像の高さ private int patternWidth; // パターン画像の幅 // 結果情報 private float result[]; // 探索画像とパターン画像の誤差配列 public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { System.out.println( "start!" ); // GPGPU用のクラスを生成して初期化 String file1 = new File("img/01.png").toURI().toString(); String file2 = new File("img/02.png").toURI().toString(); init( file1 , file2 ); // GPGPU実行(同時に処理時間取得) long startTime = System.nanoTime(); execute(); long endTime = System.nanoTime(); float interval = ( endTime - startTime ) / 1000000000.0f ; System.out.println( String.format( "time :%f [sec]", interval ) ); // 結果を出力 float[] result = getResult(); for( int i=0 ; i= targetHeight ){ value += 100; continue; } if( x + dx >= targetWidth ){ value += 100; continue; } // インデックス計算 int targetIndex = ( y + dy ) * targetWidth + ( x + dx ) ; int patternIndex = dy * patternWidth + dx; // 2乗誤差を計算 // 実際はR・G・B・Aの各色成分ごとに誤差をとるほうが良いが、 // 今回はパターン画像と完全一致する部分を得るため、計算を簡略化している float gap = target[ targetIndex ] - pattern[ patternIndex ]; gap *= gap; // 誤差を加算 value += gap; } } // 誤差の合計を結果配列に格納 result[i] = value; } /** * GPGPU計算結果を返す * @return */ public float[] getResult() { return result; } /** * GPGPU計算結果のインデックスから * 探索画像上のx座標を計算する * @param index * @return */ public int getResultX( int index ) { return index % targetHeight; } /** * GPGPU計算結果のインデックスから * 探索画像上のy座標を計算する * @param index * @return */ public int getResultY( int index ) { return index / targetHeight; } }