__kernel void recognition_numbers_1(__global const unsigned char* a_in, __global const unsigned char* b_in, int width, int num_width, int num_height, int num_count, __global unsigned char* result) { int p = get_global_id(0); int startIndex = p / width * width * num_width * num_height + p % (num_count * 10) * num_width; unsigned char t = 0; for (int r = 0;r < num_height;r++) for (int c = 0;c < num_width;c++) { int index = startIndex + num_width * width * r + c; t += abs(a_in[index] - b_in[index]); if (p == 0) { //printf("Öµ:%d-%d \n", a_in[index], b_in[index]); } } result[p] = t; } __kernel void recognition_numbers_2(__global const unsigned char* a_in, __global unsigned char* result) { int index = get_global_id(0); int startIndex = index * 10; int endIndex = (index + 1) * 10; //»ñÈ¡×îСֵ int min = 255; int minIndex = 11; for (int i = startIndex;i < endIndex;i++) { if (a_in[i] < min) { min = a_in[i]; minIndex = i; } } //printf("×îСֵ£º%d - %d - %d \n", index, min, minIndex - startIndex); result[index] = minIndex - startIndex; } int get_one_level_position(int width, int x, int y) { return width * y + x; } unsigned char get_binary_value(unsigned char v) { return v >= 64 ? 1 : 0; } //·Ö¸ô°å¿éÊý×Ö __kernel void split_plate_num(__global const unsigned char* img_in, __global const int* pos_in, __global const unsigned char* zero, __global const unsigned char* types, int width, int num_width, int num_height, int ele_count_per_line, int length_per_num, __global unsigned char* result) { int index = get_global_id(0); //ÇøÓò×ø±ê int startP = index * 4; int startx = pos_in[startP]; int starty = pos_in[startP + 1]; int endx = pos_in[startP + 2]; int endy = pos_in[startP + 3]; if (startx > 0) { int startNy = -1; int endNy = -1; //È¥³ýÉÏÏÂµÄ°×±ß int y = 0; for (y = starty;y <= endy;y++) { bool empty = 1; for (int x = startx;x <= endx;x++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (!empty) { startNy = y; break; } } for (y = endy;y >= starty;y--) { bool empty = 1; for (int x = startx;x <= endx;x++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (!empty) { endNy = y; break; } } starty = startNy; endy = endNy; } int cols = endx - startx + 1; int rows = endy - starty + 1; //ÿ¸öÔªËØÕ¼ÓÃ6¸öÊý×ֵĿռ䣬²»¹»µÄÇ°ÃæÌî³ä0 int num_count = ele_count_per_line * length_per_num; int nps[12]; //Ö»ÄÜʶ±ð4ÖÖÊý×Ö unsigned char type = types[index % ele_count_per_line]; //printf("ele_count_line:%d\n", ele_count_line); //ʱ¼ä if (type == 0) { //ʱ¼ä int s = cols / 2; int i; //Íùǰ²éÕÒðºÅ int m1_s = -1, m1_e = -1, m2_s = -1, m2_e = -1; uchar temp[10]; for (i = s;i > -1;i--) { if (i < 5) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i - 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i - 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i - 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i - 5, endy)]); temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i - 2, endy - 1)]); temp[7] = get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy - 1)]); temp[8] = get_binary_value(img_in[get_one_level_position(width, startx + i - 2, endy - 2)]); temp[9] = get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy - 2)]); if (temp[3] > 0 && temp[2] > 0 && temp[6] > 0 && temp[7] > 0) { int t = temp[0] + temp[1] + temp[4] + temp[5] + temp[8] + temp[9]; if (t == 0) { m1_s = i - 5; m1_e = i; break; } } } //Íùºó²éÕÒðºÅ for (i = s;i < cols;i++) { if (i > cols - 5) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]); temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy - 1)]); temp[7] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 1)]); temp[8] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy - 2)]); temp[9] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 2)]); if (temp[2] > 0 && temp[3] > 0 && temp[6] > 0 && temp[7] > 0) { int t = temp[0] + temp[1] + temp[4] + temp[5] + temp[8] + temp[9]; if (t == 0) { m2_s = i; m2_e = i + 5; break; } } } if (m1_s < 0 || m1_e < 0 || m2_s < 0 || m2_e < 0) { //ûÓзָî³É¹¦µÄ»°Ìî³ä0 nps[0] = -1; nps[1] = -1; nps[2] = -1; nps[3] = -1; nps[4] = -1; nps[5] = -1; nps[6] = -1; nps[7] = -1; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } else { //3¸öʱ¼äµÄ×ø±ê nps[0] = startx; nps[1] = starty; nps[2] = startx + m1_s - 1; nps[3] = endy; nps[4] = startx + m1_e + 1; nps[5] = starty; nps[6] = startx + m2_s - 1; nps[7] = endy; nps[8] = startx + m2_e + 1; nps[9] = starty; nps[10] = endx; nps[11] = endy; } } //½ð¶î else if (type == 1) { //²éÕÒµ¥Î»Ç°µÄ¿Õ¸ñ int num_end = -1; int i; for (i = endx - 11;i >= startx;i--) { bool empty = 1; for (int y = starty;y < endy;y++) { if (get_binary_value(img_in[get_one_level_position(width, i, y)]) > 0) { empty = 0; break; } } if (empty) { num_end = i - 1; break; } } if (num_end >= 0) { endx = num_end; } //È¥³ýÉÏÏÂµÄ¿Õ°× int startNy = -1; int endNy = -1; //È¥³ýÉÏÏÂµÄ°×±ß int y = 0; for (y = starty;y <= endy;y++) { bool empty = 1; for (int x = startx;x <= endx;x++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (!empty) { startNy = y; break; } } for (y = endy;y >= starty;y--) { bool empty = 1; for (int x = startx;x <= endx;x++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (!empty) { endNy = y; break; } } starty = startNy; endy = endNy; cols = endx - startx + 1; int m_s = -1, m_e = -1; uchar temp[8]; for (i = 0;i < cols;i++) { if (i > cols - 5) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]); temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy - 1)]); temp[7] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 1)]); if (temp[2] > 0 && temp[3] > 0 && temp[6] > 0 && temp[7] > 0) { if (temp[0] + temp[1] + temp[4] + temp[5] == 0) { bool empty = 1; for (int y = starty;y < endy - 1;y++) { if (get_binary_value(img_in[get_one_level_position(width, startx + i + 2, y)]) > 0) { empty = 0; break; } } //СÊýµãÉÏ·½Îª¿ÕÖµ if (empty) { m_s = i; m_e = i + 5; break; } } } } if (m_s == -1 || m_e == -1) { nps[0] = -1; nps[1] = -1; nps[2] = -1; nps[3] = -1; nps[4] = -1; nps[5] = -1; nps[6] = -1; nps[7] = -1; } else { nps[0] = startx; nps[1] = starty; nps[2] = startx + m_s - 1; nps[3] = endy; nps[4] = startx + m_e + 1; nps[5] = starty; nps[6] = num_end; nps[7] = endy; } } //¼Û¸ñ else if (type == 2) { //¹É¼Û //printf("startx:%d starty:%d endx:%d endy:%d\n",startx,starty,endx,endy); //Íùǰ²éÕÒСÊýµã int m_s = -1, m_e = -1; uchar temp[8]; int i; for (i = 0;i < cols;i++) { if (i > cols - 5) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]); temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy - 1)]); temp[7] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 1)]); if (temp[2] > 0 && temp[3] > 0 && temp[6] > 0 && temp[7] > 0) { if (temp[0] + temp[1] + temp[4] + temp[5] == 0) { bool empty = 1; for (int y = starty;y < endy - 1;y++) { if (get_binary_value(img_in[get_one_level_position(width, startx + i + 2, y)]) > 0) { empty = 0; break; } } //СÊýµãÉÏ·½Îª¿ÕÖµ if (empty) { m_s = i; m_e = i + 5; break; } } } } if (m_s == -1 || m_e == -1) { nps[0] = -1; nps[1] = -1; nps[2] = -1; nps[3] = -1; nps[4] = -1; nps[5] = -1; nps[6] = -1; nps[7] = -1; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } else { nps[0] = startx; nps[1] = starty; nps[2] = startx + m_s - 1; nps[3] = endy; nps[4] = startx + m_e + 1; nps[5] = starty; nps[6] = endx; nps[7] = endy; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } } //´úÂëÓëÊý×Ö else if (type == 3 || type == 4) { //ÊÖÊý nps[0] = startx; nps[1] = starty; nps[2] = endx; nps[3] = endy; nps[4] = -1; nps[5] = -1; nps[6] = -1; nps[7] = -1; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } //·Ö¸ôÊý¾Ý //×î´ó·Ö¸î20¸öÊý int numCount = 0; //¼Ç¼·Ö¸îµÃµ½µÄÊý¾Ý int numberCols[20 * 2]; int i; for (i = 0;i < 3;i++) { if (nps[i * 4] == -1) { break; } int _startx = nps[i * 4]; int _starty = nps[i * 4 + 1]; int _endx = nps[i * 4 + 2]; int _endy = nps[i * 4 + 3]; int _cols = _endx - _startx + 1; int c, startC = -1, endC = -1; for (c = 0;c < _cols;c++) { bool empty = 1; for (int y = _starty;y <= _endy;y++) { unsigned char value = get_binary_value(img_in[get_one_level_position(width, _startx + c, y)]); if (value > 0) { empty = 0; break; } } if (empty) { if (startC > -1 && endC > -1) { numberCols[numCount * 2] = _startx + startC; numberCols[numCount * 2 + 1] = _startx + endC; numCount++; } startC = -1; endC = -1; } else { if (startC == -1) { startC = c; endC = c; } else { endC = c; } } } if (startC > -1 && endC > -1) { numberCols[numCount * 2] = _startx + startC; numberCols[numCount * 2 + 1] = _startx + endC; numCount++; } } int zeroCount = length_per_num - numCount; //×î´óΪ20λÊý int fresult[20 * 2]; for (i = 0;i < zeroCount;i++) { fresult[i * 2] = -1; fresult[i * 2 + 1] = -1; } for (i = 0;i < numCount;i++) { fresult[(i + zeroCount) * 2] = numberCols[i * 2]; fresult[(i + zeroCount) * 2 + 1] = numberCols[i * 2 + 1]; } //¿ªÊ¼Ìî³äÊý¾Ý for (i = 0;i < length_per_num;i++) { unsigned char numData[100 * 100]; if (fresult[i * 2] == -1) { //Ìî³ä0 for (int r = 0;r < num_height;r++) { for (int c = 0;c < num_width;c++) { unsigned char value = get_binary_value(zero[r * num_width + c]); //ÉèÖÃÊä³ö×ø±êµÄÖµ numData[r * num_width + c] = value; } } } else { int _startx = fresult[i * 2]; int _endx = fresult[i * 2 + 1]; for (int r = starty;r <= endy;r++) { for (int c = 0;c < num_width;c++) { unsigned char value = 0; if (_startx + c <= _endx) { //Ìî³ä¿Õ°×0 value = get_binary_value(img_in[get_one_level_position(width, _startx + c, r)]); //ÉèÖÃÊä³ö×ø±êµÄÖµ numData[(r - starty) * num_width + c] = value; } else { numData[(r - starty) * num_width + c] = 0; } } } } int rowDataCount = num_height * num_width * 10 * num_count; int rowIndex = index / ele_count_per_line; int index_0 = rowDataCount * rowIndex; //ÐÐÆ«ÒÆÁ¿ int index_2 = (num_width * 10) * (length_per_num * (index % ele_count_per_line) + i); for (int re = 0;re < 10;re++) { int index_3 = re * num_width; for (int r = 0;r < num_height;r++) { int index_1 = r * (num_width * 10 * num_count); for (int c = 0;c < num_width;c++) { int findex = index_0 + index_1 + index_2 + index_3 + c; //printf("index:%d-findex:%d value:%d \n", index, findex, numData[r * num_width + c]); result[findex] = numData[r * num_width + c]; } } } } //printf("\n"); } __kernel void split_l2_num_new(__global const unsigned char* img_in, __global const int* pos_in, __global const unsigned char* zero, __global const unsigned char* types, int width, int num_width, int num_height, int ele_count_per_line, int length_per_num, __global unsigned char* result) { //printf("ele_count_per_line:%d length_per_num:%d\n", ele_count_per_line, length_per_num); int index = get_global_id(0); //ÇøÓò×ø±ê int startP = index * 4; int startx = pos_in[startP]; int starty = pos_in[startP + 1]; int endx = pos_in[startP + 2]; int endy = pos_in[startP + 3]; if (startx > 0) { int startNy = -1; int endNy = -1; //È¥³ýÉÏÏÂµÄ°×±ß int y = 0; for (y = starty;y <= endy;y++) { bool empty = 1; for (int x = startx;x <= endx;x++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (!empty) { startNy = y; break; } } for (y = endy;y >= starty;y--) { bool empty = 1; for (int x = startx;x <= endx;x++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (!empty) { endNy = y; break; } } starty = startNy; endy = endNy; } int cols = endx - startx + 1; int rows = endy - starty + 1; //ÿ¸öÔªËØÕ¼ÓÃ6¸öÊý×ֵĿռ䣬²»¹»µÄÇ°ÃæÌî³ä0 int num_count = ele_count_per_line * length_per_num; int nps[12]; //Ö»ÄÜʶ±ð4ÖÖÊý×Ö unsigned char type = types[index % ele_count_per_line]; //printf("ele_count_line:%d\n", ele_count_line); //ʱ¼ä if (type == 0) { //ʱ¼ä int s = cols / 2; int i; //Íùǰ²éÕÒðºÅ int m1_s = -1, m1_e = -1, m2_s = -1, m2_e = -1; uchar temp[7]; for (i = s;i > -1;i--) { if (i < 6) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i - 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i - 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i - 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i - 5, endy)]); temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i - 6, endy)]); if (temp[3] > 0 && get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy - 1)]) == 0) { int t = temp[0] + temp[1] + temp[2] + temp[4] + temp[5] + temp[6]; if (t == 0) { m1_s = i - 6; m1_e = i; break; } } } //Íùºó²éÕÒðºÅ for (i = s;i < cols;i++) { if (i > cols - 6) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]); temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i + 6, endy)]); if (temp[3] > 0 && get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 1)]) == 0) { int t = temp[0] + temp[1] + temp[2] + temp[4] + temp[5] + temp[6]; if (t == 0) { m2_s = i; m2_e = i + 6; break; } } } if (m1_s < 0 || m1_e < 0 || m2_s < 0 || m2_e < 0) { //ûÓзָî³É¹¦µÄ»°Ìî³ä0 nps[0] = -1; nps[1] = -1; nps[2] = -1; nps[3] = -1; nps[4] = -1; nps[5] = -1; nps[6] = -1; nps[7] = -1; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } else { //3¸öʱ¼äµÄ×ø±ê nps[0] = startx; nps[1] = starty; nps[2] = startx + m1_s - 1; nps[3] = endy; nps[4] = startx + m1_e + 1; nps[5] = starty; nps[6] = startx + m2_s - 1; nps[7] = endy; nps[8] = startx + m2_e + 1; nps[9] = starty; nps[10] = endx; nps[11] = endy; } } //½ð¶î else if (type == 1) { //²éÕÒµ¥Î»Ç°µÄ¿Õ¸ñ int num_end = -1; int i; for (i = endx - 9;i >= startx;i--) { bool empty = 1; for (int y = starty;y < endy;y++) { if (get_binary_value(img_in[get_one_level_position(width, i, y)]) > 0) { empty = 0; break; } } if (empty) { num_end = i - 1; break; } } if (num_end >= 0) { endx = num_end; } //È¥³ýÉÏÏÂµÄ¿Õ°× int startNy = -1; int endNy = -1; //È¥³ýÉÏÏÂµÄ°×±ß int y = 0; for (y = starty;y <= endy;y++) { bool empty = 1; for (int x = startx;x <= endx;x++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (!empty) { startNy = y; break; } } for (y = endy;y >= starty;y--) { bool empty = 1; for (int x = startx;x <= endx;x++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (!empty) { endNy = y; break; } } starty = startNy; endy = endNy; cols = endx - startx + 1; //²éÕÒСÊýµã int m_s = -1, m_e = -1; uchar temp[6]; for (i = 0;i < cols;i++) { if (i > cols - 5) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]); if (temp[2] > 0) { bool empty = 1; for (int y = starty;y < endy;y++) { if (get_binary_value(img_in[get_one_level_position(width, startx + i + 2, y)]) > 0) { empty = 0; break; } } //СÊýµãÉÏ·½Îª¿ÕÖµ if (empty) { unsigned char t = temp[0] + temp[1] + temp[3] + temp[4] + temp[5]; if (t == 0) { m_s = i; m_e = i + 5; break; } } } } if (m_s == -1 || m_e == -1) { nps[0] = -1; nps[1] = -1; nps[2] = -1; nps[3] = -1; nps[4] = -1; nps[5] = -1; nps[6] = -1; nps[7] = -1; } else { nps[0] = startx; nps[1] = starty; nps[2] = startx + m_s - 1; nps[3] = endy; nps[4] = startx + m_e + 1; nps[5] = starty; nps[6] = num_end; nps[7] = endy; } } //¼Û¸ñ else if (type == 2) { //¹É¼Û //printf("startx:%d starty:%d endx:%d endy:%d\n",startx,starty,endx,endy); int m_s = -1, m_e = -1; uchar temp[6]; int i; for (i = 0;i < cols;i++) { if (i > cols - 5) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]); if (temp[2] > 0) { bool empty = 1; for (int y = starty;y < endy;y++) { if (get_binary_value(img_in[get_one_level_position(width, startx + i + 2, y)]) > 0) { empty = 0; break; } } //СÊýµãÉÏ·½Îª¿ÕÖµ if (empty) { unsigned char t = temp[0] + temp[1] + temp[3] + temp[4] + temp[5]; if (t == 0) { m_s = i; m_e = i + 5; break; } } } } if (m_s == -1 || m_e == -1) { nps[0] = -1; nps[1] = -1; nps[2] = -1; nps[3] = -1; nps[4] = -1; nps[5] = -1; nps[6] = -1; nps[7] = -1; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } else { nps[0] = startx; nps[1] = starty; nps[2] = startx + m_s - 1; nps[3] = endy; nps[4] = startx + m_e + 1; nps[5] = starty; nps[6] = endx; nps[7] = endy; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } } //´úÂëÓëÊý×Ö else if (type == 3 || type == 4) { //ÊÖÊý nps[0] = startx; nps[1] = starty; nps[2] = endx; nps[3] = endy; nps[4] = -1; nps[5] = -1; nps[6] = -1; nps[7] = -1; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } //·Ö¸ôÊý¾Ý //×î´ó·Ö¸î20¸öÊý int numCount = 0; //¼Ç¼·Ö¸îµÃµ½µÄÊý¾Ý int numberCols[20 * 2]; int i; for (i = 0;i < 3;i++) { if (nps[i * 4] == -1) { break; } int _startx = nps[i * 4]; int _starty = nps[i * 4 + 1]; int _endx = nps[i * 4 + 2]; int _endy = nps[i * 4 + 3]; int _cols = _endx - _startx + 1; int c, startC = -1, endC = -1; for (c = 0;c < _cols;c++) { bool empty = 1; for (int y = _starty;y <= _endy;y++) { unsigned char value = get_binary_value(img_in[get_one_level_position(width, _startx + c, y)]); if (value > 0) { empty = 0; break; } } if (empty) { if (startC > -1 && endC > -1) { numberCols[numCount * 2] = _startx + startC; numberCols[numCount * 2 + 1] = _startx + endC; numCount++; } startC = -1; endC = -1; } else { if (startC == -1) { startC = c; endC = c; } else { endC = c; } } } if (startC > -1 && endC > -1) { numberCols[numCount * 2] = _startx + startC; numberCols[numCount * 2 + 1] = _startx + endC; numCount++; } } int zeroCount = length_per_num - numCount; //×î´óΪ20λÊý int fresult[20 * 2]; for (i = 0;i < zeroCount;i++) { fresult[i * 2] = -1; fresult[i * 2 + 1] = -1; } for (i = 0;i < numCount;i++) { fresult[(i + zeroCount) * 2] = numberCols[i * 2]; fresult[(i + zeroCount) * 2 + 1] = numberCols[i * 2 + 1]; } //¿ªÊ¼Ìî³äÊý¾Ý for (i = 0;i < length_per_num;i++) { unsigned char numData[100 * 100]; if (fresult[i * 2] == -1) { //Ìî³ä0 for (int r = 0;r < num_height;r++) { for (int c = 0;c < num_width;c++) { unsigned char value = get_binary_value(zero[r * num_width + c]); //ÉèÖÃÊä³ö×ø±êµÄÖµ numData[r * num_width + c] = value; } } } else { int _startx = fresult[i * 2]; int _endx = fresult[i * 2 + 1]; for (int r = starty;r <= endy;r++) { for (int c = 0;c < num_width;c++) { unsigned char value = 0; if (_startx + c <= _endx) { //Ìî³ä¿Õ°×0 value = get_binary_value(img_in[get_one_level_position(width, _startx + c, r)]); //ÉèÖÃÊä³ö×ø±êµÄÖµ numData[(r - starty) * num_width + c] = value; } else { numData[(r - starty) * num_width + c] = 0; } } } } int rowDataCount = num_height * num_width * 10 * num_count; int rowIndex = index / ele_count_per_line; int index_0 = rowDataCount * rowIndex; //ÐÐÆ«ÒÆÁ¿ int index_2 = (num_width * 10) * (length_per_num * (index % ele_count_per_line) + i); for (int re = 0;re < 10;re++) { int index_3 = re * num_width; for (int r = 0;r < num_height;r++) { int index_1 = r * (num_width * 10 * num_count); for (int c = 0;c < num_width;c++) { int findex = index_0 + index_1 + index_2 + index_3 + c; //printf("index:%d-findex:%d value:%d \n", index, findex, numData[r * num_width + c]); result[findex] = numData[r * num_width + c]; } } } } //printf("\n"); } //·Ö¸îL2Êý×Ö __kernel void split_l2_num(__global const unsigned char* img_in, __global const int* pos_in, __global const unsigned char* zero, int width, int num_width, int num_height, int num_count, __global unsigned char* result) { int index = get_global_id(0); //ÇøÓò×ø±ê int startP = index * 4; int startx = pos_in[startP]; int starty = pos_in[startP + 1]; int endx = pos_in[startP + 2]; int endy = pos_in[startP + 3]; if (startx > 0) { int startNy = -1; int endNy = -1; //È¥³ýÉÏÏÂµÄ°×±ß int y = 0; for (y = starty;y <= endy;y++) { bool empty = 1; for (int x = startx;x <= endx;x++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (!empty) { startNy = y; break; } } for (y = endy;y >= starty;y--) { bool empty = 1; for (int x = startx;x <= endx;x++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (!empty) { endNy = y; break; } } starty = startNy; endy = endNy; } int cols = endx - startx + 1; int rows = endy - starty + 1; int nps[12]; if (index % 4 == 0) { //ʱ¼ä int s = cols / 2; int i; //Íùǰ²éÕÒðºÅ int m1_s = -1, m1_e = -1, m2_s = -1, m2_e = -1; uchar temp[7]; for (i = s;i > -1;i--) { if (i < 6) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i - 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i - 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i - 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i - 5, endy)]); temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i - 6, endy)]); if (temp[3] > 0 && get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy - 1)]) == 0) { int t = temp[0] + temp[1] + temp[2] + temp[4] + temp[5] + temp[6]; if (t == 0) { m1_s = i - 6; m1_e = i; break; } } } //Íùºó²éÕÒðºÅ for (i = s;i < cols;i++) { if (i > cols - 6) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]); temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i + 6, endy)]); if (temp[3] > 0 && get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 1)]) == 0) { int t = temp[0] + temp[1] + temp[2] + temp[4] + temp[5] + temp[6]; if (t == 0) { m2_s = i; m2_e = i + 6; break; } } } if (m1_s < 0 || m1_e < 0 || m2_s < 0 || m2_e < 0) { //printf("δ²éÕÒµ½Ã°ºÅ£ºm1_s:%d m1_end:%d m2_s:%d m2_e:%d\n", m1_s, m1_e, m2_s, m2_e); return; } //3¸öʱ¼äµÄ×ø±ê nps[0] = startx; nps[1] = starty; nps[2] = startx + m1_s - 1; nps[3] = endy; nps[4] = startx + m1_e + 1; nps[5] = starty; nps[6] = startx + m2_s - 1; nps[7] = endy; nps[8] = startx + m2_e + 1; nps[9] = starty; nps[10] = endx; nps[11] = endy; } else if (index % 4 == 1) { if (startx > 0 && endx > 0) { //·Ö¸ôs/m/h int emptyX = -1; for (int x = endx;x >= startx;x--) { bool empty = 1; for (int y = starty;y <= endy;y++) { int p = get_one_level_position(width, x, y); unsigned char value = get_binary_value(img_in[p]); //ÓÐÊý¾Ý if (value > 0) { empty = 0; break; } } if (empty) { emptyX = x; break; } } if (emptyX > 0) { nps[0] = startx; nps[1] = starty; nps[2] = emptyX - 1; nps[3] = endy; } else { //printf("³·µ¥Ê±¼äδ½âÎöµ½·Ö¸ô·û£º%d", index); nps[0] = -1; nps[1] = -1; nps[2] = -1; nps[3] = -1; } } else { nps[0] = -1; nps[1] = -1; nps[2] = -1; nps[3] = -1; } nps[4] = -1; nps[5] = -1; nps[6] = -1; nps[7] = -1; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } else if (index % 4 == 2) { //¹É¼Û //printf("startx:%d starty:%d endx:%d endy:%d\n",startx,starty,endx,endy); //Íùǰ²éÕÒСÊýµã int m_s = -1, m_e = -1; uchar temp[6]; int i; for (i = 0;i < cols;i++) { if (i > cols - 5) { break; } temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]); temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]); temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]); temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]); temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]); temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]); if (temp[2] > 0) { bool empty = 1; for (int y = starty;y < endy;y++) { if (get_binary_value(img_in[get_one_level_position(width, startx + i + 2, y)]) > 0) { empty = 0; break; } } //СÊýµãÉÏ·½Îª¿ÕÖµ if (empty) { unsigned char t = temp[0] + temp[1] + temp[3] + temp[4] + temp[5]; if (t == 0) { m_s = i; m_e = i + 5; break; } } } } if (m_s == -1 || m_e == -1) { //throw("δ²éÕÒµ½Ð¡Êýµã"); //printf("δ²éÕÒµ½Ð¡Êýµã m_s:%d m_e:%d\n", m_s,m_e); return; } nps[0] = startx; nps[1] = starty; nps[2] = startx + m_s - 1; nps[3] = endy; nps[4] = startx + m_e + 1; nps[5] = starty; nps[6] = endx; nps[7] = endy; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } else if (index % 4 == 3) { //ÊÖÊý nps[0] = startx; nps[1] = starty; nps[2] = endx; nps[3] = endy; nps[4] = -1; nps[5] = -1; nps[6] = -1; nps[7] = -1; nps[8] = -1; nps[9] = -1; nps[10] = -1; nps[11] = -1; } //·Ö¸ôÊý¾Ý //×î´ó·Ö¸î6¸öÊý int numCount = 0; //¼Ç¼·Ö¸îµÃµ½µÄÊý¾Ý int numberCols[12]; int i; for (i = 0;i < 3;i++) { if (nps[i * 4] == -1) { break; } int _startx = nps[i * 4]; int _starty = nps[i * 4 + 1]; int _endx = nps[i * 4 + 2]; int _endy = nps[i * 4 + 3]; int _cols = _endx - _startx + 1; int c, startC = -1, endC = -1; for (c = 0;c < _cols;c++) { bool empty = 1; for (int y = _starty;y <= _endy;y++) { unsigned char value = get_binary_value(img_in[get_one_level_position(width, _startx + c, y)]); if (value > 0) { empty = 0; break; } } if (empty) { if (startC > -1 && endC > -1) { numberCols[numCount * 2] = _startx + startC; numberCols[numCount * 2 + 1] = _startx + endC; numCount++; } startC = -1; endC = -1; } else { if (startC == -1) { startC = c; endC = c; } else { endC = c; } } } if (startC > -1 && endC > -1) { numberCols[numCount * 2] = _startx + startC; numberCols[numCount * 2 + 1] = _startx + endC; numCount++; } } int maxNumberCount = 6; if (index % 4 == 3) { maxNumberCount = 5; } else if (index % 4 == 1) { maxNumberCount = 2; } int zeroCount = maxNumberCount - numCount; int fresult[6 * 2]; for (i = 0;i < zeroCount;i++) { fresult[i * 2] = -1; fresult[i * 2 + 1] = -1; } for (i = 0;i < numCount;i++) { fresult[(i + zeroCount) * 2] = numberCols[i * 2]; fresult[(i + zeroCount) * 2 + 1] = numberCols[i * 2 + 1]; } //¿ªÊ¼Ìî³äÊý¾Ý for (i = 0;i < maxNumberCount;i++) { unsigned char numData[100 * 100]; if (fresult[i * 2] == -1) { //Ìî³ä0 for (int r = 0;r < num_height;r++) { for (int c = 0;c < num_width;c++) { unsigned char value = get_binary_value(zero[r * num_width + c]); //ÉèÖÃÊä³ö×ø±êµÄÖµ numData[r * num_width + c] = value; } } } else { int _startx = fresult[i * 2]; int _endx = fresult[i * 2 + 1]; for (int r = starty;r <= endy;r++) { for (int c = 0;c < num_width;c++) { unsigned char value = 0; if (_startx + c <= _endx) { //Ìî³ä¿Õ°×0 value = get_binary_value(img_in[get_one_level_position(width, _startx + c, r)]); //ÉèÖÃÊä³ö×ø±êµÄÖµ numData[(r - starty) * num_width + c] = value; } else { numData[(r - starty) * num_width + c] = 0; } } } } int rowData = num_height * num_width * 10 * num_count; int rowIndex = index / 4; int index_0 = rowData * rowIndex; //ÉèÖÃ×ø±êÖµ int index_2 = 0; if (index % 4 == 0) { index_2 += num_width * 10 * i; } else if (index % 4 == 1) { index_2 += (num_width * 10) * (6 + i); } else if (index % 4 == 2) { index_2 += (num_width * 10) * (6 + 2 + i); } else { index_2 += (num_width * 10) * (6 + 2 + 6 + i); } for (int re = 0;re < 10;re++) { int index_3 = re * num_width; for (int r = 0;r < num_height;r++) { int index_1 = r * (num_width * 10 * num_count); for (int c = 0;c < num_width;c++) { int findex = index_0 + index_1 + index_2 + index_3 + c; //printf("index:%d-findex:%d \n",index, findex); result[findex] = numData[r * num_width + c]; } } } } //printf("\n"); }