2014-12-23 3 views
1

드로잉 앱에 자동 완성 기능을 구현하고 싶습니다. 자유형 오브젝트가 그려지면 오브젝트 유형 (원/직사각형/삼각형)을 감지하고 결과에 따라 해당 오브젝트를 플롯해야합니다.드로잉 경로가 xcode의 원/사각형인지 확인합니다.

OpenCV에 대해 조금 읽었지만 실시간으로 이미지로 사용자 그림을 변환해야합니다. 터치로 플롯/추적 한 포인트 수를 기록하고 해당 경로의 UIBeizerPath도 생성합니다. 모양 유형을 감지하려면 어떻게해야합니까?

답변

0

먼저 데이터 포인트를 분할해야합니다. 관련 기사를 찾기 위해 "스트로크 분할"에 관한 Google. 하나의 간단하고 빠른 알고리즘은 각 데이터 포인트에 대해 전방 경사와 후방 경사를 계산 한 다음 전방 경사와 후방 경사 사이의 전복 각도를 계산하는 것입니다. 선회 각도가 특정 각도 임계 값보다 큰 경우 경로가 선회하는 것으로 가정 할 수 있습니다. 계산 된 날카로운 턴의 수에서 포인트가 삼각형 (2 개의 날카로운 전환), 4 차 (3 개의 전환) 또는 다른 것을 나타내는 지 여부를 추측 할 수 있습니다. 데이터 포인트가 원 또는 직사각형을 나타내는 것으로 추론하려면 추가 계산이 필요합니다. 예를 들어 날카로운 선회가 전혀없는 경우 데이터 포인트에 맞는 원을 사용하여 맞춰진 원의 최대 오차가 특정 허용 오차보다 작은 지 확인합니다. 직사각형을 출력하려면 직선을 데이터 요소의 각 세그먼트에 맞추고 맞춰진 선이 서로 직각을 이루는 지 확인해야합니다.

+0

흥미 롭습니다! 나는 당신의 접근법을 따라 갔지만, 불행히도 점들의 순서는 사소한 오프셋 (즉, 그들은 직선 상에 있지 않다)을 가지고 있으며 따라서 공식을 적용하면 날카로운 전환점이 많이 생겼다. 삼각형의 경우 나는 70 개의 날카로운 전환점을 얻었고, 그 다음에 표본 크기를 줄 였지만 여전히 18 개의 돌기가 돌아가고있었습니다. –

+0

역/전방 기울기를 계산할 때 현재 점의 앞뒤에있는 여러 점을 사용하십시오. 예를 들어, 점 P (i)에 대한 역/전방 기울기를 계산할 때 점 P (i-m) 및 P (i + m)을 사용합니다. 점 밀도에 따라 m 값을 선택하십시오. 이렇게하면 사소한 데이터 노이즈로 인한 급격한 회전을 피할 수 있어야합니다. – fang

+0

예, 의견을 게시 한 후 필자는 샘플링 크기를 줄여야한다고 생각했습니다. 지금 나는 올바른 값을 얻는 것처럼 보입니다. 그러나 삼각형에 대해서 저는 2와 3 대신에 2 턴을 얻었습니다. 때로는 2 턴을 얻습니다. 회전 각도 임계 값은 더 많은 작업이 필요합니다. –

0

UIBezierPath 점을 사용하여 CGPathApply(..) 방법으로 반복 할 수 있습니다. 예 : Look here.

그러나 모양 유형을 어떻게 든 결정해야합니다. 수학적 작업이고 접근 방식은 입력 데이터에 따라 다릅니다.

+0

내 질문에 어딘가에 숨겨져 있다고 생각하지만 이미 경로에 대한 포인트가 있습니다. 나는 모양을 감지하는 방법에 관한 수학을보고있다. –