do a desperate attempt at cracking lines
| 123 | |
| 124 | // do a desperate attempt at cracking lines |
| 125 | Pixa *CubeLineSegmenter::CrackLine(Pix *cracked_line_pix, |
| 126 | Box *cracked_line_box, int line_cnt) { |
| 127 | // create lines pixa array |
| 128 | Pixa **lines_pixa = new Pixa*[line_cnt]; |
| 129 | |
| 130 | memset(lines_pixa, 0, line_cnt * sizeof(*lines_pixa)); |
| 131 | |
| 132 | // compute line conn comps |
| 133 | Pixa *line_con_comps_pix; |
| 134 | Boxa *line_con_comps = ComputeLineConComps(cracked_line_pix, |
| 135 | cracked_line_box, &line_con_comps_pix); |
| 136 | |
| 137 | if (line_con_comps == NULL) { |
| 138 | delete []lines_pixa; |
| 139 | return NULL; |
| 140 | } |
| 141 | |
| 142 | // assign each conn comp to the a line based on its centroid |
| 143 | for (int con = 0; con < line_con_comps->n; con++) { |
| 144 | Box *con_box = line_con_comps->box[con]; |
| 145 | Pix *con_pix = line_con_comps_pix->pix[con]; |
| 146 | int mid_y = (con_box->y - cracked_line_box->y) + (con_box->h / 2), |
| 147 | line_idx = MIN(line_cnt - 1, |
| 148 | (mid_y * line_cnt / cracked_line_box->h)); |
| 149 | |
| 150 | // create the line if it has not been created? |
| 151 | if (lines_pixa[line_idx] == NULL) { |
| 152 | lines_pixa[line_idx] = pixaCreate(line_con_comps->n); |
| 153 | if (lines_pixa[line_idx] == NULL) { |
| 154 | CleanupCrackLine(line_cnt, lines_pixa, &line_con_comps, |
| 155 | &line_con_comps_pix); |
| 156 | return NULL; |
| 157 | } |
| 158 | } |
| 159 | |
| 160 | // add the concomp to the line |
| 161 | if (pixaAddPix(lines_pixa[line_idx], con_pix, L_CLONE) != 0 || |
| 162 | pixaAddBox(lines_pixa[line_idx], con_box, L_CLONE)) { |
| 163 | CleanupCrackLine(line_cnt, lines_pixa, &line_con_comps, |
| 164 | &line_con_comps_pix); |
| 165 | return NULL; |
| 166 | } |
| 167 | } |
| 168 | |
| 169 | // create the lines pixa |
| 170 | Pixa *lines = pixaCreate(line_cnt); |
| 171 | bool success = true; |
| 172 | |
| 173 | // create and check the validity of the lines |
| 174 | for (int line = 0; line < line_cnt; line++) { |
| 175 | Pixa *line_pixa = lines_pixa[line]; |
| 176 | |
| 177 | // skip invalid lines |
| 178 | if (line_pixa == NULL) { |
| 179 | continue; |
| 180 | } |
| 181 | |
| 182 | // merge the pix, check the validity of the line |
nothing calls this directly
no test coverage detected