2016-09-22 4 views
0

방금 ​​학교 수업이 끝났으므로 몇 가지 기술을 습득하기로 결정했습니다. 따라서 Visual C++에서 OpenCV 기능을 사용하는 방법을 배우려고합니다. 많은 깡통이 상자에 있으며 4 x 4로 그룹화해야했습니다. "opencv 찾기 : 등고선", 템플릿 일치 (회전을 감지 할 수 없어 잘 작동하지 않습니다. 상단 뚜껑의Opencv 및 Hough 변환 서클을 사용하여 서클 감지 (서브 스크립트 오류)

내가 아는 가장 좋은 방법은 Canny Edge Detection과 Hough Transform Circle을 결합하여 Canny Edge Detection의 출력 결과를 Hough Transform Circle의 입력 이미지는 다음과 같습니다.

enter image description here

불행히도, 모든 원은 감지되고 난

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

for (int i = 0; i < circles.size(); i++)을 변경하면 내가 표현 얻을 것이다 : 범위를 벗어 벡터 첨자. 나는 또한 수동으로 4 × 4 enter image description here으로 그룹을에 라인에 대한 좌표를 입력 한

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; 
} 

- : 다음과 같이

소스 코드 21 원을 감지 할 경우에만 수있는 이유는 확실하지 않다 아래 첨자가 범위를 벗어나서 모든 서클을 감지 할 수 없도록 변경하려면 어떻게해야합니까?

+0

더 이상 액세스 할 수 없습니다. 그것은 21 개의 동그라미를 찾았습니다. 그래서 벡터는 21 개의 동그라미를 포함합니다. 루프 변수를 24로 변경하면 벡터 크기가 21이기 때문에 아래 첨자 오류가 발생합니다. 크기보다 큰 값은 액세스 할 수 없습니다. 누락 된 서클을 얻으려면 프로그램의 서클을 추가 할 수 있습니다. 그것은 항상 작동하지는 않지만 어느 정도는 작동 할 것입니다. 그 6x4의 그리드처럼. 센터 거리에서 어떤 서클이 없어 졌는지 쉽게 추측 할 수 있습니다 ..... –

+0

다른 조명과 위치로 10 개 이상의 이미지가있는 경우 수동으로 원을 추가 할 것이라고 생각하지 않습니다. 감사합니다. 아래 첨자 오류를 수정했는데, 6x4의 그리드는 아무것도 보이지 않기 때문에 아마 단지 보여주기위한 것일 것입니다. l – Lyber

답변

1

좋아요. 내 자신의 질문을 해결했습니다. CV_BGR2GRAY를 CV_RGB2GRAY로 변경하여 파일 비율을 더 작게 만들었으며 원의 최소 반경을 변경하고 원을 얻기 위해 다른 임계 값을 적용했습니다. enter image description here

+0

다른 빛과 다른 조건을 시도해보십시오. 항상 모든 서클을 가지지는 않을 것입니다. 그것은 몇 가지 실패 할 수 있습니다 :) –

+0

예 .. 나는 다른 조명으로 시도하고 불행히도 코드의 값을 변경하지 않고 모든 원을 얻을 수 없습니다 : C 내가 궁금해 어떤 해결책이 있습니까? – Lyber

+0

Ransac 및 sift와 같은 기능 일치? – Lyber