1. 程式人生 > >線纜顏色順序檢測(續)

線纜顏色順序檢測(續)

演算法流程

預處理

預處理流程和上一篇類似,只是轉換的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通道適當壓縮,把明暗不同的相同顏色識別為一種。