문제
MODI를 사용하여 창 프로그램을 OCR하려고 합니다.다음과 같이 win32 interop을 사용하여 프로그래밍 방식으로 캡처한 스크린샷에는 잘 작동합니다.
public string SaveScreenShotToFile()
{
RECT rc;
GetWindowRect(_hWnd, out rc);
int width = rc.right - rc.left;
int height = rc.bottom - rc.top;
Bitmap bmp = new Bitmap(width, height);
Graphics gfxBmp = Graphics.FromImage(bmp);
IntPtr hdcBitmap = gfxBmp.GetHdc();
PrintWindow(_hWnd, hdcBitmap, 0);
gfxBmp.ReleaseHdc(hdcBitmap);
gfxBmp.Dispose();
string fileName = @"c:\temp\screenshots\" + Guid.NewGuid().ToString() + ".bmp";
bmp.Save(fileName);
return fileName;
}
그런 다음 이 이미지는 파일에 저장되고 다음과 같이 MODI를 통해 실행됩니다.
private string GetTextFromImage(string fileName)
{
MODI.Document doc = new MODI.DocumentClass();
doc.Create(fileName);
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
MODI.Image img = (MODI.Image)doc.Images[0];
MODI.Layout layout = img.Layout;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < layout.Words.Count; i++)
{
MODI.Word word = (MODI.Word)layout.Words[i];
sb.Append(word.Text);
sb.Append(" ");
}
if (sb.Length > 1)
sb.Length--;
return sb.ToString();
}
이 부분은 잘 작동하지만 전체 스크린샷을 OCR하는 것이 아니라 일부만 OCR하고 싶습니다.다음과 같이 프로그래밍 방식으로 이미지를 자르려고 합니다.
private string SaveToCroppedImage(Bitmap original)
{
Bitmap result = original.Clone(new Rectangle(0, 0, 250, 250), original.PixelFormat);
var fileName = "c:\\" + Guid.NewGuid().ToString() + ".bmp";
result.Save(fileName, original.RawFormat);
return fileName;
}
그런 다음 이 작은 이미지를 OCR하면 MODI에서 예외가 발생합니다.'OCR 실행 오류', 오류 코드는 -959967087입니다.
MODI가 원본 비트맵을 처리할 수 있지만 여기서 가져온 더 작은 버전은 처리할 수 없는 이유는 무엇입니까?
해결책
대답은 Modi에게 더 큰 캔버스를주는 것처럼 보입니다. 나는 또한 컨트롤의 스크린 샷을 찍고 OCR을 사용하여 같은 문제에 부딪 쳤다. 결국 나는 컨트롤의 이미지를 가져 와서 이미지를 더 큰 비트 맵으로 복사하고 더 큰 비트 맵을 OCRed했습니다.
내가 찾은 또 다른 문제는 이미지 파일에 적절한 확장자가 있어야한다는 것입니다. 다시 말해, .tmp는 그것을 자르지 않습니다.
나는 OCR 방법 내부에서 더 큰 소스를 만드는 작업을 계속 유지했습니다.
public static string ExtractText(this Image image)
{
var tmpFile = Path.GetTempFileName();
string text;
try
{
var bmp = new Bitmap(Math.Max(image.Width, 1024), Math.Max(image.Height, 768));
var gfxResize = Graphics.FromImage(bmp);
gfxResize.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
bmp.Save(tmpFile + ".bmp", ImageFormat.Bmp);
var doc = new MODI.Document();
doc.Create(tmpFile + ".bmp");
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
var img = (MODI.Image)doc.Images[0];
var layout = img.Layout;
text = layout.Text;
}
finally
{
File.Delete(tmpFile);
File.Delete(tmpFile + ".bmp");
}
return text;
}
최소 크기가 무엇인지 정확히 잘 모르겠지만 1024 x 768이 트릭을 수행하는 것처럼 보입니다.
다른 팁
예, 이 스레드의 게시물이 작동하는 데 도움이 되었습니다. 여기에 추가해야 할 내용은 다음과 같습니다.
이미지(작은 이미지)를 다운로드한 다음 OCR을 다운로드하려고 했습니다.
-이미지를 처리할 때 크기는 2의 거듭제곱이어야 하는 것 같습니다!(이미지를 OCR할 수 있었습니다:512x512, 128x128, 256x64 ..다른 크기는 대부분 실패했습니다(예: 1103x334))
투명한 배경도 문제를 일으켰습니다.powerof2 경계, 흰색 배경을 사용하여 새 tif를 만들고 다운로드한 이미지를 붙여넣고 저장하면 최상의 결과를 얻었습니다.
특히 "ü"와 같은 "독일어" 문자의 경우 OCR에서 잘못된 결과가 나오기 때문에 이미지 크기 조정이 성공하지 못했습니다.
결국 나는 또한 다음을 사용했습니다.doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, 거짓, 거짓);
Office 2003의 Modi 사용
인사말
웜드
Modi OCR은 나와 함께 일하고 있습니다. "TIF"에서 이미지를 저장하십시오.
내 나쁜 영어 미안 해요
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
즉, 방향을 감지하고 왜곡을 고치지 않기를 원합니다. 이제 명령은 2400x2496 TIFF를 포함한 모든 이미지에서 잘 작동합니다.
그러나 이미지는 .tif에 있어야합니다.
이것이 사람들이 같은 문제에 직면하는 데 도움이되기를 바랍니다.
일부 이미지와 같은 "OCR 실행 문제"와 같은 문제가있었습니다. 나는 이미지를 다시 스케일했다 (내 경우 50%), 즉 크기와 짜잔을 줄였다! 효과가있다!
사용하는 동안 같은 문제가있었습니다
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
2400x2496 인 TIFF 파일에서. 그것을 50%(크기를 줄이면)로 크기를 조정하고 문제가 해결 되었고이 방법은 더 이상 예외를 던지지 않았지만 "712517"대신 "참조"또는 "712017"대신 "Relerence"를 감지하는 것과 같은 텍스트를 잘못 인식했습니다. . 다른 이미지 크기를 계속 시도했지만 명령을 변경할 때까지 모두 같은 문제가있었습니다.
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
그것은 내가 방향을 감지하고 왜곡을 고치지 않기를 원하지 않았다는 것을 의미했습니다. 이제 명령은 2400x2496 TIFF를 포함한 모든 이미지에서 잘 작동합니다.
이것이 사람들이 같은 문제에 직면하는 데 도움이되기를 바랍니다
내 상황을 해결 한 것은 사진 편집기 (Paint.net)를 사용하고 최대의 선명한 효과를 사용하는 것이 었습니다.
나는 또한 사용했다 : doc.ocr (modi.milanguages.milang_english, false, false);