std::vector< Vec4i > get_v_lines(Mat& img) { int h = img.rows; int w = img.cols; std::vector< Vec4i > lines; unsigned int length_th = 200; for (int y = 0; y<h; y++) { int x1 = 0; int x2 = 0; int in_row = 0; Vec4i longest_line(0, 0, 0, 0); for (int x = 0; x<w; x++) { if (img.at<unsigned char>(y, x) < 140) { if (in_row == 0) x1 = x; in_row += 1; } else { if (in_row > length_th) lines.push_back(Vec4i(x1, y, x, y)); in_row = 0; } } if (in_row > length_th) lines.push_back(Vec4i(x1, y, w - 1, y)); } return lines; }
/* This function calls "add_line_to_node" for each line of the vocab file. */ int add_line(vocab_t **listavocab, FILE *archivo, int cat) { char *buffer; int num_nodes = 0; unsigned short learning = 0; char tipo; buffer = (char *)calloc(longest_line(archivo)+1,sizeof(char)); rewind(archivo); while (fscanf(archivo,"%c", &tipo) != EOF) { // It's a word. if (tipo == '&') { if (fscanf(archivo,"%hu %*c %[^\n] %*[\n]",&learning, buffer) != EOF) { if (add_line_to_node(listavocab,buffer, true, cat, learning)) num_nodes++; } // It's a category. } else if (tipo == ';') { if (fscanf(archivo," %*c %[^\n] %*[\n]", buffer) != EOF) { if (add_line_to_node(listavocab,buffer,false, cat, learning)) num_nodes++; } } } if (buffer) { free(buffer); buffer = NULL; } return num_nodes; }
std::vector< Vec4i > get_h_lines(Mat& img) { int h = img.rows; int w = img.cols; std::vector< Vec4i > lines; int length_th = 100; for (int x = 0; x<w; x++) { int y1 = 0; int in_row = 0; int longest = 0; Vec4i longest_line(0, 0, 0, 0); for (int y = 0; y<h; y++) { if (img.at<unsigned char>(y, x) < 140) { if (in_row == 0) y1 = y; in_row += 1; } else { if (in_row > length_th) lines.push_back(Vec4i(x, y1, x, y - 1)); in_row = 0; } } if (in_row > length_th) lines.push_back(Vec4i(x, y1, x, h - 1)); } return lines; }