2016-07-13 2 views
3

В настоящее время я сделал изображение, состоящее из черных и зеленых точек ... Я сделал его печать, а затем щелкнул его с помощью своей камеры ..... После этого я сделал программа для сканирования этого изображения в opencv. Вот изображение:Идентификация зеленых кругов с этого изображения

enter image description here

Это код

image = imread("ImageTryse.jpg", 1); // Read the image 
cv::resize(image, image, Size(800, 800), 0, 0, cv::INTER_CUBIC); 
Mat image_gray = IncreaseContrast(image); 
cvtColor(image_gray, image_gray, CV_BGR2GRAY); 
vector<vec3f> circles1; 
HoughCircles(image_gray, circles1, CV_HOUGH_GRADIENT, 2, 10, 100, 22, 10, 17); 

Я могу сканировать круги с этим кодом и запустить цикл по каждому из них .... Но теперь я хочу знать погоду круг зеленый или черный .... Я не знаю, как я могу это сделать .... Я попытался преобразовать его в hsv, но он показывал разные цвета на стороне, имеющей свет ..... Пожалуйста помогите мне решить эту проблему ....

+0

На самом деле, я думаю, что это может быть проще обнаружить в BGR, а не в HSV. Пробовали ли вы смотреть на отношение компонента Green к красному (или синему) компоненту обнаруженных дисков? – beaker

+0

@beaker, это полная бессмыслица. BGR <-> Преобразование HSV полностью биективно. –

+0

Я решил вашу проблему с кодом и примерами и отредактировал ответ. Не забудьте проверить! –

ответ

1

OpenCV имеет функцию, называемую InRange (в C++ это будет cv2.InRange, Java-Core.InRange). В этой функции вы предоставляете два объекта Scalar: один начинает цвет BGR диапазона цветов, другой - это конец. Он вернет вам маску белых пикселей: белый цвет находится в диапазоне, черный - нет. Дополнительная информация HERE. Я бы рекомендовал вам позвонить InRange до HoughCircles, было бы легче определить, какие объекты зеленых кругов, а не зеленые круги.

Я опробовал этот метод для решения вашей проблемы:

  • Во-первых, я выполняю функцию InRange с началом HSV значения Scalar(37, 38, 70) и заканчивая Scalar(85, 255, 200). Обратите внимание, что вы не добавляете значения RGB или BGR в Scalar, это цвет HSV (от H (0-180), S (0-255), V (0-255), как указано в THIS)):

enter image description here

  • во-вторых, я выполняю Algorythm HoughCircles, как вы в вашем коде:

enter image description here

Как вы видите, есть один круг, где Шоул d не будет, также круги могут отличаться по размеру на обеих картинках. Я настоятельно рекомендую вам играть со значениями функции InRange, чтобы улучшить выбор цвета, сделать круги круглыми и более совершенными, и HoughCircles, чтобы избежать случайных и ненужных кругов, когда я получил один из них в середине последнего изображения. Кроме того, я предложил бы вам экспериментировать с Canny algorythm (Canny edge detector), чтобы очистить центры этих объектов, возможно, ваши результаты улучшатся.

код в Java, но вы должны легко понять, как ваше беспокойство в основном функция InRange:

Mat src = new Mat(); 
Mat circles = new Mat(); 
Mat result; 

Utils.bitmapToMat(Image, src); 
Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2HSV); 

Core.inRange(src, new Scalar(37, 38, 70), new Scalar(85, 255, 200), src); 
Imgproc.HoughCircles(src, circles, Imgproc.CV_HOUGH_GRADIENT, 2, 30, 100, 22, 10, 17); 

result = new Mat(src.rows(), src.cols(), CvType.CV_8UC1, new Scalar(0,0,0)); 
for (int i = 0; i < circles.cols(); i++) 
{ 
    double[] circle = circles.get(0, i); 
    if (circle == null) break; 
    Point center = new Point(Math.round(circle[0]), Math.round(circle[1])); 
    int radius = (int)Math.round(circle[2]); 
    Imgproc.circle(result, center, radius, new Scalar(255, 0, 0)); 
} 
return result; 

В конце концов, это даже алгоритм с нужными значениями не может быть совершенным. Я думаю, что можно получить действительно большие или идеальные результаты с правильными значениями (у меня, к сожалению, не было много времени, чтобы узнать их, поэтому я оставляю это вам), но если вам нужен идеальный результат, я бы предложил вам экспериментировать в более широком спектре. Например, вызов функции Canny на цветном изображении (например, вы предоставили) может дать вам очень точные контуры кругов и других объектов. Затем, например, вы можете выполнить функцию HoughCircles на этих контурах и иметь данные из них, очистить все пиксели за пределами кругов. Затем с помощью InRange вы можете проверить цвета кругов и отсортировать их ...Но это просто теоретическое. Попробуйте все, что приходит на ум. Это экспериментирование может дать вам более корректный результат, чем обновленный текущий. Удачи!

+0

Спасибо, я понимаю java и могу передать его на C++ .... –

+0

Я знал о функции inrange раньше, но я не смог найти значения для этого .... Можете ли вы помочь мне найти идеальные значения .... Или вы можете предложить любой способ, которым я могу это сделать. –

+0

На самом деле у меня очень минимальный опыт работы с этой функцией. Я предлагаю вам найти подборщик цветов HSV в Интернете и попытаться найти приблизительный диапазон желаемого цвета. Это может занять несколько раз, чтобы найти баланс, но это единственный способ, о котором я могу думать. –

1

Хорошо, я просто попытался с подходом HSV и с небольшим пробным и ошибочным результатом, я смог найти диапазон, для которого будет отображаться только зеленый регион. Как только вы получите изображение с белыми пикселями, показывающими положение зеленого круга, вы можете вызвать HoughCircles.

Диапазон HSV является (32,22,0) до (103,142,160)

Я надеюсь, что это решает проблемы. :)

Смежные вопросы