2010-07-03 4 views
4

문자 및 기호 (기본적으로 단일 ASCII 문자 및 음악 표기법과 같은 기호를 처리해야하는 OCR)의 분류가 필요한 프로젝트 작업 중입니다. 나는 벡터 그래픽 (WPF의 Paths와 Glyphs)을 사용하여 이미지의 해상도와 회전 수를 무시할 수 있습니다. 교육 세트에 포함되지 않은 글꼴과 경로를 분류해야합니다 (아마도 배울 것입니다). 높은 정확도가 우선시 되기는하지만 성능은 중요합니다.기호/이미지 분류에 대한 조언

일부 (OpenCV의 .Net 래퍼)을 보았습니다. 그러나 내가 찾는 예제와 튜토리얼은 분류가 아닌 이미지 감지를 다루는 것처럼 보입니다. 큰 이미지에서 이미지의 인스턴스를 찾을 필요가 없으며 이미지의 심볼 종류 만 결정하면됩니다.

선택할 수있는 다양한 방법이있는 것 같습니다. 일 수 있으며 어디서부터 시작해야할지 모르겠습니다. 모든 조언이나 유용한 링크는 크게 감사하겠습니다.

답변

2

글자와 숫자가 직접 쓰이지 만 그라디언트 기반 학습을 문서 인식에 적용해야합니다. 또한 Belongie와 Malik의 Shape Context에 대해서도 읽어야합니다. 찾고자하는 키워드는 숫자/문자/모양 인식입니다 (분류가 아닌 탐지가 아닙니다).

+0

감사합니다. 결과를 게시하고 게시합니다. – AndrewS

+1

EmguCV에서 EigenObjectRecognizer 클래스 사용이 끝났습니다. 키워드 팁을 주셔서 감사합니다. – AndrewS

1

모든 이미지를 표준 해상도 (적절한 크기 조정 및 가운데 맞춤)로 설정하십시오.
캔버스를 n 개의 정사각형 또는 직사각형 블록으로 나누십시오.

각 블록에 대해 해당 블록에서 검은 픽셀 수 또는 흑백 사이의 비율을 측정하여이를 피처로 처리 할 수 ​​있습니다.

이제 이미지를 피쳐의 벡터 (각 피처가 다른 블록에서 생성 됨)로 나타낼 수 있으므로 많은 표준 분류 알고리즘을 사용하여 이미지가 속한 클래스를 예측할 수 있습니다.

Google의 'viola jones'는이 유형의보다 정교한 방법을 제공합니다.

+0

나는 이것에 아주 근접해있는 것을 시도했다. 이전에 보았지만 새로운 글꼴/변형에 더 좋을 수있는 기호에 대해서는 잘 작동합니다. 나는 인터넷 검색을 할 것이다. – AndrewS

2

EmguCV를 사용하는 경우 SURF 기능 예 (StopSign 감지기)를 시작하는 것이 좋습니다. 다른 (가능하면 보완적인) 접근법은 MatchTemplate (..) 메소드를 사용하는 것입니다.

그러나 예 내가 이미지 감지하지 분류를 구체적으로 다루는 것 같다 찾을 수 자습서. I 큰 이미지에서 이미지의 인스턴스를 찾을 필요가 없습니다. 이미지의 이미지를 확인하기 만하면됩니다.

은 이미지에서 기호의 인스턴스를 찾아 냄으로써 실제로는 분류합니다.입니다. 왜 그것이 당신이 필요로하지 않는다고 생각하는지 확신하지 못합니다.

Image<Gray, float> imgMatch = imgSource.MatchTemplate(imgTemplate, Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCOEFF_NORMED); 

     double[] min, max; 
     Point[] pointMin, pointMax; 
     imgMatch.MinMax(out min, out max, out pointMin, out pointMax); 
//max[0] is the score 
     if (max[0] >= (double) myThreshold) 
     { 
      Rectangle rect = new Rectangle(pointMax[0], new Size(imgTemplate.Width, imgTemplate.Height)); 
      imgSource.Draw(rect, new Bgr(Color.Aquamarine), 1); 
     } 

그 최대 [0]은 가장 일치하는 점수를 제공합니다.

+0

이것이 내가 처음 시도한 것입니다 ('SURF feature detector'예제 사용).그러나 나는 결과를 비교하는 방법을 몰랐다. 그것은 정확한 일치를위한 많은 기능과 잘못된 (그러나 가까운) 일치를위한 묶음을 발견 할 것입니다. 어떤 기능 일치가 더 좋은지 어떻게 알 수 있습니까? 사이드 노트에서 SURF는 회전 불변 (매우 멋지다)이지만 내 경우에는 아마도 해를 끼칠 것입니다. – AndrewS

+1

매치 (SURF 또는 템플리트 매칭)마다 매치 스코어가있어서 매치의 근접성을 알 수 있습니다. ExhaustiveTemplateMatching 클래스의 임계 값을 설정하여 관련성이 떨어지는 클래스를 제거 할 수도 있습니다. – Mikos

+0

나는 그럴 것 같았다고 생각했지만 찾지 못했습니다. 고맙습니다. – AndrewS