Распознавание символов

Тема в разделе "WASM.BEGINNERS", создана пользователем Slim_d0g, 12 май 2007.

  1. Slim_d0g

    Slim_d0g New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    6
    Здравствуйте!
    Мне нужно написать программу, которая бы на рисунке распознавала букву "М". Я использовал алгоритм такой: Сначала все линии рисунка делаются толстыми, а потом подставляется в каждую точку рисунка шаблон буквы, в разных размерах. У меня получилось очень неоднозначно, часто ошибается и надо очень точно рисовать букву. Пожалуйтса, подкиньте идейку хорошего алгоритма, желательно не сложного, либо помогите оптимизировать мою прогу!
    Вот код:
    Код (Text):
    1. .586                    
    2. .MODEL  FLAT , STDCALL
    3. option casemap :none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. include \masm32\include\kernel32.inc
    8. include \masm32\include\gdi32.inc
    9. include \masm32\include\masm32.inc
    10. include \masm32\include\debug.inc
    11. includelib \masm32\lib\user32.lib
    12. includelib \masm32\lib\kernel32.lib
    13. includelib \masm32\lib\gdi32.lib
    14. includelib \masm32\lib\masm32.lib
    15. includelib \masm32\lib\debug.lib
    16.  
    17.  
    18. DBGWIN_DEBUG_ON = 1 ;turn it off if you don't want to include debug info into the program
    19. DBGWIN_EXT_INFO = 1 ;turn it off if you don't want to include extra debug info into the program
    20.  
    21. WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    22. .data
    23.  
    24.  
    25. ClassName   db "SimpleWinClass",0
    26. AppName     db "Распознавание",0
    27. MouseClick  db 0
    28. Paint       dd 0
    29.  
    30. m_x     db 1,1,1,1,2,3,4,5,5,5,5,5
    31. m_y     db 2,3,4,5,2,3,2,1,2,3,4,5
    32. scale       dd 10
    33. Counter     dd 0
    34.  
    35. .data?
    36. hInstance   HINSTANCE ?
    37. CommandLine LPSTR ?
    38. hwnd        HWND ?
    39. hdc     HDC ?
    40. hBrush      HBRUSH ?
    41. hPen        HPEN ?
    42.  
    43. x       dd ?
    44. y       dd ?
    45.  
    46. x1      dd ?
    47. y1      dd ?
    48. x2      dd ?
    49. y2      dd ?
    50.  
    51. current_x   dd ?
    52. current_y   dd ?
    53.  
    54.  
    55.  
    56. LOWORD  MACRO   bigword ;; Retrieves the low word from double word argument
    57.  
    58.     mov eax,bigword
    59.     and eax,0FFFFh  ;; Set to low word
    60.     ENDM
    61.  
    62. HIWORD  MACRO   bigword ;; Retrieves the high word from double word argument
    63.  
    64.     mov ebx,bigword
    65.     shr ebx,16      ;; Shift 16 for high word to set to high word
    66.                
    67.     ENDM
    68.  
    69. .code
    70. start:
    71.  
    72.     invoke GetModuleHandle, NULL
    73.     mov hInstance,eax
    74.     invoke GetCommandLine
    75.     mov CommandLine,eax
    76.     invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    77.     invoke ExitProcess,0
    78.  
    79. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    80.     LOCAL wc:WNDCLASSEX
    81.     LOCAL msg:MSG
    82.  
    83.  
    84.     mov   wc.cbSize,SIZEOF WNDCLASSEX
    85.     mov   wc.style, CS_HREDRAW or CS_VREDRAW
    86.     mov   wc.lpfnWndProc, OFFSET WndProc
    87.     mov   wc.cbClsExtra,NULL
    88.     mov   wc.cbWndExtra,NULL
    89.     push  hInstance
    90.     pop   wc.hInstance
    91.     invoke LoadIcon, NULL, IDI_APPLICATION
    92.     mov   wc.hIcon,eax
    93.     mov   wc.hIconSm,eax
    94.     mov   wc.hbrBackground,COLOR_WINDOWTEXT+1
    95.     mov   wc.lpszMenuName,NULL
    96.     mov   wc.lpszClassName,OFFSET ClassName
    97.     invoke LoadCursor,NULL,IDC_ARROW
    98.     mov   wc.hCursor,eax
    99.     invoke RegisterClassEx,addr wc
    100.     INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,308,331,NULL,NULL,hInst,NULL
    101.     mov   hwnd,eax
    102.     INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
    103.     INVOKE UpdateWindow, hwnd
    104.     invoke SetTimer,hwnd,1,1,NULL
    105.  
    106.     .WHILE TRUE
    107.         INVOKE GetMessage, ADDR msg,NULL,0,0
    108.         .BREAK .IF (!eax)
    109.         INVOKE TranslateMessage, ADDR msg
    110.         INVOKE DispatchMessage, ADDR msg
    111.     .ENDW
    112.     mov eax,msg.wParam
    113.     ret
    114. WinMain endp
    115.  
    116. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    117.     LOCAL ps:PAINTSTRUCT
    118.     LOCAL hMemDC:HDC
    119.     LOCAL rect:RECT
    120.  
    121.  
    122.     .IF uMsg==WM_CREATE
    123.         invoke GetDC, hWnd
    124.         mov hdc,eax
    125.         invoke CreateSolidBrush,0ff00h
    126.         mov hBrush,eax
    127.         invoke CreatePen,PS_NULL,1,0ff00h
    128.         mov hPen,eax
    129.  
    130.  
    131.  
    132.     .elseif uMsg==WM_MOUSEMOVE
    133.             LOWORD lParam
    134.             mov  x,eax
    135.  
    136.             HIWORD lParam
    137.             mov  y,ebx
    138.  
    139.         .IF (wParam & MK_LBUTTON)
    140.    
    141.  
    142.  
    143.             invoke SetPixel, hdc, x, y, 0ffffffh
    144.  
    145.         .ENDIF
    146.  
    147.    
    148.  
    149.     .elseif uMsg==WM_KEYDOWN
    150.         mov eax,wParam
    151.         mov Paint,1
    152.  
    153.  
    154.     .elseif uMsg==WM_TIMER
    155.         .if Paint==1
    156.            
    157.  
    158.             xor edi,edi
    159.             .repeat
    160.                 xor esi,esi
    161.                 .while esi<301
    162.  
    163.                     invoke GetPixel,hdc,esi,edi
    164.                     .if eax==0ffffffh
    165.                         mov ebx,9
    166.                        
    167.                         mov x1,esi
    168.                         sub x1,ebx
    169.                         mov y1,edi
    170.                         sub y1,ebx
    171.                         mov x2,esi
    172.                         add x2,ebx
    173.                         mov y2,edi
    174.                         add y2,ebx
    175.                         invoke SelectObject,hdc,hBrush
    176.                         invoke SelectObject,hdc,hPen
    177.                         invoke Ellipse,hdc,x1,y1,x2,y2
    178.                        
    179.                     .endif
    180.                     inc esi
    181.                 .endw
    182.                 inc edi
    183.             .until edi==301
    184.             mov Paint,0
    185.             xor edi,edi
    186.             .while edi<296
    187.                 xor esi,esi
    188.                 .while esi<296
    189.                     invoke GetPixel,hdc,esi,edi
    190.                     .if eax==0ff00h
    191.                         xor ebx,ebx
    192.                         mov scale,5
    193.                         .repeat
    194.                             xor eax,eax
    195.                             mov al,m_x[ebx]
    196.                             mul scale
    197.                             mov current_x,eax
    198.                             add current_x,esi
    199.                             xor eax,eax
    200.                             mov al,m_y[ebx]
    201.                             mul scale
    202.                             mov current_y,eax
    203.                             add current_y,edi
    204.  
    205.                             invoke  GetPixel,hdc,current_x,current_y
    206.                             .if eax==0ff00h
    207.                                 inc ebx
    208.                             .else
    209.                                 inc scale
    210.                                 xor ebx,ebx
    211.                             .endif
    212.                             .if ebx>11
    213.                                 add Counter,1
    214.                                 ;add esi,13
    215.                                 ;add edi,13
    216.                             .endif
    217.                         .until ((scale>40) || (ebx>11))
    218.                     .endif
    219.                 inc esi
    220.                 .endw
    221.             inc edi
    222.             .endw
    223.                                                    
    224.  
    225.             ;invoke SetTextColor,hdc,0ffh
    226.             ;invoke SetBkColor,hdc,0h
    227.             PrintDec Counter,"Counter"
    228.             PrintLine
    229.             ;add Counter,'0'
    230.             ;invoke TextOut,hdc,0,0,ADDR Counter,SIZEOF Counter-1
    231.             ;sub Counter,'0'
    232.             mov Paint,0    
    233.         .endif
    234.        
    235.  
    236.     .elseif uMsg==WM_DESTROY
    237.         invoke ReleaseDC, hWnd, hdc
    238.         invoke PostQuitMessage,NULL
    239.  
    240.     .ELSE
    241.         invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    242.         ret
    243.  
    244.     .ENDIF
    245.  
    246.    
    247.     xor    eax,eax
    248.     ret
    249. WndProc endp
    250. end start
    Заранее благодарен!
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
  3. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    На фасме форуме есть пример нейросети по распознаванию цифр. Поиск по ихнему форуму стоит сделать.