2 * PROJECT: NyARToolkit
\r
3 * --------------------------------------------------------------------------------
\r
4 * This work is based on the original ARToolKit developed by
\r
7 * HITLab, University of Washington, Seattle
\r
8 * http://www.hitl.washington.edu/artoolkit/
\r
10 * The NyARToolkit is Java version ARToolkit class library.
\r
11 * Copyright (C)2008 R.Iizuka
\r
13 * This program is free software; you can redistribute it and/or
\r
14 * modify it under the terms of the GNU General Public License
\r
15 * as published by the Free Software Foundation; either version 2
\r
16 * of the License, or (at your option) any later version.
\r
18 * This program is distributed in the hope that it will be useful,
\r
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
21 * GNU General Public License for more details.
\r
23 * You should have received a copy of the GNU General Public License
\r
24 * along with this framework; if not, write to the Free Software
\r
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
27 * For further information please contact.
\r
28 * http://nyatla.jp/nyatoolkit/
\r
29 * <airmail(at)ebony.plala.or.jp>
\r
32 package jp.nyatla.nyartoolkit.core2.rasteranalyzer;
\r
34 import jp.nyatla.nyartoolkit.NyARException;
\r
35 import jp.nyatla.nyartoolkit.core.raster.*;
\r
36 import jp.nyatla.nyartoolkit.core.types.stack.*;
\r
37 import jp.nyatla.nyartoolkit.core.types.*;
\r
38 import jp.nyatla.nyartoolkit.core.rasterreader.*;
\r
40 public class NyARRasterDetector_QrCodeEdge
\r
42 private NyARIntRectStack _result;
\r
44 public NyARRasterDetector_QrCodeEdge(int i_result_max)
\r
46 this._result = new NyARIntRectStack(i_result_max);
\r
50 public NyARIntRectStack geResult()
\r
52 return this._result;
\r
55 private boolean check_w1(int i_w1)
\r
59 private boolean check_b1(int i_b1)
\r
63 private boolean check_w2(int i_b1,int i_w2)
\r
65 int v=i_w2*100/i_b1;
\r
66 return (30<=v && v<=170);
\r
68 private boolean check_b2(int i_b1,int i_b2)
\r
70 int v=i_b2*100/i_b1;
\r
72 return (200<=v && v<=400);
\r
74 private boolean check_w3(int i_w2,int i_w3)
\r
76 int v=i_w3*100/i_w2;
\r
77 return (50<=v && v<=150);
\r
79 private boolean check_b3(int i_b3,int i_b1)
\r
81 int v=i_b3*100/i_b1;
\r
82 return (50<=v && v<=150);
\r
84 public void analyzeRaster(INyARRaster i_input) throws NyARException
\r
86 INyARBufferReader buffer_reader=i_input.getBufferReader();
\r
87 assert (buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT2D_BIN_8));
\r
90 this._result.clear();
\r
92 NyARIntSize size = i_input.getSize();
\r
94 int w1, b1, w2, b2, w3, b3;
\r
95 w1 = b1 = w2 = b2 = w3 = b3 = 0;
\r
99 int s_pos, b2_spos,b3_spos;
\r
101 for (int y = size.h - 1-8; y >= 8; y--) {
\r
102 line = ((int[][]) buffer_reader.getBuffer())[y];
\r
111 for (; x >= 0; x--) {
\r
112 if (line[x] == 0) {
\r
113 // 検出条件確認:w1は2以上欲しいな。
\r
114 if (!check_w1(w1)) {
\r
130 for (; x >= 0; x--) {
\r
132 // 検出条件確認:b1は1以上欲しいな。
\r
133 if (!check_b1(b1)){
\r
148 for (; x >= 0; x--) {
\r
149 if (line[x] == 0) {
\r
150 // 検出条件確認:w2*10/b1は80-120以上欲しいな。
\r
151 if (!check_w2(b1,w2)) {
\r
152 //条件不十分→w2→w1として、b1を解析
\r
170 for (; x >= 0; x--) {
\r
172 //条件:(w1+b1)/2の2~4倍
\r
174 if (!check_b2(b1,b2)) {
\r
175 // b2->b1と仮定して解析しなおす。
\r
176 if(check_w1(w2) && check_b1(b2)){
\r
198 for (; x >= 0; x--) {
\r
200 if (!check_w3(w2,w3)) {
\r
201 //w2→w1,b2->b1として解析しなおす。
\r
202 if(check_w1(w2) && check_b1(b2)){
\r
225 for (; x >= 0; x--) {
\r
228 if (!check_b3(b3,b1)) {
\r
229 if(check_w1(w2) && check_b1(b2)){
\r
230 //条件不十分→b3->b1,w3->w1として再解析
\r
249 item = this._result.prePush();
\r
259 throw new NyARException();
\r