2016-09-22 6 views
0

Как сейчас, мой школьный отпуск, я решил поднять некоторые навыки, таким образом, я пытаюсь научиться использовать функции OpenCV с визуальной студией C++, чтобы определить, как многие банки в картонной упаковке и должны были группой она 4 на 4. enter image description hereИспользование Opencv и Hough. Преобразование круга для обнаружения кругов. (44).

Я попробовал различные демонстрационные коды, такие как «OpenCV найти: контур», согласование шаблонов (не работает хорошо, поскольку он не может обнаружить вращение верхней крышки)

Лучший способ, который я обнаружил, состоит в том, чтобы объединить Canny Edge Detection и Hough Transform Circle таким образом, чтобы результат вывода Canny Edge Detection мог быть входное изображение Круга преобразования Хафа, результат следующий.

enter image description here

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

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. enter image description here Что я должен изменить, чтобы у него не было ошибки в индексе и не удалось обнаружить все круги?

+0

У вас нет доступа к более чем тем, что вы нашли. Он обнаружил 21 круг, поэтому вектор содержит 21 круг. Если вы измените переменную цикла на 24, она получит ошибку индексации, так как размер вектора равен 21. Вы не можете получить доступ к большему, чем его размер. Чтобы получить недостающие круги, вы можете добавить круги из своей программы. Это не всегда будет работать, но в некоторой степени это сработает. его как сетка 6x4. Из расстояния между центрами вы можете легко предположить, какие круги отсутствуют ..... –

+0

Я не думаю, что вручную добавлю круги, поскольку у меня есть 10 + изображений с различным освещением и положением. Спасибо! исправлена ​​ошибка индекса, моя сетка 6x4, вероятно, просто для показа, поскольку она ничего не делает: l – Lyber

ответ

1

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

+0

попробуйте различные световые и другие условия ... у вас не будет всех кругов всегда. это может не сработать немного :) –

+0

да .. Я пробовал с различным освещением, и, к сожалению, я не мог получить весь круг, не изменяя значения кодов: c Есть ли какое-то решение для этого? – Lyber

+0

Особенности, такие как Ransac и просеивание? – Lyber