線纜顏色順序檢測(續)
阿新 • • 發佈:2018-12-18
演算法流程
預處理
預處理流程和上一篇類似,只是轉換的LAB顏色空間
cvtColor(src_all, hsv, CV_BGR2Lab);
邊界識別
和上一篇類似
float L[WIDTH] = { 0 }; float A[WIDTH] = { 0 }; float B[WIDTH] = { 0 }; float LL[WIDTH] = { 0 }; float AA[WIDTH] = { 0 }; float BB[WIDTH] = { 0 }; int pointcount[WIDTH] = { 0 }; for (int i = 0; i < hsv.size().width; i++) { float h, s, v; h = 0; s = 0; v = 0; for (int j = hsv.size().height / 2; j < hsv.size().height / 2 + 2; j++) //hsv.size().height { Vec3b vec3b = hsv.at<Vec3b>(j, i); h += vec3b[0]; s += vec3b[1]; v += vec3b[2]; } L[i] = h; A[i] = s; B[i] = v; }
繪製的折線圖 然後進行分割
//需要對資料進行平滑 int filtersize = 5; for (int i = filtersize; i < WIDTH- filtersize; i++) { int suml = 0, suma = 0, sumb = 0; for (int j = -filtersize; j <= filtersize; j++) { suml += L[i + j]; suma += L[i + j]; sumb += L[i + j]; } LL[i] = suml / (filtersize * 2 + 1); AA[i] = suma / (filtersize * 2 + 1); BB[i] = sumb / (filtersize * 2 + 1); } //用球包含空間附近的點 for (int i = 0; i < WIDTH; i++) { int j = -20; int jmax = 20; for (; j <= jmax; j++) { if (i + j >= 0 && i + j < WIDTH) { int dis = (LL[i] - LL[i + j])*(LL[i] - LL[i + j]) + (AA[i] - AA[i + j])*(AA[i] - AA[i + j]) + (BB[i] - BB[i + j])*(BB[i] - BB[i + j]); if (dis < 1000) pointcount[i]++; } } } //pointcount找極小值 int position[30] = { 0 }; int position_left[30] = { 0 }; int position_right[30] = { 0 }; int current_position_count = 0; bool done_flag = 0; for (int i = 1; i <= 35; i++) { for (int j = 100; j < WIDTH-100; j++) { if (pointcount[j] == i) { done_flag = 0; for (int k = 0; k < current_position_count; k++) { if (j > position_left[k] - 30 && j < position_right[k] + 30) { //加入當前position if (j < position_left[k]) position_left[k] = j; if (j > position_right[k]) position_right[k] = j; done_flag = 1; } } //如果和所以的都不符合,建立新的的position if (!done_flag) { position_left[current_position_count] = j; position_right[current_position_count] = j; position[current_position_count] = j; current_position_count++; } } } }
處理後結果 效果比使用HSV顏色空間好很多,而且由於使用的新的演算法,考慮了線纜的空間約束,識別的穩定性大幅提高。
顏色識別
顏色識別仍使用歐式距離的方式,但是考慮到光照的不均勻和變化,可以把L通道適當壓縮,把明暗不同的相同顏色識別為一種。