/** * i_imageから、idマーカを読みだします。 * o_dataにはマーカデータ、o_paramにはまーかのパラメータを返却します。 * @param image * @param i_square * @param o_data * @param o_param * @return * @throws NyARException */ public bool pickFromRaster(INyARRgbRaster image, NyARIntPoint2d[] i_vertex, NyIdMarkerPattern o_data, NyIdMarkerParam o_param) { //遠近法のパラメータを計算 if (!this._perspective_reader.setSourceSquare(i_vertex)) { return false; }; INyARRgbPixelReader reader = image.getRgbPixelReader(); NyARIntSize raster_size = image.getSize(); PerspectivePixelReader.TThreshold th = this.__pickFromRaster_th; MarkerPattEncoder encoder = this.__pickFromRaster_encoder; //マーカパラメータを取得 this._perspective_reader.detectThresholdValue(reader, raster_size, th); if (!this._perspective_reader.readDataBits(reader, raster_size,th, encoder)) { return false; } int d = encoder.encode(o_data); if (d < 0) { return false; } o_param.direction = d; o_param.threshold = th.th; return true; }
public void pickFromRaster(double[] i_cpara, INyARRgbRaster image, int[] o_patt) { int i2x, i2y;//プライム変数 int x, y; int w; int r, g, b; int resolution = this._resolution; int res_pix = resolution * resolution; int img_x = image.getWidth(); int img_y = image.getHeight(); int[] rgb_tmp = this._rgb_temp; int[] rgb_px = this._rgb_px; int[] rgb_py = this._rgb_py; double[] cp1cy_cp2 = this._cp1cy_cp2; double[] cp4cy_cp5 = this._cp4cy_cp5; double[] cp7cy_1 = this._cp7cy_1; double cp0 = i_cpara[0]; double cp3 = i_cpara[3]; double cp6 = i_cpara[6]; double cp1 = i_cpara[1]; double cp2 = i_cpara[2]; double cp4 = i_cpara[4]; double cp5 = i_cpara[5]; double cp7 = i_cpara[7]; int pick_y = this._lt_ref.y; int pick_x = this._lt_ref.x; //ピクセルリーダーを取得 INyARRgbPixelReader reader = image.getRgbPixelReader(); int p = 0; for (int iy = 0; iy < this._size_ref.h * resolution; iy += resolution) { w = pick_y + iy; cp1cy_cp2[0] = cp1 * w + cp2; cp4cy_cp5[0] = cp4 * w + cp5; cp7cy_1[0] = cp7 * w + 1.0; for (i2y = 1; i2y < resolution; i2y++) { cp1cy_cp2[i2y] = cp1cy_cp2[i2y - 1] + cp1; cp4cy_cp5[i2y] = cp4cy_cp5[i2y - 1] + cp4; cp7cy_1[i2y] = cp7cy_1[i2y - 1] + cp7; } //解像度分の点を取る。 for (int ix = 0; ix < this._size_ref.w * resolution; ix += resolution) { int n = 0; w = pick_x + ix; for (i2y = resolution - 1; i2y >= 0; i2y--) { double cp0cx = cp0 * w + cp1cy_cp2[i2y]; double cp6cx = cp6 * w + cp7cy_1[i2y]; double cp3cx = cp3 * w + cp4cy_cp5[i2y]; double m = 1 / (cp6cx); double d = -cp6 / (cp6cx * (cp6cx + cp6)); double m2 = cp0cx * m; double m3 = cp3cx * m; double d2 = cp0cx * d + cp0 * (m + d); double d3 = cp3cx * d + cp3 * (m + d); for (i2x = resolution - 1; i2x >= 0; i2x--) { //1ピクセルを作成 x = rgb_px[n] = (int)(m2); y = rgb_py[n] = (int)(m3); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[n] = 0; } else if (x >= img_x) { rgb_px[n] = img_x - 1; } if (y < 0) { rgb_py[n] = 0; } else if (y >= img_y) { rgb_py[n] = img_y - 1; } } n++; m2 += d2; m3 += d3; } } reader.getPixelSet(rgb_px, rgb_py, res_pix, rgb_tmp); r = g = b = 0; for (int i = res_pix * 3 - 1; i > 0; ) { b += rgb_tmp[i--]; g += rgb_tmp[i--]; r += rgb_tmp[i--]; } r /= res_pix; g /= res_pix; b /= res_pix; o_patt[p] = ((r & 0xff) << 16) | ((g & 0xff) << 8) | ((b & 0xff)); p++; } } return; }
/** * @see INyARColorPatt#pickFromRaster */ public virtual bool pickFromRaster(INyARRgbRaster image,NyARIntPoint2d[] i_vertexs) { //遠近法のパラメータを計算 double[] cpara = this.__pickFromRaster_cpara; if (!this._perspective_gen.getParam(i_vertexs, cpara)) { return false; } int resolution=this._resolution; int img_x = image.getWidth(); int img_y = image.getHeight(); int res_pix=resolution*resolution; int[] rgb_tmp = this.__pickFromRaster_rgb_tmp; //ピクセルリーダーを取得 INyARRgbPixelReader reader=image.getRgbPixelReader(); int p=0; for(int iy=0;iy<this._size.h*resolution;iy+=resolution){ //解像度分の点を取る。 for(int ix=0;ix<this._size.w*resolution;ix+=resolution){ int r,g,b; r=g=b=0; for(int i2y=iy;i2y<iy+resolution;i2y++){ int cy=this._pickup_lt.y+i2y; for(int i2x=ix;i2x<ix+resolution;i2x++){ //1ピクセルを作成 int cx=this._pickup_lt.x+i2x; double d=cpara[6]*cx+cpara[7]*cy+1.0; int x=(int)((cpara[0]*cx+cpara[1]*cy+cpara[2])/d); int y=(int)((cpara[3]*cx+cpara[4]*cy+cpara[5])/d); if(x<0){x=0;} if(x>=img_x){x=img_x-1;} if(y<0){y=0;} if(y>=img_y){y=img_y-1;} reader.getPixel(x, y, rgb_tmp); r+=rgb_tmp[0]; g+=rgb_tmp[1]; b+=rgb_tmp[2]; } } r/=res_pix; g/=res_pix; b/=res_pix; this._patdata[p]=((r&0xff)<<16)|((g&0xff)<<8)|((b&0xff)); p++; } } //ピクセル問い合わせ //ピクセルセット return true; }
public void pickFromRaster(double[] i_cpara, INyARRgbRaster image, int[] o_patt) { double d0, m0, d1, m1; int x, y; int img_x = image.getWidth(); int img_y = image.getHeight(); int patt_w = this._size_ref.w; int[] rgb_tmp = this._rgb_temp; int[] rgb_px = this._rgb_px; int[] rgb_py = this._rgb_py; double cp0 = i_cpara[0]; double cp3 = i_cpara[3]; double cp6 = i_cpara[6]; double cp1 = i_cpara[1]; double cp4 = i_cpara[4]; double cp7 = i_cpara[7]; int pick_y = this._lt_ref.y; int pick_x = this._lt_ref.x; //ピクセルリーダーを取得 INyARRgbPixelReader reader = image.getRgbPixelReader(); int p = 0; double cp0cx0, cp3cx0; double cp1cy_cp20 = cp1 * pick_y + i_cpara[2] + cp0 * pick_x; double cp4cy_cp50 = cp4 * pick_y + i_cpara[5] + cp3 * pick_x; double cp7cy_10 = cp7 * pick_y + 1.0 + cp6 * pick_x; double cp0cx1, cp3cx1; double cp1cy_cp21 = cp1cy_cp20 + cp1; double cp4cy_cp51 = cp4cy_cp50 + cp4; double cp7cy_11 = cp7cy_10 + cp7; double cw0 = cp1 + cp1; double cw7 = cp7 + cp7; double cw4 = cp4 + cp4; for (int iy = this._size_ref.h - 1; iy >= 0; iy--) { cp0cx0 = cp1cy_cp20; cp3cx0 = cp4cy_cp50; cp0cx1 = cp1cy_cp21; cp3cx1 = cp4cy_cp51; m0 = 1 / (cp7cy_10); d0 = -cp6 / (cp7cy_10 * (cp7cy_10 + cp6)); m1 = 1 / (cp7cy_11); d1 = -cp6 / (cp7cy_11 * (cp7cy_11 + cp6)); int n = patt_w * 2 * 2 - 1; for (int ix = patt_w * 2 - 1; ix >= 0; ix--) { //[n,0] x = rgb_px[n] = (int)(cp0cx0 * m0); y = rgb_py[n] = (int)(cp3cx0 * m0); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[n] = 0; } else if (x >= img_x) { rgb_px[n] = img_x - 1; } if (y < 0) { rgb_py[n] = 0; } else if (y >= img_y) { rgb_py[n] = img_y - 1; } } cp0cx0 += cp0; cp3cx0 += cp3; m0 += d0; n--; //[n,1] x = rgb_px[n] = (int)(cp0cx1 * m1); y = rgb_py[n] = (int)(cp3cx1 * m1); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[n] = 0; } else if (x >= img_x) { rgb_px[n] = img_x - 1; } if (y < 0) { rgb_py[n] = 0; } else if (y >= img_y) { rgb_py[n] = img_y - 1; } } cp0cx1 += cp0; cp3cx1 += cp3; m1 += d1; n--; } cp7cy_10 += cw7; cp7cy_11 += cw7; cp1cy_cp20 += cw0; cp4cy_cp50 += cw4; cp1cy_cp21 += cw0; cp4cy_cp51 += cw4; reader.getPixelSet(rgb_px, rgb_py, patt_w * 4, rgb_tmp); for (int ix = patt_w - 1; ix >= 0; ix--) { int idx = ix * 12;//3*2*2 int r = (rgb_tmp[idx + 0] + rgb_tmp[idx + 3] + rgb_tmp[idx + 6] + rgb_tmp[idx + 9]) / 4; int g = (rgb_tmp[idx + 1] + rgb_tmp[idx + 4] + rgb_tmp[idx + 7] + rgb_tmp[idx + 10]) / 4; int b = (rgb_tmp[idx + 2] + rgb_tmp[idx + 5] + rgb_tmp[idx + 8] + rgb_tmp[idx + 11]) / 4; o_patt[p] = (r << 16) | (g << 8) | ((b & 0xff)); p++; } } return; }
public void pickFromRaster(double[] i_cpara, INyARRgbRaster image, int[] o_patt) { int x, y; double d, m; double cp6cx, cp0cx, cp3cx; int[] rgb_px = this._rgb_px; int[] rgb_py = this._rgb_py; int r, g, b; //遠近法のパラメータを計算 int img_x = image.getWidth(); int img_y = image.getHeight(); int[] rgb_tmp = this._rgb_temp; double cp0 = i_cpara[0]; double cp3 = i_cpara[3]; double cp6 = i_cpara[6]; double cp1 = i_cpara[1]; double cp2 = i_cpara[2]; double cp4 = i_cpara[4]; double cp5 = i_cpara[5]; double cp7 = i_cpara[7]; int pick_lt_x = this._lt_ref.x; //ピクセルリーダーを取得 INyARRgbPixelReader reader = image.getRgbPixelReader(); int p = 0; int py = this._lt_ref.y; for (int iy = this._size_ref.h - 1; iy >= 0; iy--, py += 4) { double cp1cy_cp2_0 = cp1 * py + cp2; double cp4cy_cp5_0 = cp4 * py + cp5; double cp7cy_1_0 = cp7 * py + 1.0; double cp1cy_cp2_1 = cp1cy_cp2_0 + cp1; double cp1cy_cp2_2 = cp1cy_cp2_1 + cp1; double cp1cy_cp2_3 = cp1cy_cp2_2 + cp1; double cp4cy_cp5_1 = cp4cy_cp5_0 + cp4; double cp4cy_cp5_2 = cp4cy_cp5_1 + cp4; double cp4cy_cp5_3 = cp4cy_cp5_2 + cp4; int px = pick_lt_x; //解像度分の点を取る。 for (int ix = this._size_ref.w - 1; ix >= 0; ix--, px += 4) { cp6cx = cp6 * px; cp0cx = cp0 * px; cp3cx = cp3 * px; cp6cx += cp7cy_1_0; m = 1 / cp6cx; d = -cp7 / ((cp6cx + cp7) * cp6cx); //1ピクセルを作成[0,0] x = rgb_px[0] = (int)((cp0cx + cp1cy_cp2_0) * m); y = rgb_py[0] = (int)((cp3cx + cp4cy_cp5_0) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[0] = 0; } else if (x >= img_x) { rgb_px[0] = img_x - 1; } if (y < 0) { rgb_py[0] = 0; } else if (y >= img_y) { rgb_py[0] = img_y - 1; } } //1ピクセルを作成[0,1] m += d; x = rgb_px[4] = (int)((cp0cx + cp1cy_cp2_1) * m); y = rgb_py[4] = (int)((cp3cx + cp4cy_cp5_1) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[4] = 0; } else if (x >= img_x) { rgb_px[4] = img_x - 1; } if (y < 0) { rgb_py[4] = 0; } else if (y >= img_y) { rgb_py[4] = img_y - 1; } } //1ピクセルを作成[0,2] m += d; x = rgb_px[8] = (int)((cp0cx + cp1cy_cp2_2) * m); y = rgb_py[8] = (int)((cp3cx + cp4cy_cp5_2) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[8] = 0; } else if (x >= img_x) { rgb_px[8] = img_x - 1; } if (y < 0) { rgb_py[8] = 0; } else if (y >= img_y) { rgb_py[8] = img_y - 1; } } //1ピクセルを作成[0,3] m += d; x = rgb_px[12] = (int)((cp0cx + cp1cy_cp2_3) * m); y = rgb_py[12] = (int)((cp3cx + cp4cy_cp5_3) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[12] = 0; } else if (x >= img_x) { rgb_px[12] = img_x - 1; } if (y < 0) { rgb_py[12] = 0; } else if (y >= img_y) { rgb_py[12] = img_y - 1; } } cp6cx += cp6; cp0cx += cp0; cp3cx += cp3; m = 1 / cp6cx; d = -cp7 / ((cp6cx + cp7) * cp6cx); //1ピクセルを作成[1,0] x = rgb_px[1] = (int)((cp0cx + cp1cy_cp2_0) * m); y = rgb_py[1] = (int)((cp3cx + cp4cy_cp5_0) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[1] = 0; } else if (x >= img_x) { rgb_px[1] = img_x - 1; } if (y < 0) { rgb_py[1] = 0; } else if (y >= img_y) { rgb_py[1] = img_y - 1; } } //1ピクセルを作成[1,1] m += d; x = rgb_px[5] = (int)((cp0cx + cp1cy_cp2_1) * m); y = rgb_py[5] = (int)((cp3cx + cp4cy_cp5_1) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[5] = 0; } else if (x >= img_x) { rgb_px[5] = img_x - 1; } if (y < 0) { rgb_py[5] = 0; } else if (y >= img_y) { rgb_py[5] = img_y - 1; } } //1ピクセルを作成[1,2] m += d; x = rgb_px[9] = (int)((cp0cx + cp1cy_cp2_2) * m); y = rgb_py[9] = (int)((cp3cx + cp4cy_cp5_2) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[9] = 0; } else if (x >= img_x) { rgb_px[9] = img_x - 1; } if (y < 0) { rgb_py[9] = 0; } else if (y >= img_y) { rgb_py[9] = img_y - 1; } } //1ピクセルを作成[1,3] m += d; x = rgb_px[13] = (int)((cp0cx + cp1cy_cp2_3) * m); y = rgb_py[13] = (int)((cp3cx + cp4cy_cp5_3) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[13] = 0; } else if (x >= img_x) { rgb_px[13] = img_x - 1; } if (y < 0) { rgb_py[13] = 0; } else if (y >= img_y) { rgb_py[13] = img_y - 1; } } cp6cx += cp6; cp0cx += cp0; cp3cx += cp3; m = 1 / cp6cx; d = -cp7 / ((cp6cx + cp7) * cp6cx); //1ピクセルを作成[2,0] x = rgb_px[2] = (int)((cp0cx + cp1cy_cp2_0) * m); y = rgb_py[2] = (int)((cp3cx + cp4cy_cp5_0) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[2] = 0; } else if (x >= img_x) { rgb_px[2] = img_x - 1; } if (y < 0) { rgb_py[2] = 0; } else if (y >= img_y) { rgb_py[2] = img_y - 1; } } //1ピクセルを作成[2,1] m += d; x = rgb_px[6] = (int)((cp0cx + cp1cy_cp2_1) * m); y = rgb_py[6] = (int)((cp3cx + cp4cy_cp5_1) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[6] = 0; } else if (x >= img_x) { rgb_px[6] = img_x - 1; } if (y < 0) { rgb_py[6] = 0; } else if (y >= img_y) { rgb_py[6] = img_y - 1; } } //1ピクセルを作成[2,2] m += d; x = rgb_px[10] = (int)((cp0cx + cp1cy_cp2_2) * m); y = rgb_py[10] = (int)((cp3cx + cp4cy_cp5_2) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[10] = 0; } else if (x >= img_x) { rgb_px[10] = img_x - 1; } if (y < 0) { rgb_py[10] = 0; } else if (y >= img_y) { rgb_py[10] = img_y - 1; } } //1ピクセルを作成[2,3](ここ計算ずれします。) m += d; x = rgb_px[14] = (int)((cp0cx + cp1cy_cp2_3) * m); y = rgb_py[14] = (int)((cp3cx + cp4cy_cp5_3) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[14] = 0; } else if (x >= img_x) { rgb_px[14] = img_x - 1; } if (y < 0) { rgb_py[14] = 0; } else if (y >= img_y) { rgb_py[14] = img_y - 1; } } cp6cx += cp6; cp0cx += cp0; cp3cx += cp3; m = 1 / cp6cx; d = -cp7 / ((cp6cx + cp7) * cp6cx); //1ピクセルを作成[3,0] x = rgb_px[3] = (int)((cp0cx + cp1cy_cp2_0) * m); y = rgb_py[3] = (int)((cp3cx + cp4cy_cp5_0) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[3] = 0; } else if (x >= img_x) { rgb_px[3] = img_x - 1; } if (y < 0) { rgb_py[3] = 0; } else if (y >= img_y) { rgb_py[3] = img_y - 1; } } //1ピクセルを作成[3,1] m += d; x = rgb_px[7] = (int)((cp0cx + cp1cy_cp2_1) * m); y = rgb_py[7] = (int)((cp3cx + cp4cy_cp5_1) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[7] = 0; } else if (x >= img_x) { rgb_px[7] = img_x - 1; } if (y < 0) { rgb_py[7] = 0; } else if (y >= img_y) { rgb_py[7] = img_y - 1; } } //1ピクセルを作成[3,2] m += d; x = rgb_px[11] = (int)((cp0cx + cp1cy_cp2_2) * m); y = rgb_py[11] = (int)((cp3cx + cp4cy_cp5_2) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[11] = 0; } else if (x >= img_x) { rgb_px[11] = img_x - 1; } if (y < 0) { rgb_py[11] = 0; } else if (y >= img_y) { rgb_py[11] = img_y - 1; } } //1ピクセルを作成[3,3] m += d; x = rgb_px[15] = (int)((cp0cx + cp1cy_cp2_3) * m); y = rgb_py[15] = (int)((cp3cx + cp4cy_cp5_3) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[15] = 0; } else if (x >= img_x) { rgb_px[15] = img_x - 1; } if (y < 0) { rgb_py[15] = 0; } else if (y >= img_y) { rgb_py[15] = img_y - 1; } } reader.getPixelSet(rgb_px, rgb_py, 4 * 4, rgb_tmp); r = (rgb_tmp[0] + rgb_tmp[3] + rgb_tmp[6] + rgb_tmp[9] + rgb_tmp[12] + rgb_tmp[15] + rgb_tmp[18] + rgb_tmp[21] + rgb_tmp[24] + rgb_tmp[27] + rgb_tmp[30] + rgb_tmp[33] + rgb_tmp[36] + rgb_tmp[39] + rgb_tmp[42] + rgb_tmp[45]) / 16; g = (rgb_tmp[1] + rgb_tmp[4] + rgb_tmp[7] + rgb_tmp[10] + rgb_tmp[13] + rgb_tmp[16] + rgb_tmp[19] + rgb_tmp[22] + rgb_tmp[25] + rgb_tmp[28] + rgb_tmp[31] + rgb_tmp[34] + rgb_tmp[37] + rgb_tmp[40] + rgb_tmp[43] + rgb_tmp[46]) / 16; b = (rgb_tmp[2] + rgb_tmp[5] + rgb_tmp[8] + rgb_tmp[11] + rgb_tmp[14] + rgb_tmp[17] + rgb_tmp[20] + rgb_tmp[23] + rgb_tmp[26] + rgb_tmp[29] + rgb_tmp[32] + rgb_tmp[35] + rgb_tmp[38] + rgb_tmp[41] + rgb_tmp[44] + rgb_tmp[47]) / 16; o_patt[p] = ((r & 0xff) << 16) | ((g & 0xff) << 8) | ((b & 0xff)); p++; } } return; }
/** * 回転方向を指定してラスタをセットします。 * @param i_reader * @param i_direction * 右上の位置です。0=1象限、1=2象限、、2=3象限、、3=4象限の位置に対応します。 * @throws NyARException */ public void setRaster(INyARRgbRaster i_raster, int i_direction) { int width = this._size.w; int height = this._size.h; int i_number_of_pix = width * height; INyARRgbPixelReader reader = i_raster.getRgbPixelReader(); int[] rgb = new int[3]; int[] dout = this._data; int ave; //<PV/> //<平均値計算> ave = 0; for (int y = height - 1; y >= 0; y--) { for (int x = width - 1; x >= 0; x--) { reader.getPixel(x, y, rgb); ave += rgb[0] + rgb[1] + rgb[2]; } } //<平均値計算> ave = i_number_of_pix * 255 * 3 - ave; ave = 255 - (ave / (i_number_of_pix * 3)); //(255-R)-ave を分解するための事前計算 int sum = 0, w_sum; int input_ptr = i_number_of_pix * 3 - 1; switch (i_direction) { case 0: for (int y = height - 1; y >= 0; y--) { for (int x = width - 1; x >= 0; x--) { reader.getPixel(x, y, rgb); w_sum = (ave - rgb[2]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //B w_sum = (ave - rgb[1]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //G w_sum = (ave - rgb[0]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //R } } break; case 1: for (int x = 0; x < width; x++) { for (int y = height - 1; y >= 0; y--) { reader.getPixel(x, y, rgb); w_sum = (ave - rgb[2]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //B w_sum = (ave - rgb[1]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //G w_sum = (ave - rgb[0]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //R } } break; case 2: for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { reader.getPixel(x, y, rgb); w_sum = (ave - rgb[2]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //B w_sum = (ave - rgb[1]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //G w_sum = (ave - rgb[0]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //R } } break; case 3: for (int x = width - 1; x >= 0; x--) { for (int y = 0; y < height; y++) { reader.getPixel(x, y, rgb); w_sum = (ave - rgb[2]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //B w_sum = (ave - rgb[1]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //G w_sum = (ave - rgb[0]); dout[input_ptr--] = w_sum; sum += w_sum * w_sum; //R } } break; } //<差分値計算> //<差分値計算(FORの1/8展開)/> double p = Math.Sqrt((double)sum); this._pow = (p != 0.0?p:0.0000001); }
public void pickFromRaster(double[] i_cpara, INyARRgbRaster image, int[] o_patt) { double d0, m0; int x, y; int img_x = image.getWidth(); int img_y = image.getHeight(); int patt_w = this._size_ref.w; int[] rgb_tmp = this._rgb_temp; int[] rgb_px = this._rgb_px; int[] rgb_py = this._rgb_py; double cp0 = i_cpara[0]; double cp3 = i_cpara[3]; double cp6 = i_cpara[6]; double cp1 = i_cpara[1]; double cp4 = i_cpara[4]; double cp7 = i_cpara[7]; int pick_y = this._lt_ref.y; int pick_x = this._lt_ref.x; //ピクセルリーダーを取得 INyARRgbPixelReader reader = image.getRgbPixelReader(); int p = 0; double cp0cx0, cp3cx0; double cp1cy_cp20 = cp1 * pick_y + i_cpara[2] + cp0 * pick_x; double cp4cy_cp50 = cp4 * pick_y + i_cpara[5] + cp3 * pick_x; double cp7cy_10 = cp7 * pick_y + 1.0 + cp6 * pick_x; for (int iy = this._size_ref.h - 1; iy >= 0; iy--) { m0 = 1 / (cp7cy_10); d0 = -cp6 / (cp7cy_10 * (cp7cy_10 + cp6)); cp0cx0 = cp1cy_cp20; cp3cx0 = cp4cy_cp50; //ピックアップシーケンス //0番目のピクセル(検査対象)をピックアップ for (int ix = patt_w - 1; ix >= 0; ix--) { //1ピクセルを作成 x = rgb_px[ix] = (int)(cp0cx0 * m0); y = rgb_py[ix] = (int)(cp3cx0 * m0); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[ix] = 0; } else if (x >= img_x) { rgb_px[ix] = img_x - 1; } if (y < 0) { rgb_py[ix] = 0; } else if (y >= img_y) { rgb_py[ix] = img_y - 1; } } cp0cx0 += cp0; cp3cx0 += cp3; m0 += d0; } cp1cy_cp20 += cp1; cp4cy_cp50 += cp4; cp7cy_10 += cp7; reader.getPixelSet(rgb_px, rgb_py, patt_w, rgb_tmp); for (int ix = patt_w - 1; ix >= 0; ix--) { int idx = ix * 3; o_patt[p] = (rgb_tmp[idx] << 16) | (rgb_tmp[idx + 1] << 8) | ((rgb_tmp[idx + 2] & 0xff)); p++; } } return; }
public void pickFromRaster(double[] i_cpara, INyARRgbRaster image, int[] o_patt) { int i2x, i2y;//プライム変数 int x, y; int w; int r, g, b; int resolution = this._resolution; int res_pix = resolution * resolution; int img_x = image.getWidth(); int img_y = image.getHeight(); int[] rgb_tmp = this._rgb_temp; int[] rgb_px = this._rgb_px; int[] rgb_py = this._rgb_py; double[] cp1cy_cp2 = this._cp1cy_cp2; double[] cp4cy_cp5 = this._cp4cy_cp5; double[] cp7cy_1 = this._cp7cy_1; double cp0 = i_cpara[0]; double cp3 = i_cpara[3]; double cp6 = i_cpara[6]; double cp1 = i_cpara[1]; double cp2 = i_cpara[2]; double cp4 = i_cpara[4]; double cp5 = i_cpara[5]; double cp7 = i_cpara[7]; int pick_y = this._lt_ref.y; int pick_x = this._lt_ref.x; //ピクセルリーダーを取得 INyARRgbPixelReader reader = image.getRgbPixelReader(); int p = 0; for (int iy = 0; iy < this._size_ref.h * resolution; iy += resolution) { w = pick_y + iy; cp1cy_cp2[0] = cp1 * w + cp2; cp4cy_cp5[0] = cp4 * w + cp5; cp7cy_1[0] = cp7 * w + 1.0; for (i2y = 1; i2y < resolution; i2y++) { cp1cy_cp2[i2y] = cp1cy_cp2[i2y - 1] + cp1; cp4cy_cp5[i2y] = cp4cy_cp5[i2y - 1] + cp4; cp7cy_1[i2y] = cp7cy_1[i2y - 1] + cp7; } //解像度分の点を取る。 for (int ix = 0; ix < this._size_ref.w * resolution; ix += resolution) { int n = 0; w = pick_x + ix; for (i2y = resolution - 1; i2y >= 0; i2y--) { double cp0cx = cp0 * w + cp1cy_cp2[i2y]; double cp6cx = cp6 * w + cp7cy_1[i2y]; double cp3cx = cp3 * w + cp4cy_cp5[i2y]; double m = 1 / (cp6cx); double d = -cp6 / (cp6cx * (cp6cx + cp6)); double m2 = cp0cx * m; double m3 = cp3cx * m; double d2 = cp0cx * d + cp0 * (m + d); double d3 = cp3cx * d + cp3 * (m + d); for (i2x = resolution - 1; i2x >= 0; i2x--) { //1ピクセルを作成 x = rgb_px[n] = (int)(m2); y = rgb_py[n] = (int)(m3); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[n] = 0; } else if (x >= img_x) { rgb_px[n] = img_x - 1; } if (y < 0) { rgb_py[n] = 0; } else if (y >= img_y) { rgb_py[n] = img_y - 1; } } n++; m2 += d2; m3 += d3; } } reader.getPixelSet(rgb_px, rgb_py, res_pix, rgb_tmp); r = g = b = 0; for (int i = res_pix * 3 - 1; i > 0;) { b += rgb_tmp[i--]; g += rgb_tmp[i--]; r += rgb_tmp[i--]; } r /= res_pix; g /= res_pix; b /= res_pix; o_patt[p] = ((r & 0xff) << 16) | ((g & 0xff) << 8) | ((b & 0xff)); p++; } } return; }
//分割数16未満になると少し遅くなるかも。 private void updateExtpat(INyARRgbRaster image, NyARMat i_cpara, int i_xdiv2, int i_ydiv2) { int i, j; int r, g, b; //ピクセルリーダーを取得 int pat_size_w = this._size.w; int xdiv = i_xdiv2 / pat_size_w;// xdiv = xdiv2/Config.AR_PATT_SIZE_X; int ydiv = i_ydiv2 / this._size.h;// ydiv = ydiv2/Config.AR_PATT_SIZE_Y; int xdiv_x_ydiv = xdiv * ydiv; double reciprocal; double[][] para = i_cpara.getArray(); double para00 = para[0 * 3 + 0][0]; double para01 = para[0 * 3 + 1][0]; double para02 = para[0 * 3 + 2][0]; double para10 = para[1 * 3 + 0][0]; double para11 = para[1 * 3 + 1][0]; double para12 = para[1 * 3 + 2][0]; double para20 = para[2 * 3 + 0][0]; double para21 = para[2 * 3 + 1][0]; INyARRgbPixelReader reader = image.getRgbPixelReader(); int img_width = image.getWidth(); int img_height = image.getHeight(); //ワークバッファの準備 reservWorkBuffers(xdiv, ydiv); double[] xw = this.__updateExtpat_xw; double[] yw = this.__updateExtpat_yw; int[] xc = this.__updateExtpat_xc; int[] yc = this.__updateExtpat_yc; int[] rgb_set = this.__updateExtpat_rgbset; for (int iy = this._size.h - 1; iy >= 0; iy--) { for (int ix = pat_size_w - 1; ix >= 0; ix--) { //xw,ywマップを作成 reciprocal = 1.0 / i_xdiv2; for (i = xdiv - 1; i >= 0; i--) { xw[i] = LT_POS + SQ_SIZE * (ix * xdiv + i + 0.5) * reciprocal; } reciprocal = 1.0 / i_ydiv2; for (i = ydiv - 1; i >= 0; i--) { yw[i] = LT_POS + SQ_SIZE * (iy * ydiv + i + 0.5) * reciprocal; } //1ピクセルを構成するピクセル座標の集合をxc,yc配列に取得 int number_of_pix = 0; for (i = ydiv - 1; i >= 0; i--) { double para01_x_yw_para02 = para01 * yw[i] + para02; double para11_x_yw_para12 = para11 * yw[i] + para12; double para12_x_yw_para22 = para21 * yw[i] + 1.0; for (j = xdiv - 1; j >= 0; j--) { double d = para20 * xw[j] + para12_x_yw_para22; if (d == 0) { throw new NyARException(); } int xcw = (int)((para00 * xw[j] + para01_x_yw_para02) / d); int ycw = (int)((para10 * xw[j] + para11_x_yw_para12) / d); if (xcw < 0 || xcw >= img_width || ycw < 0 || ycw >= img_height) { continue; } xc[number_of_pix] = xcw; yc[number_of_pix] = ycw; number_of_pix++; } } //1ピクセル分の配列を取得 reader.getPixelSet(xc, yc, number_of_pix, rgb_set); r = g = b = 0; for (i = number_of_pix * 3 - 1; i >= 0; i -= 3) { r += rgb_set[i - 2];// R g += rgb_set[i - 1];// G b += rgb_set[i];// B } //1ピクセル確定 this._patdata[iy * pat_size_w + ix] = (((r / xdiv_x_ydiv) & 0xff) << 16) | (((g / xdiv_x_ydiv) & 0xff) << 8) | (((b / xdiv_x_ydiv) & 0xff)); } } return; }
public void pickFromRaster(double[] i_cpara, INyARRgbRaster image, int[] o_patt) { int x, y; double d, m; double cp6cx, cp0cx, cp3cx; int[] rgb_px = this._rgb_px; int[] rgb_py = this._rgb_py; int r, g, b; //遠近法のパラメータを計算 int img_x = image.getWidth(); int img_y = image.getHeight(); int[] rgb_tmp = this._rgb_temp; double cp0 = i_cpara[0]; double cp3 = i_cpara[3]; double cp6 = i_cpara[6]; double cp1 = i_cpara[1]; double cp2 = i_cpara[2]; double cp4 = i_cpara[4]; double cp5 = i_cpara[5]; double cp7 = i_cpara[7]; int pick_lt_x = this._lt_ref.x; //ピクセルリーダーを取得 INyARRgbPixelReader reader = image.getRgbPixelReader(); int p = 0; int py = this._lt_ref.y; for (int iy = this._size_ref.h - 1; iy >= 0; iy--, py += 4) { double cp1cy_cp2_0 = cp1 * py + cp2; double cp4cy_cp5_0 = cp4 * py + cp5; double cp7cy_1_0 = cp7 * py + 1.0; double cp1cy_cp2_1 = cp1cy_cp2_0 + cp1; double cp1cy_cp2_2 = cp1cy_cp2_1 + cp1; double cp1cy_cp2_3 = cp1cy_cp2_2 + cp1; double cp4cy_cp5_1 = cp4cy_cp5_0 + cp4; double cp4cy_cp5_2 = cp4cy_cp5_1 + cp4; double cp4cy_cp5_3 = cp4cy_cp5_2 + cp4; int px = pick_lt_x; //解像度分の点を取る。 for (int ix = this._size_ref.w - 1; ix >= 0; ix--, px += 4) { cp6cx = cp6 * px; cp0cx = cp0 * px; cp3cx = cp3 * px; cp6cx += cp7cy_1_0; m = 1 / cp6cx; d = -cp7 / ((cp6cx + cp7) * cp6cx); //1ピクセルを作成[0,0] x = rgb_px[0] = (int)((cp0cx + cp1cy_cp2_0) * m); y = rgb_py[0] = (int)((cp3cx + cp4cy_cp5_0) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[0] = 0; } else if (x >= img_x) { rgb_px[0] = img_x - 1; } if (y < 0) { rgb_py[0] = 0; } else if (y >= img_y) { rgb_py[0] = img_y - 1; } } //1ピクセルを作成[0,1] m += d; x = rgb_px[4] = (int)((cp0cx + cp1cy_cp2_1) * m); y = rgb_py[4] = (int)((cp3cx + cp4cy_cp5_1) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[4] = 0; } else if (x >= img_x) { rgb_px[4] = img_x - 1; } if (y < 0) { rgb_py[4] = 0; } else if (y >= img_y) { rgb_py[4] = img_y - 1; } } //1ピクセルを作成[0,2] m += d; x = rgb_px[8] = (int)((cp0cx + cp1cy_cp2_2) * m); y = rgb_py[8] = (int)((cp3cx + cp4cy_cp5_2) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[8] = 0; } else if (x >= img_x) { rgb_px[8] = img_x - 1; } if (y < 0) { rgb_py[8] = 0; } else if (y >= img_y) { rgb_py[8] = img_y - 1; } } //1ピクセルを作成[0,3] m += d; x = rgb_px[12] = (int)((cp0cx + cp1cy_cp2_3) * m); y = rgb_py[12] = (int)((cp3cx + cp4cy_cp5_3) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[12] = 0; } else if (x >= img_x) { rgb_px[12] = img_x - 1; } if (y < 0) { rgb_py[12] = 0; } else if (y >= img_y) { rgb_py[12] = img_y - 1; } } cp6cx += cp6; cp0cx += cp0; cp3cx += cp3; m = 1 / cp6cx; d = -cp7 / ((cp6cx + cp7) * cp6cx); //1ピクセルを作成[1,0] x = rgb_px[1] = (int)((cp0cx + cp1cy_cp2_0) * m); y = rgb_py[1] = (int)((cp3cx + cp4cy_cp5_0) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[1] = 0; } else if (x >= img_x) { rgb_px[1] = img_x - 1; } if (y < 0) { rgb_py[1] = 0; } else if (y >= img_y) { rgb_py[1] = img_y - 1; } } //1ピクセルを作成[1,1] m += d; x = rgb_px[5] = (int)((cp0cx + cp1cy_cp2_1) * m); y = rgb_py[5] = (int)((cp3cx + cp4cy_cp5_1) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[5] = 0; } else if (x >= img_x) { rgb_px[5] = img_x - 1; } if (y < 0) { rgb_py[5] = 0; } else if (y >= img_y) { rgb_py[5] = img_y - 1; } } //1ピクセルを作成[1,2] m += d; x = rgb_px[9] = (int)((cp0cx + cp1cy_cp2_2) * m); y = rgb_py[9] = (int)((cp3cx + cp4cy_cp5_2) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[9] = 0; } else if (x >= img_x) { rgb_px[9] = img_x - 1; } if (y < 0) { rgb_py[9] = 0; } else if (y >= img_y) { rgb_py[9] = img_y - 1; } } //1ピクセルを作成[1,3] m += d; x = rgb_px[13] = (int)((cp0cx + cp1cy_cp2_3) * m); y = rgb_py[13] = (int)((cp3cx + cp4cy_cp5_3) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[13] = 0; } else if (x >= img_x) { rgb_px[13] = img_x - 1; } if (y < 0) { rgb_py[13] = 0; } else if (y >= img_y) { rgb_py[13] = img_y - 1; } } cp6cx += cp6; cp0cx += cp0; cp3cx += cp3; m = 1 / cp6cx; d = -cp7 / ((cp6cx + cp7) * cp6cx); //1ピクセルを作成[2,0] x = rgb_px[2] = (int)((cp0cx + cp1cy_cp2_0) * m); y = rgb_py[2] = (int)((cp3cx + cp4cy_cp5_0) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[2] = 0; } else if (x >= img_x) { rgb_px[2] = img_x - 1; } if (y < 0) { rgb_py[2] = 0; } else if (y >= img_y) { rgb_py[2] = img_y - 1; } } //1ピクセルを作成[2,1] m += d; x = rgb_px[6] = (int)((cp0cx + cp1cy_cp2_1) * m); y = rgb_py[6] = (int)((cp3cx + cp4cy_cp5_1) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[6] = 0; } else if (x >= img_x) { rgb_px[6] = img_x - 1; } if (y < 0) { rgb_py[6] = 0; } else if (y >= img_y) { rgb_py[6] = img_y - 1; } } //1ピクセルを作成[2,2] m += d; x = rgb_px[10] = (int)((cp0cx + cp1cy_cp2_2) * m); y = rgb_py[10] = (int)((cp3cx + cp4cy_cp5_2) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[10] = 0; } else if (x >= img_x) { rgb_px[10] = img_x - 1; } if (y < 0) { rgb_py[10] = 0; } else if (y >= img_y) { rgb_py[10] = img_y - 1; } } //1ピクセルを作成[2,3](ここ計算ずれします。) m += d; x = rgb_px[14] = (int)((cp0cx + cp1cy_cp2_3) * m); y = rgb_py[14] = (int)((cp3cx + cp4cy_cp5_3) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[14] = 0; } else if (x >= img_x) { rgb_px[14] = img_x - 1; } if (y < 0) { rgb_py[14] = 0; } else if (y >= img_y) { rgb_py[14] = img_y - 1; } } cp6cx += cp6; cp0cx += cp0; cp3cx += cp3; m = 1 / cp6cx; d = -cp7 / ((cp6cx + cp7) * cp6cx); //1ピクセルを作成[3,0] x = rgb_px[3] = (int)((cp0cx + cp1cy_cp2_0) * m); y = rgb_py[3] = (int)((cp3cx + cp4cy_cp5_0) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[3] = 0; } else if (x >= img_x) { rgb_px[3] = img_x - 1; } if (y < 0) { rgb_py[3] = 0; } else if (y >= img_y) { rgb_py[3] = img_y - 1; } } //1ピクセルを作成[3,1] m += d; x = rgb_px[7] = (int)((cp0cx + cp1cy_cp2_1) * m); y = rgb_py[7] = (int)((cp3cx + cp4cy_cp5_1) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[7] = 0; } else if (x >= img_x) { rgb_px[7] = img_x - 1; } if (y < 0) { rgb_py[7] = 0; } else if (y >= img_y) { rgb_py[7] = img_y - 1; } } //1ピクセルを作成[3,2] m += d; x = rgb_px[11] = (int)((cp0cx + cp1cy_cp2_2) * m); y = rgb_py[11] = (int)((cp3cx + cp4cy_cp5_2) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[11] = 0; } else if (x >= img_x) { rgb_px[11] = img_x - 1; } if (y < 0) { rgb_py[11] = 0; } else if (y >= img_y) { rgb_py[11] = img_y - 1; } } //1ピクセルを作成[3,3] m += d; x = rgb_px[15] = (int)((cp0cx + cp1cy_cp2_3) * m); y = rgb_py[15] = (int)((cp3cx + cp4cy_cp5_3) * m); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[15] = 0; } else if (x >= img_x) { rgb_px[15] = img_x - 1; } if (y < 0) { rgb_py[15] = 0; } else if (y >= img_y) { rgb_py[15] = img_y - 1; } } reader.getPixelSet(rgb_px, rgb_py, 4 * 4, rgb_tmp); r = (rgb_tmp[0] + rgb_tmp[3] + rgb_tmp[6] + rgb_tmp[9] + rgb_tmp[12] + rgb_tmp[15] + rgb_tmp[18] + rgb_tmp[21] + rgb_tmp[24] + rgb_tmp[27] + rgb_tmp[30] + rgb_tmp[33] + rgb_tmp[36] + rgb_tmp[39] + rgb_tmp[42] + rgb_tmp[45]) / 16; g = (rgb_tmp[1] + rgb_tmp[4] + rgb_tmp[7] + rgb_tmp[10] + rgb_tmp[13] + rgb_tmp[16] + rgb_tmp[19] + rgb_tmp[22] + rgb_tmp[25] + rgb_tmp[28] + rgb_tmp[31] + rgb_tmp[34] + rgb_tmp[37] + rgb_tmp[40] + rgb_tmp[43] + rgb_tmp[46]) / 16; b = (rgb_tmp[2] + rgb_tmp[5] + rgb_tmp[8] + rgb_tmp[11] + rgb_tmp[14] + rgb_tmp[17] + rgb_tmp[20] + rgb_tmp[23] + rgb_tmp[26] + rgb_tmp[29] + rgb_tmp[32] + rgb_tmp[35] + rgb_tmp[38] + rgb_tmp[41] + rgb_tmp[44] + rgb_tmp[47]) / 16; o_patt[p] = ((r & 0xff) << 16) | ((g & 0xff) << 8) | ((b & 0xff)); p++; } } return; }
public void pickFromRaster(double[] i_cpara, INyARRgbRaster image, int[] o_patt) { double d0, m0, d1, m1; int x, y; int img_x = image.getWidth(); int img_y = image.getHeight(); int patt_w = this._size_ref.w; int[] rgb_tmp = this._rgb_temp; int[] rgb_px = this._rgb_px; int[] rgb_py = this._rgb_py; double cp0 = i_cpara[0]; double cp3 = i_cpara[3]; double cp6 = i_cpara[6]; double cp1 = i_cpara[1]; double cp4 = i_cpara[4]; double cp7 = i_cpara[7]; int pick_y = this._lt_ref.y; int pick_x = this._lt_ref.x; //ピクセルリーダーを取得 INyARRgbPixelReader reader = image.getRgbPixelReader(); int p = 0; double cp0cx0, cp3cx0; double cp1cy_cp20 = cp1 * pick_y + i_cpara[2] + cp0 * pick_x; double cp4cy_cp50 = cp4 * pick_y + i_cpara[5] + cp3 * pick_x; double cp7cy_10 = cp7 * pick_y + 1.0 + cp6 * pick_x; double cp0cx1, cp3cx1; double cp1cy_cp21 = cp1cy_cp20 + cp1; double cp4cy_cp51 = cp4cy_cp50 + cp4; double cp7cy_11 = cp7cy_10 + cp7; double cw0 = cp1 + cp1; double cw7 = cp7 + cp7; double cw4 = cp4 + cp4; for (int iy = this._size_ref.h - 1; iy >= 0; iy--) { cp0cx0 = cp1cy_cp20; cp3cx0 = cp4cy_cp50; cp0cx1 = cp1cy_cp21; cp3cx1 = cp4cy_cp51; m0 = 1 / (cp7cy_10); d0 = -cp6 / (cp7cy_10 * (cp7cy_10 + cp6)); m1 = 1 / (cp7cy_11); d1 = -cp6 / (cp7cy_11 * (cp7cy_11 + cp6)); int n = patt_w * 2 * 2 - 1; for (int ix = patt_w * 2 - 1; ix >= 0; ix--) { //[n,0] x = rgb_px[n] = (int)(cp0cx0 * m0); y = rgb_py[n] = (int)(cp3cx0 * m0); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[n] = 0; } else if (x >= img_x) { rgb_px[n] = img_x - 1; } if (y < 0) { rgb_py[n] = 0; } else if (y >= img_y) { rgb_py[n] = img_y - 1; } } cp0cx0 += cp0; cp3cx0 += cp3; m0 += d0; n--; //[n,1] x = rgb_px[n] = (int)(cp0cx1 * m1); y = rgb_py[n] = (int)(cp3cx1 * m1); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[n] = 0; } else if (x >= img_x) { rgb_px[n] = img_x - 1; } if (y < 0) { rgb_py[n] = 0; } else if (y >= img_y) { rgb_py[n] = img_y - 1; } } cp0cx1 += cp0; cp3cx1 += cp3; m1 += d1; n--; } cp7cy_10 += cw7; cp7cy_11 += cw7; cp1cy_cp20 += cw0; cp4cy_cp50 += cw4; cp1cy_cp21 += cw0; cp4cy_cp51 += cw4; reader.getPixelSet(rgb_px, rgb_py, patt_w * 4, rgb_tmp); for (int ix = patt_w - 1; ix >= 0; ix--) { int idx = ix * 12;//3*2*2 int r = (rgb_tmp[idx + 0] + rgb_tmp[idx + 3] + rgb_tmp[idx + 6] + rgb_tmp[idx + 9]) / 4; int g = (rgb_tmp[idx + 1] + rgb_tmp[idx + 4] + rgb_tmp[idx + 7] + rgb_tmp[idx + 10]) / 4; int b = (rgb_tmp[idx + 2] + rgb_tmp[idx + 5] + rgb_tmp[idx + 8] + rgb_tmp[idx + 11]) / 4; o_patt[p] = (r << 16) | (g << 8) | ((b & 0xff)); p++; } } return; }
public void pickFromRaster(double[] i_cpara, INyARRgbRaster image, int[] o_patt) { double d0, m0; int x, y; int img_x = image.getWidth(); int img_y = image.getHeight(); int patt_w = this._size_ref.w; int[] rgb_tmp = this._rgb_temp; int[] rgb_px = this._rgb_px; int[] rgb_py = this._rgb_py; double cp0 = i_cpara[0]; double cp3 = i_cpara[3]; double cp6 = i_cpara[6]; double cp1 = i_cpara[1]; double cp4 = i_cpara[4]; double cp7 = i_cpara[7]; int pick_y = this._lt_ref.y; int pick_x = this._lt_ref.x; //ピクセルリーダーを取得 INyARRgbPixelReader reader = image.getRgbPixelReader(); int p = 0; double cp0cx0, cp3cx0; double cp1cy_cp20 = cp1 * pick_y + i_cpara[2] + cp0 * pick_x; double cp4cy_cp50 = cp4 * pick_y + i_cpara[5] + cp3 * pick_x; double cp7cy_10 = cp7 * pick_y + 1.0 + cp6 * pick_x; for (int iy = this._size_ref.h - 1; iy >= 0; iy--) { m0 = 1 / (cp7cy_10); d0 = -cp6 / (cp7cy_10 * (cp7cy_10 + cp6)); cp0cx0 = cp1cy_cp20; cp3cx0 = cp4cy_cp50; //ピックアップシーケンス //0番目のピクセル(検査対象)をピックアップ for (int ix = patt_w - 1; ix >= 0; ix--) { //1ピクセルを作成 x = rgb_px[ix] = (int)(cp0cx0 * m0); y = rgb_py[ix] = (int)(cp3cx0 * m0); if (x < 0 || x >= img_x || y < 0 || y >= img_y) { if (x < 0) { rgb_px[ix] = 0; } else if (x >= img_x) { rgb_px[ix] = img_x - 1; } if (y < 0) { rgb_py[ix] = 0; } else if (y >= img_y) { rgb_py[ix] = img_y - 1; } } cp0cx0 += cp0; cp3cx0 += cp3; m0 += d0; } cp1cy_cp20 += cp1; cp4cy_cp50 += cp4; cp7cy_10 += cp7; reader.getPixelSet(rgb_px, rgb_py, patt_w, rgb_tmp); for (int ix = patt_w - 1; ix >= 0; ix--) { int idx = ix * 3; o_patt[p] = (rgb_tmp[idx] << 16) | (rgb_tmp[idx + 1] << 8) | ((rgb_tmp[idx + 2] & 0xff)); p++; } } return; }
//分割数16未満になると少し遅くなるかも。 private void updateExtpat(INyARRgbRaster image, NyARMat i_cpara, int i_xdiv2, int i_ydiv2) { int i, j; int r, g, b; //ピクセルリーダーを取得 int pat_size_w = this._size.w; int xdiv = i_xdiv2 / pat_size_w; // xdiv = xdiv2/Config.AR_PATT_SIZE_X; int ydiv = i_ydiv2 / this._size.h; // ydiv = ydiv2/Config.AR_PATT_SIZE_Y; int xdiv_x_ydiv = xdiv * ydiv; double reciprocal; double[][] para = i_cpara.getArray(); double para00 = para[0 * 3 + 0][0]; double para01 = para[0 * 3 + 1][0]; double para02 = para[0 * 3 + 2][0]; double para10 = para[1 * 3 + 0][0]; double para11 = para[1 * 3 + 1][0]; double para12 = para[1 * 3 + 2][0]; double para20 = para[2 * 3 + 0][0]; double para21 = para[2 * 3 + 1][0]; INyARRgbPixelReader reader = image.getRgbPixelReader(); int img_width = image.getWidth(); int img_height = image.getHeight(); //ワークバッファの準備 reservWorkBuffers(xdiv, ydiv); double[] xw = this.__updateExtpat_xw; double[] yw = this.__updateExtpat_yw; int[] xc = this.__updateExtpat_xc; int[] yc = this.__updateExtpat_yc; int[] rgb_set = this.__updateExtpat_rgbset; for (int iy = this._size.h - 1; iy >= 0; iy--) { for (int ix = pat_size_w - 1; ix >= 0; ix--) { //xw,ywマップを作成 reciprocal = 1.0 / i_xdiv2; for (i = xdiv - 1; i >= 0; i--) { xw[i] = LT_POS + SQ_SIZE * (ix * xdiv + i + 0.5) * reciprocal; } reciprocal = 1.0 / i_ydiv2; for (i = ydiv - 1; i >= 0; i--) { yw[i] = LT_POS + SQ_SIZE * (iy * ydiv + i + 0.5) * reciprocal; } //1ピクセルを構成するピクセル座標の集合をxc,yc配列に取得 int number_of_pix = 0; for (i = ydiv - 1; i >= 0; i--) { double para01_x_yw_para02 = para01 * yw[i] + para02; double para11_x_yw_para12 = para11 * yw[i] + para12; double para12_x_yw_para22 = para21 * yw[i] + 1.0; for (j = xdiv - 1; j >= 0; j--) { double d = para20 * xw[j] + para12_x_yw_para22; if (d == 0) { throw new NyARException(); } int xcw = (int)((para00 * xw[j] + para01_x_yw_para02) / d); int ycw = (int)((para10 * xw[j] + para11_x_yw_para12) / d); if (xcw < 0 || xcw >= img_width || ycw < 0 || ycw >= img_height) { continue; } xc[number_of_pix] = xcw; yc[number_of_pix] = ycw; number_of_pix++; } } //1ピクセル分の配列を取得 reader.getPixelSet(xc, yc, number_of_pix, rgb_set); r = g = b = 0; for (i = number_of_pix * 3 - 1; i >= 0; i -= 3) { r += rgb_set[i - 2]; // R g += rgb_set[i - 1]; // G b += rgb_set[i]; // B } //1ピクセル確定 this._patdata[iy * pat_size_w + ix] = (((r / xdiv_x_ydiv) & 0xff) << 16) | (((g / xdiv_x_ydiv) & 0xff) << 8) | (((b / xdiv_x_ydiv) & 0xff)); } } return; }
/** * @see INyARColorPatt#pickFromRaster */ public bool pickFromRaster(INyARRgbRaster image,NyARIntPoint2d[] i_vertexs) { double[] conv_param=this._convparam; int rx2,ry2; rx2=this._size.w; ry2=this._size.h; int[] rgb_tmp=new int[3]; INyARRgbPixelReader reader=image.getRgbPixelReader(); // 変形先領域の頂点を取得 //変換行列から現在の座標系への変換パラメタを作成 calcPara(i_vertexs,conv_param);// 変換パラメータを求める for(int y=0;y<ry2;y++){ for(int x=0;x<rx2;x++){ int ttx=(int)((conv_param[0]*x*y+conv_param[1]*x+conv_param[2]*y+conv_param[3])+0.5); int tty=(int)((conv_param[4]*x*y+conv_param[5]*x+conv_param[6]*y+conv_param[7])+0.5); reader.getPixel((int)ttx,(int)tty,rgb_tmp); this._patdata[x+y*rx2]=(rgb_tmp[0]<<16)|(rgb_tmp[1]<<8)|rgb_tmp[2]; } } return true; }