반응형

 

 

광학 문자 인식(OCR)

광학 문자 인식(OCR)은 이미지로 된 텍스트를 컴퓨터가 이해할 수 있는 텍스트로 변환하는 기술입니다.

 

위 이미지를 보면 미리보기 / 맞춤법 / 글감검색 / open source / DOWNLOAD POWERED BY TINY

와 같은 글자가 들어있는 이미지 파일이 있습니다. 

 

이미지파일에서 텍스트를 수정하거나 삭제하거나 편집하는 것은 불가능하지만

광학문자인식을 통해 이미지안에 들어있는 텍스트를 추출하여 데이터를 얻을 수 있는 기술입니다.

 

 

광학 문자 인식(OCR) 오토핫키 사용법

 

원작자 커뮤니티 주소입니다.

https://www.autohotkey.com/boards/viewtopic.php?f=83&t=116406

 

Easy OCR - AutoHotkey Community

@ Quote 12 Jul 2023, 11:55 @Krd, x1 and y1 should be the coordinates to top left corner of the search area, and x2 and y2 coordinates for bottom right corner. This means that for example {x1:0,y1:0,x2:200,y2:200} would only look in the top left corner of t

www.autohotkey.com

 

 

 

 

ahk_v2_uwp_ocr.zip
0.06MB

 

 

예제 1
데스크톱에서 찾은 모든 텍스트를 표시한 다음 결과를 줄별로 강조 표시합니다.

#include OCR.ahk

result := OCR.FromDesktop()
MsgBox "All text from desktop: `n" result.Text

MsgBox "Press OK to highlight all found lines for 3 seconds."
for line in result.Lines
    result.Highlight(line, -3000)
ExitApp

 

 

예제 2
메모장에서 일부 텍스트를 찾아 마우스로 클릭&드래그하여 선택합니다.

#include OCR.ahk

Run "notepad.exe"
WinWaitActive "ahk_exe notepad.exe"
Send "Lorem ipsum "
Sleep 40

result := OCR.FromWindow("A",,2)
try found := result.FindString("Lorem")
if !IsSet(found) {
    MsgBox '"Lorem" was not found in Notepad!'
    ExitApp
}

result.Highlight(found)

CoordMode "Mouse", "Window"
MouseClickDrag("Left", found.x, found.y, found.x + found.w, found.y + found.h)

 

 

예제 3
커서 아래에 있는 텍스트를 읽어 실시간으로 표시합니다.

#Requires AutoHotkey v2
#include OCR.ahk

CoordMode "Mouse", "Screen"
CoordMode "ToolTip", "Screen"

DllCall("SetThreadDpiAwarenessContext", "ptr", -3) ; Needed for multi-monitor setups with differing DPIs

global w := 150, h := 50, minsize := 5, step := 3
Loop {
    MouseGetPos(&x, &y)
    Highlight(x-w//2, y-h//2, w, h)
    ToolTip(OCR.FromRect(x-w//2, y-h//2, w, h, "en-us").Text, , y+h//2+10)
}

Right::global w+=step
Left::global w-=(w < minsize ? 0 : step)
Up::global h+=step
Down::global h-=(h < minsize ? 0 : step)

Highlight(x?, y?, w?, h?, showTime:=0, color:="Red", d:=2) {
	static guis := []

	if !IsSet(x) {
        for _, r in guis
            r.Destroy()
        guis := []
		return
    }
    if !guis.Length {
        Loop 4
            guis.Push(Gui("+AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x08000000"))
    }
	Loop 4 {
		i:=A_Index
		, x1:=(i=2 ? x+w : x-d)
		, y1:=(i=3 ? y+h : y-d)
		, w1:=(i=1 or i=3 ? w+2*d : d)
		, h1:=(i=2 or i=4 ? h+2*d : d)
		guis[i].BackColor := color
		guis[i].Show("NA x" . x1 . " y" . y1 . " w" . w1 . " h" . h1)
	}
	if showTime > 0 {
		Sleep(showTime)
		Highlight()
	} else if showTime < 0
		SetTimer(Highlight, -Abs(showTime))
}

 

 

예제 4
활성 창에서 검색어를 찾으려고 시도합니다.

#Requires AutoHotkey v2
#include OCR.ahk

CoordMode "Mouse", "Window"
Loop {
    ib := InputBox("Insert search phrase to find from active window: ", "OCR")
    Sleep 100 ; Small delay to wait for the InputBox to close
    if ib.Result != "OK"
        ExitApp
    result := OCR.FromWindow("A",,2)
    try found := result.FindString(ib.Value)
    catch {
        MsgBox 'Phrase "' ib.Value '" not found!'
        continue
    }
    MouseMove found.x, found.y
    result.Highlight(found)
    break
}

 

 

예제 5
텍스트를 기다리는 방법, 결과 개체에서 키워드를 검색하는 방법, 결과를 클릭하는 방법을 보여줍니다

#Requires AutoHotkey v2
#include OCR.ahk

Run "https://www.w3schools.com/tags/att_input_type_checkbox.asp"
WinWaitActive "HTML input type",,10
if !WinActive("HTML input type") {
    MsgBox "Failed to find test window!"
    ExitApp
}

 

예제 6

검색 영역의 창을 특정 좌표로 제한하는 방법 

result := CropResult(OCR.FromDesktop(), 0, 0, 500, 80)
for line in result.Lines
    ToolTip(line.Text), result.Highlight(line)

CropResult(result, x, y, w, h) {
    result := result.Clone()
    croppedLines := [], croppedWords := [], text := ""
    for line in result.Lines {
        croppedWords := [], lineText := ""
        for word in line.Words {
            if word.x >= x && word.y >= y && (word.x+word.w) <= (x+w) && (word.y+word.h) <= (y+h)
                croppedWords.Push(word), lineText .= word.Text " ", ObjAddRef(word.ptr)
        }
        if croppedWords.Length {
            line := {Text:Trim(lineText), Words:croppedWords}
            line.base.__Class := "OCR.OCRLine"
            croppedLines.Push(line)
            text .= lineText
        }
    }
    result.DefineProp("Lines", {Value:croppedLines})
    result.DefineProp("Text", {Value:Trim(text)})
    result.DefineProp("Words", OCR.Prototype.GetOwnPropDesc("Words"))
    return result
}

 

 

 

 

반응형

+ Recent posts