Как сейчас, мой школьный отпуск, я решил поднять некоторые навыки, таким образом, я пытаюсь научиться использовать функции OpenCV с визуальной студией C++, чтобы определить, как многие банки в картонной упаковке и должны были группой она 4 на 4. Использование Opencv и Hough. Преобразование круга для обнаружения кругов. (44).
Я попробовал различные демонстрационные коды, такие как «OpenCV найти: контур», согласование шаблонов (не работает хорошо, поскольку он не может обнаружить вращение верхней крышки)
Лучший способ, который я обнаружил, состоит в том, чтобы объединить Canny Edge Detection и Hough Transform Circle таким образом, чтобы результат вывода Canny Edge Detection мог быть входное изображение Круга преобразования Хафа, результат следующий.
К сожалению, не все круги обнаружена, и если я изменить
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 х 4. Что я должен изменить, чтобы у него не было ошибки в индексе и не удалось обнаружить все круги?
У вас нет доступа к более чем тем, что вы нашли. Он обнаружил 21 круг, поэтому вектор содержит 21 круг. Если вы измените переменную цикла на 24, она получит ошибку индексации, так как размер вектора равен 21. Вы не можете получить доступ к большему, чем его размер. Чтобы получить недостающие круги, вы можете добавить круги из своей программы. Это не всегда будет работать, но в некоторой степени это сработает. его как сетка 6x4. Из расстояния между центрами вы можете легко предположить, какие круги отсутствуют ..... –
Я не думаю, что вручную добавлю круги, поскольку у меня есть 10 + изображений с различным освещением и положением. Спасибо! исправлена ошибка индекса, моя сетка 6x4, вероятно, просто для показа, поскольку она ничего не делает: l – Lyber