public void pca(double[] i_v1, double[] i_v2, int i_number_of_point, NyARDoubleMatrix22 o_evec, double[] o_ev, double[] o_mean) { NyARMat input = this.__pca_input;// 次処理で初期化される。 // pcaの準備 input.realloc(i_number_of_point, 2); double[][] input_array = input.getArray(); for (int i = 0; i < i_number_of_point; i++) { input_array[i][0] = i_v1[i]; input_array[i][1] = i_v2[i]; } // 主成分分析 input.pca(this.__pca_evec, this.__pca_ev, this.__pca_mean); double[] mean_array = this.__pca_mean.getArray(); double[][] evec_array = this.__pca_evec.getArray(); double[] ev_array = this.__pca_ev.getArray(); o_evec.m00 = evec_array[0][0]; o_evec.m01 = evec_array[0][1]; o_evec.m10 = evec_array[1][0]; o_evec.m11 = evec_array[1][1]; o_ev[0] = ev_array[0]; o_ev[1] = ev_array[1]; o_mean[0] = mean_array[0]; o_mean[1] = mean_array[1]; return; }
/** * arGetLine(int x_coord[], int y_coord[], int coord_num,int vertex[], double line[4][3], double v[4][2]) arGetLine2(int x_coord[], int y_coord[], int * coord_num,int vertex[], double line[4][3], double v[4][2], double *dist_factor) の2関数の合成品です。 マーカーのvertex,lineを計算して、結果をo_squareに保管します。 * Optimize:STEP[424->391] * * @param i_cparam * @return * @throws NyARException */ private bool getSquareLine(int[] i_mkvertex, int[] i_xcoord, int[] i_ycoord, NyARSquare o_square) { NyARLinear[] l_line = o_square.line; NyARVec ev = this.__getSquareLine_ev; // matrixPCAの戻り値を受け取る NyARVec mean = this.__getSquareLine_mean; // matrixPCAの戻り値を受け取る double[] mean_array = mean.getArray(); NyARCameraDistortionFactor dist_factor = this._dist_factor_ref; NyARMat input = this.__getSquareLine_input; // 次処理で初期化される。 NyARMat evec = this.__getSquareLine_evec; // アウトパラメータを受け取るから初期化不要//new NyARMat(2,2); double[][] evec_array = evec.getArray(); double w1; int st, ed, n, i; NyARLinear l_line_i, l_line_2; for (i = 0; i < 4; i++) { w1 = (double)(i_mkvertex[i + 1] - i_mkvertex[i] + 1) * 0.05 + 0.5; st = (int)(i_mkvertex[i] + w1); ed = (int)(i_mkvertex[i + 1] - w1); n = ed - st + 1; if (n < 2) { // nが2以下でmatrix.PCAを計算することはできないので、エラー return(false); } // pcaの準備 input.realloc(n, 2); // バッチ取得 dist_factor.observ2IdealBatch(i_xcoord, i_ycoord, st, n, input.getArray()); // 主成分分析 input.matrixPCA(evec, ev, mean); l_line_i = l_line[i]; l_line_i.run = evec_array[0][1]; // line[i][0] = evec->m[1]; l_line_i.rise = -evec_array[0][0]; // line[i][1] = -evec->m[0]; l_line_i.intercept = -(l_line_i.run * mean_array[0] + l_line_i.rise * mean_array[1]); // line[i][2] = -(line[i][0]*mean->v[0] + line[i][1]*mean->v[1]); } NyARDoublePoint2d[] l_sqvertex = o_square.sqvertex; NyARIntPoint[] l_imvertex = o_square.imvertex; for (i = 0; i < 4; i++) { l_line_i = l_line[i]; l_line_2 = l_line[(i + 3) % 4]; w1 = l_line_2.run * l_line_i.rise - l_line_i.run * l_line_2.rise; if (w1 == 0.0) { return(false); } l_sqvertex[i].x = (l_line_2.rise * l_line_i.intercept - l_line_i.rise * l_line_2.intercept) / w1; l_sqvertex[i].y = (l_line_i.run * l_line_2.intercept - l_line_2.run * l_line_i.intercept) / w1; // 頂点インデクスから頂点座標を得て保存 l_imvertex[i].x = i_xcoord[i_mkvertex[i]]; l_imvertex[i].y = i_ycoord[i_mkvertex[i]]; } return(true); }