Распознавание цвета EmguCV

Я пытаюсь создать программу для определения цветов кубика Рубика

это скриншот того, что у меня есть и работает до сих пор, я в основном использовал код из примера Edge Detection, который поставляется с emguCV, и использовал его для обнаружения маленьких кубов (но, как вы можете видеть, некоторые из маленьких кубов не обнаруживаются, но это не та проблема, которую я хочу обсудить здесь).

Теперь, узнав, ГДЕ находятся маленькие кубики, я хочу определить, какого они цвета, в настоящее время я использую значения HSV для определения цвета, например:

if (current_colour.Hue > 120 && current_colour.Hue < 170)
{
     Colours[(int)colornames.W]++;
}
else if (current_colour.Hue > (170))
{
     Colours[(int)colornames.R]++;
}
else if (current_colour.Hue > 5 && current_colour.Hue < 20 )
{
     Colours[(int)colornames.O]++;
}
else if (current_colour.Hue > 47 && current_colour.Hue< 60)
{
     Colours[(int)colornames.G]++;
}
else if (current_colour.Hue > 15 && current_colour.Hue < 30)
{
     Colours[(int)colornames.Y]++;
}
else if (current_colour.Hue > 100 && current_colour.Hue < 110)
{
     Colours[(int)colornames.B]++;
}

где значения для каждого цвета, которые я получил методом проб и ошибок с помощью фотошопа ... Я уверен, что должен быть какой-то лучший способ, поскольку я получаю перемешанные результаты (особенно с белым и красным). Любая помощь?


person 7VoltCrayon    schedule 06.11.2011    source источник
comment
Здравствуйте, используете ли вы все данные в квадрате для получения среднего цвета или только отдельного пикселя, GetAverage выдаст среднее значение для ROI. Чтобы получить лучшие результаты, используйте насыщенность и значение. Вы также можете использовать другой тип изображения, такой как Bgr, для подтверждения результатов, тем более что белый будет (255 255 255) и красный (0,0,255) в идеальном мире. Могу я также сказать, что то, что ты делаешь, выглядит действительно интересно, хорошая работа. Надеюсь, я могу помочь   -  person Chris    schedule 07.11.2011
comment
Эй, Крис, я БЫЛ использовать один пиксель, но теперь я думаю взять среднее значение нескольких (около 9 или 10) пикселей в квадрате (путем написания моей собственной функции) GetAverareage функция, которая сделает это для меня ( Я гуглил, но ничего не нашел).   -  person 7VoltCrayon    schedule 07.11.2011
comment
Привет, да, все, что он делает, это берет ROI, добавляет каждый пиксель и делит на количество пикселей, так что написать свою собственную функцию так же просто. Я ожидаю, что один пиксель будет создавать вашу основную ошибку, поскольку черный будет влиять на цвет, если он находится рядом с краем, благодаря кодированию и сжатию изображения, не говоря уже о шуме. Я бы предложил взять центр квадратов и работать оттуда. Ваше здоровье   -  person Chris    schedule 07.11.2011
comment
Спасибо, я написал свою собственную функцию для усреднения значения по 10 различным точкам выборки, и это, безусловно, очень помогает, теперь все, что мне нужно сделать, это исправить распознавание квадрата (трассировка края)   -  person 7VoltCrayon    schedule 07.11.2011


Ответы (1)


Если ваше изображение такое же простое, как ваш пример, вы можете сделать гистограмму на изображении. Пики на вашей гистограмме будут соответствовать цветам, которые вы используете.

Таким образом, вам нужно сделать гистограмму или три, взять самые высокие 10 (или какие-то) значения ячейки, которые достаточно далеко друг от друга, и вот у вас есть ваши цвета.

person john ktejik    schedule 06.06.2013