回答編集履歴

1

追記

2017/03/22 00:48

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -17,3 +17,101 @@
17
17
  そうでないなら、カウンタ=1
18
18
 
19
19
  - カウンタの値に応じた処理
20
+
21
+
22
+
23
+ ---
24
+
25
+ 【追記】
26
+
27
+ ソースを書ける方なら分かってくれるかなと思って手抜きしました。
28
+
29
+ 下記イメージです。(コンパイルしてませんのでエラーがでたら悪しからず。)
30
+
31
+ 列数が0の時は異常動作します。現在は列数=行数=line_maxですが、もし列数と行数を異なるパラメータにする時はパラメータ・チェックが必要です。
32
+
33
+
34
+
35
+ ```C++
36
+
37
+ #define WHITE_MODULE (0x00) // この値を変える事で分かりやすくなるなら変更してもOK
38
+
39
+ #define BLACK_MODULE (0xFF) // この値を変える事で分かりやすくなるなら変更してもOK
40
+
41
+ typedef unsigned char BYTE;
42
+
43
+ int ErrPointLine(BYTE *pQRdata, int version)
44
+
45
+ {
46
+
47
+ int Eret=0; /* エラーポイント */
48
+
49
+ // int line_max = _qr_code_info[version].side_module_num;
50
+
51
+ int line_max = 40; // 暫定で 40 固定
52
+
53
+
54
+
55
+ // 列
56
+
57
+ for( int h=0 ; h < line_max ; h++ ){
58
+
59
+ int counter= 1;
60
+
61
+ const BYTE *pHead = pQRdata + (line_max * h);
62
+
63
+ BYTE last = *pHead;
64
+
65
+ for(int n=1 ; n < line_max ; n++ ){
66
+
67
+ BYTE LineCol = *(pHead + n);
68
+
69
+
70
+
71
+ if(LineCol == last ){
72
+
73
+ counter++;
74
+
75
+ }
76
+
77
+ else {
78
+
79
+ last=LineCol;
80
+
81
+ counter=1;
82
+
83
+ }
84
+
85
+
86
+
87
+ // 同色が5つ続くなら+3の失点
88
+
89
+ if(counter == 5){
90
+
91
+ Eret += 3;
92
+
93
+ }
94
+
95
+ else if(counter> 5){
96
+
97
+ // 以後続くたびに+1の失点
98
+
99
+ Eret++;
100
+
101
+ }
102
+
103
+ }
104
+
105
+ }
106
+
107
+ printf("Total Error Point = %d\n", Eret);
108
+
109
+
110
+
111
+ return Eret;
112
+
113
+ }
114
+
115
+ ```
116
+
117
+