root/graph/JavaPopWeb/src/jp/ac/nime/computer/grpsimulator/ImageProcess.java

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ImageProcess
  2. ProcessImage
  3. ProcessContrast
  4. ProcessHighPass
  5. ProcessHighCut
  6. ProcessLabeling
  7. ProcessDensityLine
  8. ProcessLevelChange
  9. ProcessShowEdge
  10. ProcessSmoothing
  11. ProcessRemoveNoise
  12. ProcessEmphasis
  13. ProcessHistogramPrint
  14. ProcessHistogramNormal
  15. ProcessHistogramBinary
  16. ProcessFillRGB
  17. ProcessDescriptPoint
  18. resize
  19. ProcessMeasureTrim
  20. ProcessMeasureThinning
  21. ProcessMeasureArea
  22. ProcessMeasureScale
  23. ProcessAnalyzeFourier
  24. ProcessAnalyzeProjection
  25. ProcessAnalyzeReflectance

package jp.ac.nime.computer.grpsimulator;

import java.awt.*;
import java.awt.image.*;
import jp.ac.nime.computer.grpsimulator.ImgPr.*;
import jp.ac.nime.computer.grpsimulator.VecPr.*;
import java.awt.event.*;

/** ImageProcessクラスは、各種画像処理を呼び出すためのstaticなメソッドを持つクラスです
 * @version 1.0.0
 * @author igarashi
 * @author kikuchi
 */
public class ImageProcess {

        /** 各種画像処理を行います
         * @param img 処理対象の画像バッファです
         * @param param 画像処理パラメータを指示するParameterSettingクラスのオブジェクト
         * @return 成功時にはtrue
         * @see GrpSimBuffer
         * @see ParameterSetting
         */    
        public static boolean ProcessImage(GrpSimBuffer img, ParameterSetting param) {
                int params[] = param.getParameters();
                if (params != null) {
                        switch( param.getParameterType() ) {

                        case ParameterSetting.PARAM_TYPE_CONTRAST:
                                return ProcessContrast(img, params[0]);

                        case ParameterSetting.PARAM_TYPE_HIGHPASS:
                                return ProcessHighPass(img, params[0]);

                        case ParameterSetting.PARAM_TYPE_HIGHCUT:
                                return ProcessHighCut(img, params[0]);

                        case ParameterSetting.PARAM_TYPE_LABELING:
                                return ProcessLabeling(img, params[0]);

                        case ParameterSetting.PARAM_TYPE_DENSITYLINE:
                                return ProcessDensityLine(img, params[0]);

                        case ParameterSetting.PARAM_TYPE_LEVELCHANGE:
                                if (params.length < 2) return false;
                                return ProcessLevelChange(img, params[0], params[1]);

                        case ParameterSetting.PARAM_TYPE_HISTO_PRINT:
                                // ヒストグラムの該当部分だけをDstに転送する
                                // 100個のint配列、ヒストグラムの選択状態(0:非選択,1:選択)
                                return ProcessHistogramPrint(img, params);

                        case ParameterSetting.PARAM_TYPE_HISTO_NORMAL:
                                // ヒストグラム平滑化
                                // 100個のint配列、ヒストグラムの選択状態(0:非選択,1:選択)
                                return ProcessHistogramNormal(img, params);

                        case ParameterSetting.PARAM_TYPE_HISTO_BINARY:
                                // ヒストグラム2値化
                                // 100個のint配列、ヒストグラムの選択状態(0:非選択,1:選択)
                                // 選択状態で最小値を選ぶ
                                int iki = -1;
                                for (int i = 0; i < params.length; i ++) {
                                        if (params[i] == 1) { 
                                                iki = i; 
                                                break;
                                        }
                                }
                                if (iki == -1) return false;    // 選択されていなければ、なにもしない
                            return ProcessHistogramBinary(img, iki);

                        case ParameterSetting.PARAM_TYPE_SHOW_EDGE:
                                // エッジ抽出
                                // 9個のint配列
                                if (params.length < 9) return false;
                                return ProcessShowEdge(img, params);

                        case ParameterSetting.PARAM_TYPE_SMOOTHING:
                                // 平滑化
                                // 9個のint配列
                                if (params.length < 9) return false;
                                return ProcessSmoothing(img, params);

                        case ParameterSetting.PARAM_TYPE_REMOVE_NOISE:
                                // ノイズ除去
                                // 9個のint配列
                                if (params.length < 9) return false;
                                return ProcessRemoveNoise(img, params);

                        case ParameterSetting.PARAM_TYPE_EMPHASIS:
                                // 強調処理
                                // 9個のint配列
                                if (params.length < 9) return false;
                                return ProcessEmphasis(img, params);

                        case ParameterSetting.PARAM_TYPE_FILL_RGB:
                                // 画像データ表現 色
                                return ProcessFillRGB(img, params[0]);
                        
                        case ParameterSetting.PARAM_TYPE_DESCRIPT_POINT:
                                // 画像データ表現 点
                                if (param instanceof VectorDataDialog) {
                                        VectorDataDialog steps = (VectorDataDialog) param;
                                        return ProcessDescriptPoint(img, steps.getVectorData(), params[0]);
                                }
                                return false;

                        case ParameterSetting.PARAM_TYPE_MEASURE_TRIM:
                                // 画像計測 切り出し
                                if (param instanceof SteppingParameter) {
                                        SteppingParameter steps = (SteppingParameter) param;
                                        return ProcessMeasureTrim(img, steps.getStepCount());
                                }
                                return false;

                        case ParameterSetting.PARAM_TYPE_MEASURE_SCALE:
                                // 画像計測 拡大縮小
                                return ProcessMeasureScale(img, params[0]);

                        case ParameterSetting.PARAM_TYPE_MEASURE_SHARP:
                                // 画像計測 細線化
                                if (param instanceof SteppingParameter) {
                                        SteppingParameter steps = (SteppingParameter) param;
                                        return ProcessMeasureThinning(img, steps.getStepCount(), params[0]);
                                }
                                return false;

                        case ParameterSetting.PARAM_TYPE_MEASURE_AREA:
                                // 画像計測 面積
                                if (param instanceof SteppingParameter) {
                                        SteppingParameter steps = (SteppingParameter) param;
                                        return ProcessMeasureArea(img, steps);
                                }
                                return false;
                        
                        case ParameterSetting.PARAM_TYPE_ANALYZE_FOURIER:
                                // 画像解析 フーリエ展開
                                if (params.length < 2) return false;
                                return ProcessAnalyzeFourier(img, params[0], params[1]);
                                
                        case ParameterSetting.PARAM_TYPE_DESCRIPT_PROJECTION:
                                // 画像解析 投影
                                if (params.length < 2) return false;
                                return ProcessAnalyzeProjection(img, params[0], params[1]);
                        
                        case ParameterSetting.PARAM_TYPE_DESCRIPT_REFLECTANCE:
                                // 画像解析 反射
                                if (params.length < 8) return false;
                                return ProcessAnalyzeReflectance(img, params);
                        }
                }
                return false;
        }

        private static boolean ProcessContrast(GrpSimBuffer img, int nContrast) {
                if (nContrast<-10 || nContrast>10) return false;
                TransContrast filer = new TransContrast();
                int[] param = new int[1];
                param[0] = nContrast;
                filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
                // YUVを変更したのでRGBも変更する。
                img.syncDst(img.YUV);
                return true;
        }

        private static boolean ProcessHighPass(GrpSimBuffer img, int nStartLevel) {
                if (nStartLevel<0 || nStartLevel>100) return false;
                TransHighPass filer = new TransHighPass();
                int[] param = new int[1];
                param[0] = nStartLevel;
                filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
                // YUVを変更したのでRGBも変更する。
                img.syncDst(img.YUV);
                return true;
        }

        private static boolean ProcessHighCut(GrpSimBuffer img, int nStartLevel) {
                if (nStartLevel<0 || nStartLevel>100) return false;
                TransHighCut filer = new TransHighCut();
                int[] param = new int[1];
                param[0] = nStartLevel;
                filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
                // YUVを変更したのでRGBも変更する。
                img.syncDst(img.YUV);
                return true;
        }

        private static boolean ProcessLabeling(GrpSimBuffer img, int nNumOfPhases) {
                if (nNumOfPhases<1 || nNumOfPhases>255) return false;
                TransFloorQuantum filer = new TransFloorQuantum();
                int[] param = new int[1];
                param[0] = nNumOfPhases;
                filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
                // YUVを変更したのでRGBも変更する。
                img.syncDst(img.YUV);
                return true;
        }

        private static boolean ProcessDensityLine(GrpSimBuffer img, int nNumOfPhases) {
                if (nNumOfPhases<1 || nNumOfPhases>100) return false;
                TransConcentLine filer = new TransConcentLine();
                int[] param = new int[1];
                param[0] = nNumOfPhases;
                filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
                // YUVを変更したのでRGBも変更する。
                img.syncDst(img.YUV);
                return true;
        }

        private static boolean ProcessLevelChange(GrpSimBuffer img, int nBottomLevel, int nTopLebel) {
                if (nBottomLevel<0 || nBottomLevel>49 || nTopLebel<50 || nTopLebel>100) return false;
                TransDynamicExpnd filer = new TransDynamicExpnd();
                int[] param = new int[2];
                param[0] = nBottomLevel;
                param[1] = nTopLebel;
                filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
                // YUVを変更したのでRGBも変更する。
                img.syncDst(img.YUV);
                return true;
        }

        // 3 * 3
        private static boolean ProcessShowEdge(GrpSimBuffer img, int nFilter[]) {
                NeighborOp filer = new NeighborOp(3, nFilter, 1);
                filer.Filter(0, img);
                // RGBを変更したのでYUVも変更する。
                img.syncDst(img.RGB);
                return true;
        }

        private static boolean ProcessSmoothing(GrpSimBuffer img, int nFilter[]) {
                int ndiv = 0;
                for (int i = 0; i < 9; i ++) {
                        ndiv += nFilter[i];
                }
                NeighborOp filer = new NeighborOp(3, nFilter, ndiv);
                filer.Filter(0, img);
                // RGBを変更したのでYUVも変更する。
                img.syncDst(img.RGB);
                return true;
        }

        private static boolean ProcessRemoveNoise(GrpSimBuffer img, int nFilter[]) {
                int ndiv = 0;
                for (int i = 0; i < 9; i ++) {
                        ndiv += nFilter[i];
                }
                NeighborOp filer = new NeighborOp(3, nFilter, ndiv);
                filer.Filter(0, img);
                // RGBを変更したのでYUVも変更する。
                img.syncDst(img.RGB);
                return true;
        }

        private static boolean ProcessEmphasis(GrpSimBuffer img, int nFilter[]) {
                NeighborOp filer = new NeighborOp(3, nFilter, 1);
                filer.Filter(0, img);
                // RGBを変更したのでYUVも変更する。
                img.syncDst(img.RGB);
                return true;
        }

        // ヒストグラム
        private static boolean ProcessHistogramPrint(GrpSimBuffer img, int nSelected[]) {
                HistogramOp filter = new HistogramOp();
                filter.printHist(filter.YP, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), nSelected);
                // YUVを変更したのでRGBも変更する。
                img.syncDst(img.YUV);
                return true;
        }

        private static boolean ProcessHistogramNormal(GrpSimBuffer img, int nSelected[]) {
                HistogramFlat filter = new HistogramFlat();
                filter.Calculation(filter.YP, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), nSelected);
                //filter.Normal(filter.YP, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
                // YUVを変更したのでRGBも変更する。
                img.syncDst(img.YUV);
                return true;
        }
        private static boolean ProcessHistogramBinary(GrpSimBuffer img, int nIkiti) {
                HistogramBinary filter = new HistogramBinary();
                int param[] = new int [1];
                param[0] = nIkiti;
                filter.Calculation(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
            // YUVを変更したのでRGBも変更する。
            img.syncDst(img.YUV);
                return true;
        }
        
        // データ表現 色
        /** 画像データ表現 点
         * @param img 画像管理クラス
         * @param rgb 決定した色
         * @return 正常終了ならtrue
         */
        private static boolean ProcessFillRGB(GrpSimBuffer img, int rgb) {
                BufferedImage imgRGB = img.getDstImage(GrpSimBuffer.RGB);
                int w = imgRGB.getWidth();
                int h = imgRGB.getHeight();
                int[] tmp = new int[w * h];
                java.util.Arrays.fill(tmp,0xFF000000|rgb);
                imgRGB.setRGB(0,0,w,h,tmp,0,1);
                // RGBを変更したのでYUVも変更する。
                img.syncDst(img.RGB);
                return true;
        }
        // データ表現点
        /** 画像データ表現 点
         * @param img   画像管理クラス
         * @param gsdd  Drawデータ
         * @param nZoom 拡大縮小率(パーセント)
         * @return 正常終了ならtrue
         */
        private static boolean ProcessDescriptPoint(GrpSimBuffer img, GrpSimVectorData gsvd, int nZoom) {
                BufferedImage imgSrc = img.getSrcImage(GrpSimBuffer.RGB);
                BufferedImage imgBuf = new BufferedImage(imgSrc.getWidth(), imgSrc.getHeight(), BufferedImage.TYPE_INT_ARGB);
                // srcに画像を展開する
                int w = imgSrc.getWidth();
                int h = imgSrc.getHeight();
                int[] tmp = new int[w * h];
                java.util.Arrays.fill(tmp,0xFFFFFFFF);
                imgBuf.setRGB(0,0,w,h,tmp,0,1);
                gsvd.write(imgBuf);
                // resize
                imgBuf = resize(imgBuf, nZoom);
                imgBuf.copyData(imgSrc.getRaster());
                // RGBを変更した
                img.syncSrc(img.RGB);
                
                // Dstに線画データ自体を拡大縮小して描画する
                // ofs量を計算する
                int ofx = - (((nZoom * 160) / 100) - 160);
                int ofy = - (((nZoom * 120) / 100) - 120);
                img.getDstImage(GrpSimBuffer.RGB).setRGB(0,0,w,h,tmp,0,1);
                gsvd.write(img.getDstImage(GrpSimBuffer.RGB), nZoom, ofx, ofy);
                // RGBを変更した
                img.syncDst(img.RGB);
                
                return true;
        }
        
        /** 画像バッファをリサイズする
         * @param img   元画像バッファ
         * @param nZoom 拡大縮小率(パーセント)
         * @return リサイズ後の画像バッファ
         */
        private static BufferedImage resize(BufferedImage img, int nZoom) {
                if (nZoom < 1) nZoom = 1;
                int w = img.getWidth();
                int h = img.getHeight();
                int newW = w * nZoom / 100;
                int newH = h * nZoom / 100;

                BufferedImage after = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
                int[] tmp = new int[w * h];
                java.util.Arrays.fill(tmp,0xFFFFFFFF);
                after.setRGB(0,0,w,h,tmp,0,1);          
                
                Graphics2D graphics = after.createGraphics();
                Image resized = img.getScaledInstance(newW, newH, Image.SCALE_FAST);
                graphics.drawImage(resized, (w - newW) / 2 , (h - newH) / 2, null);
                graphics.dispose();

                return after;
        }
        
        // 画像計測 切り出し
        static MeasureTrim mt_ = null;
        /** 画像計測切り出し 操作関数
         * @param img 画像管理クラス
         * @param nStepCount  パラメタ
         * @return 正常終了ならtrue
         */
        private static boolean ProcessMeasureTrim(GrpSimBuffer img, int nStepCount) {
                // 画像計測 切り出し
                //System.out.println("Step Test : " + nStepCount);      // debug
                if (mt_ == null) 
                        mt_ = new MeasureTrim();
                if (nStepCount == 1) {
                        // 二値化データ作成
                        mt_.makeWB(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                        // 計算初期化
                        mt_.init(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
                } else if (nStepCount == 0) {
                        // 初期に戻る
                        if (mt_ != null) {
                                //while (mt_.checkCalcEnd()) {
                                        // 1Step実行
                                //      mt_.calcStep();
                                //}
                                mt_ = null;
                        }
                } else if (nStepCount < 0) {
                        // 最後まで実行
                        while (mt_.checkCalcEnd()) {
                                // 1Step実行
                                mt_.calcStep();
                        }
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                        // 開放
                        mt_ = null;
                } else {
                        // 1Step実行
                        mt_.calcStep();
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                }
                return true;
        }

        // 画像計測 細線化処理
        static MeasureThinning mth_ = null;
        /** 画像計測 細線化処理 操作関数
         * @param img 画像管理クラス
         * @param nStepCount  パラメタ
         * @param nHigeMax      ヒゲ回避回数(nStepCountが1のとき意味を持つ)
         * @return 正常終了ならtrue
         */
        private static boolean ProcessMeasureThinning(GrpSimBuffer img, int nStepCount, int nHigeMax) {
                // 画像計測 切り出し
                //System.out.println("Step Test : " + nStepCount);      // debug
                if (mth_ == null) 
                        mth_ = new MeasureThinning();
                if (nStepCount == 1) {
                        // 二値化データ作成
                        mth_.makeWB(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                        // 計算初期化
                        mth_.init(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), nHigeMax);
                } else if (nStepCount == 0) {
                        // 初期に戻る
                        if (mth_ != null) {
                                //while (mth_.checkCalcEnd()) {
                                        // 1Step実行
                                //      mth_.calcStep();
                                //}
                                mth_ = null;
                        }
                } else if (nStepCount < 0) {
                        // 最後まで実行
                        while (mth_.checkCalcEnd()) {
                                // 1Step実行
                                mth_.calcStep();
                        }
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                        // 開放
                        mth_ = null;
                } else {
                        // 1Step実行
                        mth_.calcStep();
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                }
                return true;
        }
        
        // 画像計測 面積
        static MeasureArea mA_ = null;
        /** 画像計測切り出し 操作関数
         * @param img 画像管理クラス
         * @param steps  パラメタ
         * @return 正常終了ならtrue
         */
        private static boolean ProcessMeasureArea(GrpSimBuffer img, SteppingParameter steps) {
                // 画像計測 切り出し
                //System.out.println("Step Test : " + nStepCount);      // debug
                int nStepCount = steps.getStepCount();
                if (mA_ == null) 
                        mA_ = new MeasureArea();
                if (nStepCount == 1) {
                        // 二値化データ作成
                        mA_.makeWB(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                        // 計算初期化
                        mA_.init(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
                } else if (nStepCount == 2) {
                        // ラベリング
                        mA_.labeling();
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                } else if (nStepCount == 0) {
                        // 初期に戻る
                        if (mA_ != null) {
                                //while (mA_.checkCalcEnd()) {
                                        // 1Step実行
                                //      mA_.calcStep();
                                //}
                                mA_ = null;
                        }
                } else if (nStepCount < 0) {
                        // 最後まで実行
                        while (mA_.checkCalcEnd()) {
                                // 1Step実行
                                mA_.calcStep();
                        }
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                        // 面積の一覧を出力する
                        steps.setStepResult(mA_.getArea());
                        // 開放
                        mA_ = null;
                } else {
                        // 1Step実行
                        mA_.calcStep();
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                }
                return true;
        }
        /** 画像計測 拡大縮小の処理
         * @param img GrpSim画像バッファクラス
         * @param nAction       処理内容
         * @return 正常終了ならtrue
         */
        private static boolean ProcessMeasureScale(GrpSimBuffer img, int nAction) {
                MeasureScale ms = new MeasureScale();
                // YUVでそうさ
                ms.action(0, nAction, img.getSrcImage(img.YUV), img.getDstImage(img.YUV));
            // YUVを変更したのでRGBも変更する。
            img.syncDst(img.YUV);
                return true;
        }
        
        // 画像認識
        static AnalyzeFourier af_ = new AnalyzeFourier();
        /** 画像認識 フーリエ展開
         * @param img GrpSim画像バッファクラス
         * @param nAction       処理内容
         * @param nCutOff       遮断次数
         * @return 正常終了ならtrue
         */
        private static boolean ProcessAnalyzeFourier(GrpSimBuffer img, int nAction, int nCutOff) {
                switch (nAction) {
                case 1:
                        // 二値化 境界
                        af_.makeWB(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
                        // YUVを変更したのでRGBも変更する。
                        img.syncDst(img.YUV);
                        af_.init(0, img.getSrcImage(GrpSimBuffer.YUV));
                        // 画像描画
                        af_.writeSrcDiag(img.getDstImage(GrpSimBuffer.RGB));
                        // RGBを変更したのでYUVも変更する。
                        img.syncDst(img.RGB);
                        return true;
                case 2:
                        // 計算
                        af_.calcPFFT(nCutOff);
                        // 描画
                        af_.writeFFTDiag(img.getDstImage(GrpSimBuffer.RGB));
                        // RGBを変更したのでYUVも変更する                       
                        img.syncDst(img.RGB);
                        return true;
                default:
                        return false;
                }
        }
        
        /** 画像認識 投影
         * @param img GrpSim画像バッファクラス
         * @param nProj         投影面の位置
         * @param nCame         視点の位置
         * @return 正常終了ならtrue
         */
        private static boolean ProcessAnalyzeProjection(GrpSimBuffer img, int nProj, int nCame) {
                AnalyzeProjection ap = new AnalyzeProjection();
                // ソース画像側にパラレル
                ap.Parallel(img.getSrcImage(GrpSimBuffer.RGB), (double)nCame, (double)nProj);
                img.syncSrc(GrpSimBuffer.RGB);
                // Dst画像側にパースペクティブ
                ap.Perspective(img.getDstImage(GrpSimBuffer.RGB), (double)nCame, (double)nProj);
                img.syncDst(GrpSimBuffer.RGB);
                return true;
        }

        /** 画像認識 リフレクタンス
         * @param img GrpSim画像バッファクラス
         * @param nPrams        パラメタ8個
         * @return 正常終了ならtrue
         */
        private static boolean ProcessAnalyzeReflectance(GrpSimBuffer img, int[] nParams) {
                AnalyzeReflectance ar = new AnalyzeReflectance(GrpSim.res_);
                // ソース画像側にFace
                ar.faceColor(img.getSrcImage(GrpSimBuffer.RGB), nParams[0], nParams[1], nParams[2], nParams[3], nParams[4], nParams[5], nParams[6], nParams[7]);
                img.syncSrc(GrpSimBuffer.RGB);
                // Dst画像側にSphere
                ar.sphere(img.getDstImage(GrpSimBuffer.RGB), nParams[0], nParams[1], nParams[2], nParams[3], nParams[4], nParams[5], nParams[6], nParams[7]);
                img.syncDst(GrpSimBuffer.RGB);
                return true;
        }
}


/* [<][>][^][v][top][bottom][index][help] */