Поскольку сейчас мой школьный праздник, я решил приобрести некоторые навыки, поэтому я пытаюсь научиться использовать функции OpenCV с Visual Studio C ++ для определения количества банок в коробке, и мне пришлось сгруппировать их 4 на 4.
Я пробовал различные демонстрационные коды, такие как «opencv find: contour», сопоставление с шаблоном (не работает должным образом, так как не может обнаружить вращение верхней крышки)
Лучший метод, который я обнаружил, состоит в том, чтобы объединить Canny Edge Detection и Hough Transform Circle так, чтобы выходным результатом Canny Edge Detection могло быть входное изображение Hough Transform Circle, результат будет таким, как показано ниже.
К сожалению, не все круги обнаружены, и если я изменю
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.
Что я должен изменить, чтобы у него не было ошибки нижнего индекса за пределами диапазона, и чтобы он мог обнаруживать все круги?
Хорошо, решил мой собственный вопрос. Изменил CV_BGR2GRAY на CV_RGB2GRAY, уменьшил соотношение файлов, изменив минимальный радиус кругов и применив другой порог, чтобы получить круги.
Других решений пока нет …