Использование круга Opencv и Hough Transform для обнаружения кругов (ошибка нижнего индекса)

Поскольку сейчас у меня школьные каникулы, я решил приобрести некоторые навыки, поэтому я пытаюсь научиться использовать функции OpenCV с Visual Studio С++, чтобы определить, сколько банок находится в коробке, и мне пришлось сгруппировать их 4 на 4. < a href="https://i.stack.imgur.com/ASadO.jpg" rel="nofollow noreferrer">введите описание изображения здесь

Я пробовал различные демонстрационные коды, такие как " opencv find: contour ", сопоставление шаблонов (не работает, так как не может определить вращение верхней крышки)

Наилучший метод, который я обнаружил, заключается в том, чтобы объединить Обнаружение краев Кэнни и Круг преобразования Хафа таким образом, чтобы выходной результат Обнаружения краев Кэнни мог быть входным изображением Круга преобразования Хафа, результат был бы таким, как показано ниже.

введите здесь описание изображения

К сожалению, не все круги распознаются, и если я изменю

for (int i = 0; i < circles.size(); i++) в

for (int i = 0; i < 24; i++) // 24 is the no. of cans

Я получу выражение: индекс вектора вне допустимого диапазона. Я не уверен, почему он может обнаружить только 21 круг.

Исходный код, как показано ниже: -

using namespace cv;
using namespace std;
Mat src, src_gray;

int main()
{
Mat src1;

src1 = imread("cans.jpg", CV_LOAD_IMAGE_COLOR);
namedWindow("Original image", CV_WINDOW_AUTOSIZE);
imshow("Original image", src1);


Mat gray, edge, draw;
cvtColor(src1, gray, CV_BGR2GRAY);

Canny(gray, edge,50, 150, 3);
//50,150,3

edge.convertTo(draw, CV_8U);
namedWindow("Canny Edge", CV_WINDOW_AUTOSIZE);
imshow("Canny Edge", draw);
imwrite("output.jpg", draw);


waitKey(500);




/// Read the image
src = imread("output.jpg", 1);
Size size(932, 558);//the dst image size,e.g.100x100
resize(src, src, size);//resize image

/// Convert it to gray
cvtColor(src, src_gray, CV_BGR2GRAY);

/// Reduce the noise so we avoid false circle detection
GaussianBlur(src_gray, src_gray, Size(9, 9), 2, 2);

vector<Vec3f> circles;

/// Apply the Hough Transform to find the circles
HoughCircles(src_gray, circles, CV_HOUGH_GRADIENT, 1, src_gray.rows / 8,200, 100, 0, 0);

/// Draw the circles detected
for (int i = 0; i < circles.size(); i++)
{
    printf("are you um?\n");
    Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
    int radius = cvRound(circles[i][2]);
    // circle center
    circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    // circle outline
    circle(src, center, radius, Scalar(255, 0, 255), 3, 8, 0);
}

//  namedWindow("Hough Circle Transform Demo", CV_WINDOW_NORMAL);
    imshow("Hough Circle Transform Demo", src);
    line(src, Point(0, 288), Point(1024, 288), Scalar(225, 220, 225), 2, 8);
    // middle line
    line(src, Point(360, 0), Point(360, 576), Scalar(225, 220, 225), 2, 8);
    //break cans into 4 by 4
    line(src, Point(600, 0), Point(600, 576), Scalar(225, 220, 225), 2, 8);
                             //      x, y  
    imshow("Lines", src);
    imwrite("lineoutput.jpg", src);


    waitKey(0);


    return 0;
}

Я также вручную набрал координаты линий, чтобы сгруппировать их по 4 x 4.введите описание изображения здесь Что я должен изменить, чтобы оно не имело ни одной ошибки нижнего индекса вне диапазона и могло обнаружить все круги?


person Lyber    schedule 22.09.2016    source источник
comment
вы не можете получить доступ к большему, чем то, что вы нашли. Он находит 21 круг, поэтому вектор содержит 21 круг. Если вы измените переменную цикла на 24, она получит ошибку нижнего индекса, потому что размер вектора равен 21. Вы не можете получить доступ к большему, чем его размер. Чтобы получить недостающие круги, вы можете добавить круги из вашей программы. Это не всегда будет работать, но в какой-то степени это сработает. это как сетка 6x4. Из расстояния между центрами вы можете легко предположить, какие круги отсутствуют.....   -  person MD. Nazmul Kibria    schedule 22.09.2016
comment
Я не думаю, что буду вручную добавлять круги, так как у меня есть более 10 изображений с разным освещением и положением. Спасибо! исправлена ​​ошибка нижнего индекса, моя сетка 6x4, вероятно, просто для галочки, так как она ничего не делает :l   -  person Lyber    schedule 22.09.2016


Ответы (1)


Хорошо решил свой вопрос. Изменено CV_BGR2GRAY на CV_RGB2GRAY, уменьшено соотношение файлов, изменен минимальный радиус кругов и применен другой порог для получения кругов. введите здесь описание изображения

person Lyber    schedule 22.09.2016
comment
попробуй разный свет и другие условия... у тебя не всегда будут все круги. это может потерпеть неудачу у немногих :) - person MD. Nazmul Kibria; 22.09.2016
comment
да.. Я пробовал с разным освещением и, к сожалению, не смог получить весь круг без изменения значений кодов :c Интересно, есть ли какое-нибудь решение для этого? - person Lyber; 22.09.2016
comment
Сопоставление функций, таких как Ransac и просеивание? - person Lyber; 23.09.2016