Mingre Posted December 13, 2015 Posted December 13, 2015 (edited) Hello forums,I'd like to know if anyone has better idea than what I have. I'm creating a program that will detect (not OCR!) blocks of words (black text) on a white background displayed on the screen. (If anyone is curious about its purpose, this code will be part of a program that will randomly select a word on a PDF file and have the user guess that word. I'll be using it to quiz myself with my PDF notes. )What I created so far: Using FastFind.au3, I was able to make it detect lines of black text (font Lucida Console) on a single column. It basically considers a line a separate one if bounded above and below by horizontal lines that do not contain black pixels. Next step, which I haven't done yet, will be to go through each line and detect the blocks of words.The program works fine so far with Lucida Console font but it doesn't when tested on TNR font (see attached sample image). The former can be tested by setting $iOption to "text" while the latter by setting it to "select".So does anyone have a better idea on going about this? Thank you!Sorry if my code's a mess. I tried to make it cleaner before posting it but this is the best I can manage.expandcollapse popup#include <FastFind.au3> #include <array.au3> HotKeySet('{ESC}', '__Exit') Local $iImagePos[4], $iXa, $iXb, $iYa, $iYb $iOption = 'text' Switch $iOption Case 'text' ; Creates sample text file for detection Local Const $sSampleTextFileName = 'sample.txt' FileWrite($sSampleTextFileName, '') FileOpen($sSampleTextFileName, 2) FileWrite($sSampleTextFileName, 'First line.' & @CRLF & 'Second line.' & @CRLF & @CRLF & 'Third line.') FileClose($sSampleTextFileName) ShellExecute($sSampleTextFileName) Local Const $sSampleTextFileTitle = 'sample - Notepad' WinWait($sSampleTextFileTitle) WinMove($sSampleTextFileTitle, '', 0, 0, @DesktopWidth / 2, @DesktopHeight / 2) Sleep(500) $iImagePos = __ControlGetPos($sSampleTextFileTitle, '[CLASS:Edit; INSTANCE:1]') ; Gets the absolute coordinates of the edit control. Local $iXa = $iImagePos[0], _ $iXb = $iImagePos[0] + $iImagePos[2], _ $iYa = $iImagePos[1], _ $iYb = $iImagePos[1] + $iImagePos[3] Case 'select' MsgBox(0, 'Select', 'Select first') $iXa = MouseGetPos(0) $iYa = MouseGetPos(1) MsgBox(0, 'Select', 'Select second') $iXb = MouseGetPos(0) $iYb = MouseGetPos(1) EndSwitch Local $array[1][2] ; Will be used for saving coordinates of lines of text Local $iBlackPixelCount Local $bHasNoPreviousZero = True ; Will be used as a toggle for skipping succeeding lines that have no black pixels. Local $iStep = 1 For $y = $iYa To $iYb Step $iStep FFSnapShot($iXa, $y, $iXb, $y) $iBlackPixelCount = FFColorCount(0x000000, 50, False) ; $iBlackPixelPercent = Round(100 * (FFColorCount(0x000000, 0, False) / $iImagePos[2]), 2) ; Computes for percentage of black pixels on horizontal line. ; If $iBlackPixelCount > 0 Or $bHasNoPreviousZero Then ; $bHasNoPreviousZero = True _ArrayAdd($array, $iBlackPixelCount) $array[UBound($array) - 1][1] = $y ; If $iBlackPixelCount = 0 Then $bHasNoPreviousZero = False ; EndIf Next ; To check detected lines. This will move mouse to the lower-left corner of the text line. For $i = 0 To UBound($array) - 1 Step +1 If $array[$i][0] > 0 Then If $i + 1 <= UBound($array) - 1 Then If $array[$i + 1][0] = 0 Then MouseMove($iXa, $array[$i][1]) Sleep(500) EndIf EndIf ; EndIf Next _ArrayDisplay($array) Func __ControlGetPos($hWnd, $controlID, $bAbsolute = Default) ;; https://www.autoitscript.com/forum/topic/88345-absolute-position-of-guicontrol/ If $bAbsolute = Default Then $bAbsolute = True Local $controlPos Switch $bAbsolute Case True Local Const $hWnd_Control = ControlGetHandle($hWnd, "", $controlID) $controlPos = WinGetPos($hWnd_Control) Case False $controlPos = ControlGetPos($hWnd, "", $controlID) EndSwitch If Not IsArray($controlPos) Then SetError(1) Return $controlPos EndFunc ;==>__ControlGetPos Func __Exit() Exit EndFunc ;==>__Exit FastFind.dllFastFind.au3FastFind64.dllsample image.bmp Edited December 13, 2015 by Mingre
Mingre Posted December 13, 2015 Author Posted December 13, 2015 Hello instead of checking for black pixels, I changed it to check white pixels and it now works on TNR font. Thanks everyone!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now