2016-06-09 3 views
-1

저는 손으로 그린 ​​스케치에서 획을 찾는 방법을 찾고 있습니다. 내 실제 접근 방식은 OpenCV에서 adaptive thresholding 및 findContours를 적용하는 것입니다. 이 문제는 findContours가 나에게 오른손 쪽과 왼손쪽에 하나의 단일 획의 위쪽과 아래쪽 윤곽을 준다는 것입니다. 손으로 그린 ​​획 중 하나의 윤곽 표현을 유도하는 방법이 있습니까?스케치에서 줄 감지

편집 사전에

감사 : 여기

코드와 지금까지 달성 한 무엇의 이미지입니다 :

Imgproc.GaussianBlur(image, image, new Size(5, 5), 3); 
Mat thresholded = Mat.zeros(image.size(), CvType.CV_8U); 
: 나는 초기 이미지 적응 형 임계 값을 적용

우선

그런 다음 임계 값 이미지에 findCountours를 적용하고 각 윤곽에 approxPolyDB를 추가로 적용했습니다.

Imgproc.findContours(thresholded, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0)); 

List<MatOfPoint> refinedContours = new ArrayList<MatOfPoint>(); 
for (int i = 0; i < contours.size(); i++) { 
    MatOfPoint2f approx = new MatOfPoint2f(); 
    Imgproc.approxPolyDP(mop2mop2f(contours.get(i)), approx, 6, true); 
} 

이후 각도가 고정 된 임계 값보다 큰 지점에서 각 윤곽을 분할합니다. 마지막 단계로서 주어진 임계 값보다 길지 않은 모든 윤곽을 삭제했습니다.

In the picture you can see the thresholded image as the final contours

내 목표는 스케치 된 이미지에서 한 스트로크에 대해 하나의 윤곽이하는 방식으로 병렬 윤곽을 방지하는 것입니다.

감사합니다.

+6

당신은 당신의 코드와 샘플 이미지를 게시 할 수 있을까요? – Berriel

답변

0

등고선 찾기에 윤곽 파인더가 사용됩니다. 그것은 당신이 약간의 두께의 몸체를 말하려는 윤곽에 관심이있는 경우에만 의미가 있습니다. 라인에 관심이 있습니다. 두꺼운 선에 윤곽 파인더를 적용하면 더 많은 데이터를 처리 할 수있는 선이 아닌 2 개의 선으로 끝납니다.

대신 씬 알고리즘을 사용해 보시기 바랍니다. 적절한 임계 값을 사용하여 이미지를 바이너리 화 한 다음 시닝/골격화 알고리즘을 적용합니다.

원할 경우 형상 맺기를 사용하여 틈새를 채울 수 있습니다.

프 루닝 알고리즘을 사용하여 골격을 정리하십시오.

읽기이 : http://homepages.inf.ed.ac.uk/rbf/HIPR2/thin.htm

+0

답변 해 주셔서 감사합니다. 어떤 종류의 숱이 구현되었고 매력처럼 작동하지만 findCountours가 등고선과 같은 씬 라인 표현을 검색하는 방법에 대한 아이디어가 있습니까? – mapeza

+0

findContours가 반환하는 점 벡터를 의미하는 경우 픽셀을 좌표로 사용하기 만하면됩니다. 라인을 얇게 썼다면 두께가 1이되어 꽤나 똑바로 나옵니다. 물론 그러한 구조의 특징을 추출 할 수있는 수많은 수학적 방법이 있습니다. – Piglet

관련 문제