opencv進行rect檢測時,當檢測到多個rect,組成rect vector以後,有些rect是由一個區域誤分割獲得的,spa
能夠按照某種規格將這些rect合併爲一個rect。好比按照x,y,width,height特性。.net
能夠先按照x座標或者y座標排序。code
//按照X座標排序 bool BOCR::rect_rank_x(vector<Rect> &vec_rects) { Rect vec_temp; for (int l = 1; l < vec_rects.size(); l++) { for (int m = vec_rects.size() - 1; m >= l; m--) { if (vec_rects[m].x < vec_rects[m - 1].x) { vec_temp = vec_rects[m - 1]; vec_rects[m - 1] = vec_rects[m]; vec_rects[m] = vec_temp; } } } return true; } //按照X座標排序 bool BOCR::rect_rank_y(vector<Rect> &vec_rects) { Rect vec_temp; for (int l = 1; l < vec_rects.size(); l++) { for (int m = vec_rects.size() - 1; m >= l; m--) { if (vec_rects[m].y < vec_rects[m - 1].y) { vec_temp = vec_rects[m - 1]; vec_rects[m - 1] = vec_rects[m]; vec_rects[m] = vec_temp; } } } return true; } /*將rect上下合併 * 參數:vec_rects:輸入的全部的rect集合; * vec_rects_out:輸出的上下合併後的全部的rect集合; * x_dif:進行上下合併的x差值;y_dif:進行上下合併的y差值; * width:進行上下合併的width最大值;height:進行上下合併的height最大值; width_rect:合併後的rect的width的值大於width_rect爲知足條件 */ bool BOCR::rect_combine_uplow(vector<Rect> &vec_rects, vector<Rect>&vec_rects_out, int x_dif, int y_dif, int width, int height, int width_rect) { rect_rank_y(vec_rects); //將上下部分分裂的,合併 int num_rect = vec_rects.size(); for (int j = 0; j < num_rect; j++) { if (vec_rects[j].width > 0) { Rect r; for (int p = 0; p < num_rect; p++) { if ((vec_rects[p].width > 0) && (p > j || p < j)) { if ((((abs(vec_rects[p].x - vec_rects[j].x) < x_dif) || (abs( vec_rects[p].x + vec_rects[p].width - vec_rects[j].x - vec_rects[j].width) < x_dif)) && ((abs( vec_rects[p].y - (vec_rects[j].y + vec_rects[j].height)) < y_dif) || (abs( vec_rects[j].y - (vec_rects[p].y + vec_rects[p].height)) < y_dif)) && (vec_rects[p].height < height) && (vec_rects[j].height < height) && (vec_rects[p].width < width) && (vec_rects[j].width < width))) { r.x = min(vec_rects[j].x, vec_rects[p].x); r.y = min(vec_rects[j].y, vec_rects[p].y); r.width = max( vec_rects[p].x + vec_rects[p].width - vec_rects[j].x, vec_rects[j].x + vec_rects[j].width - vec_rects[p].x); r.height = max( vec_rects[j].y + vec_rects[j].height - vec_rects[p].y, vec_rects[p].y + vec_rects[p].height - vec_rects[j].y); if (vec_rects[p].y < vec_rects[j].y) { vec_rects[p].width = 0; vec_rects[p].x = 0; vec_rects[p].height = 0; vec_rects[p].y = 0; vec_rects[j] = r; } else { vec_rects[j].width = 0; vec_rects[j].x = 0; vec_rects[j].height = 0; vec_rects[j].y = 0; vec_rects[p] = r; } } } } } } for (int j = 0; j < num_rect; j++) { if (vec_rects[j].width > width_rect) { vec_rects_out.push_back(vec_rects[j]); } } return true; } /*將rect左右合併 * 參數: * show:輸入圖像; * vec_rects:輸入的全部的rect集合; * vec_rects_out:輸出的左右合併後的全部的rect集合; * x_dif:進行左右合併的x差值;y_dif:進行左右合併的y差值; * width:進行左右合併的width最大值;height:進行左右合併的height最大值; * rate1:rect的長寬比最小值1;rate2:rect的長寬比最小值2; * width_rect:合併後的rect的width的值大於width_rect爲知足條件 */ bool BOCR::rect_combine_leftright(Mat & show, vector<Rect> &vec_rects, vector<Rect>&vec_rects_out, int x_dif, int y_dif, int width, int height, double rate1, double rate2, int width_rect) { int num = vec_rects.size(); for (int j = 0; j < num - 1; j++) { if (vec_rects[j].width > 0) { for (int q = j + 1; q < num; q++) { if (vec_rects[q].width > 0) { Rect r; if ((max(vec_rects[q].x - x_dif, 0) < min(vec_rects[j].x + vec_rects[j].width, show.cols)) && ((abs(vec_rects[q].y - vec_rects[j].y) < y_dif) || (abs( min( vec_rects[q].y + vec_rects[q].height, show.rows) - min( vec_rects[j].y + vec_rects[j].height, show.rows)) < y_dif)) && (vec_rects[q].width < width) && (vec_rects[j].width < width) && (((vec_rects[q].height / (double) vec_rects[q].width > rate1) && (vec_rects[j].height / (double) vec_rects[j].width > rate2)) || ((vec_rects[j].height / (double) vec_rects[j].width > rate1) && (vec_rects[q].height / (double) vec_rects[q].width > rate2)))) { if ((vec_rects[j].x + vec_rects[j].width > show.cols / 10 * 8.5) && (vec_rects[q].x > show.cols / 10 * 8.5) && abs(vec_rects[j].width - vec_rects[q].width) < 4 && abs( vec_rects[j].height - vec_rects[q].height) < 3) { ; } else { r.x = vec_rects[j].x; r.y = min(vec_rects[j].y, vec_rects[q].y); r.width = vec_rects[q].x + vec_rects[q].width - vec_rects[j].x; r.height = max(vec_rects[j].y + vec_rects[j].height, vec_rects[q].y + vec_rects[q].height) - r.y; vec_rects[q].width = 0; vec_rects[q].x = 0; vec_rects[j] = r; } } } } } } for (int j = 0; j < num; j++) { if (vec_rects[j].width > width_rect) { vec_rects_out.push_back(vec_rects[j]); } } return true; } ———————————————— 版權聲明:本文爲CSDN博主「等待破繭」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。 原文連接:https://blog.csdn.net/boon_228/article/details/51491789