рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдПрдХ рдЭреЛрдкрдбрд╝реА рдЧрд╛рдВрд╡ рдореЗрдВ рд░рд╣рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдХреЛрдИ рдХреЗрдВрджреНрд░реАрдп рд╣реАрдЯрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЛ рдЕрдкрдиреЗ рджрдо рдкрд░ рдЧрд░реНрдо рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдЧреИрд╕ рдмреЙрдпрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рдзрд┐ рдХрд╛рдлреА рд╕рд╕реНрддреА рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИред рдЧреИрд╕ рдмреЙрдпрд▓рд░ (рдЕрдЪрд╛рдирдХ) рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдкрд╛рдЗрдк рдореЗрдВ рдЧреИрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╢рд╛рдпрдж рд╕рднреА рдмреЙрдпрд▓рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧреИрд╕ рдЖрдкреВрд░реНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд░реБрдХрд╛рд╡рдЯ рдХреЗ рджреМрд░рд╛рди рднреА рд╣рдорд╛рд░рд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкреВрд░реНрддрд┐ рдмрд╣рд╛рд▓ рд╣реЛрдиреЗ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдШрд░ рдкрд░ рд╣реИ, рддреЛ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрд╕рдиреЗ рдПрдХ рдмрдЯрди рджрдмрд╛рдпрд╛ рдФрд░ рдмрд╛рдпрд▓рд░ рдЖрдЧреЗ рдЧрд░реНрдо рд╣реЛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдЕрдЪрд╛рдирдХ рд╣реБрдЖ рдХрд┐ рд╣рдордиреЗ рдкреВрд░реЗ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд╕рд╛рде рдЫреБрдЯреНрдЯреА рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдпрд╛рд░реНрдб рдореЗрдВ рдпрд╣ рд╕рд░реНрджрд┐рдпреЛрдВ рдХрд╛ рдРрд╕рд╛ рдЕрдЪреНрдЫрд╛ рддрд╛рдкрдорд╛рди -20 рдбрд┐рдЧреНрд░реА рд╕реЗрд▓реНрд╕рд┐рдпрд╕ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рджреБрд╕реНрд╕рд╛рд╣рд╕реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдорд╛рдзрд╛рди рд╕рд░рд▓ рд╣реИ - рд░рд┐рд╢реНрддреЗрджрд╛рд░реЛрдВ / рджреЛрд╕реНрддреЛрдВ / рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЪрд╛рдмрд┐рдпрд╛рдБ рдЫреЛрдбрд╝ рджреЗрдВ рддрд╛рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рднреА рдкрд░реЗрд╢рд╛рдиреА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрд╛рдпрд▓рд░ рдХреЛ рдЪрд╛рд▓реВ рдФрд░ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХреЗрдВред рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдкрдбрд╝реЛрд╕реА рд╣реИ рдЬреЛ рд╣рд░ рджрд┐рди рдЖрдПрдЧрд╛ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдФрд░ рдЕрдЧрд░ рдирд╣реАрдВ? рдпрд╛ рд╡рд╣ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рднреА рдХрд░реЗрдЧрд╛?
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдореАрдЯрд░ рдХреА рд░реАрдбрд┐рдВрдЧ рдХреЛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдбрд╛рд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рдПрдХ рд▓рдВрдмреА рдпрд╛рддреНрд░рд╛ рдХреЗ рджреМрд░рд╛рди рдореИрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХреВрдВ рдХрд┐ рдХреНрдпрд╛ рдЧреИрд╕ рдмрд░реНрдмрд╛рдж рд╣реЛ рд░рд╣реА рд╣реИ, рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЕрдЪрд╛рдирдХ рдмрд░реНрдмрд╛рдж рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреВрдВ, рддреЛ рддреБрд░рдВрдд рд░рд┐рд╢реНрддреЗрджрд╛рд░реЛрдВ / рджреЛрд╕реНрддреЛрдВ / рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ (рдпрд╛ рдЬреЛ рдХреЛрдИ рднреА рдореБрдЭреЗ рдлреЛрди рдХрд░реЗрдВ) рдмрдЯрди рдЫреЛрдбрд╝ рдХрд░ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП)
рдмреЗрд╢рдХ, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреЗрд╡рд▓ рдкреНрд░рд╢рдВрд╕рд╛рдкрддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд░реБрдХрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдкреНрд░рд╢рдВрд╕рд╛рдкрддреНрд░ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреА рдорд╛рдиреНрдпрддрд╛ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджрд┐рдпрд╛, рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рднрд╛рдЧ 2 рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рд╛ред
рднрд╛рдЧ 1. рдореАрдЯрд░ рд╕реЗ рдкрдврд╝рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдбрд╛рд▓рдирд╛
рдпрд╣рд╛рдВ рдпрд╣ рдЖрд░рдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдореАрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдмрд╕реЗрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реИ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдЖрдЧреЗ рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд┐рдирд╛ рд╕рдмрд╕реЗ рдЖрдо рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рд╛, рд╢рд╛рдпрдж рдореИрдВ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рдерд╛), рдЧреИрд▓рд╕ рдЖрдИрд╡реА рдкреАрдПрд╕рд╕реА рдореЙрдбрд▓ред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╡рд┐рдХрд▓реНрдк рд░рд╣рддрд╛ рд╣реИ - рджреГрд╢реНрдп рд░реАрдбрд┐рдВрдЧред рдиреЗрдЯрд╡рд░реНрдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдкреИрд╕рд╛ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкреЛрд░реНрдЯреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдм рдХреБрдЫ рдЦреБрдж рдХрд░реЗрдВрдЧреЗред
рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?
рдореАрдЯрд░ рд╕реЗ рд░реАрдбрд┐рдВрдЧ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдлрд┐рд░ рдЗрди рд░реАрдбрд┐рдВрдЧ рдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реИрдорд╕рдВрдЧ рдЧреИрд▓реЗрдХреНрд╕реА рдПрд╕ III (SCH-I535) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╣рд╛рдВ, рд╢рд╛рдпрдж, рд╣рд░ рдкрд╛рдардХ рдХреЗ рдкрд╛рд╕ рдПрдХ рддреАрд╕рд░реА рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛ рдмреЗрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдмрд╣реБрдд рд╢рд╛рдирджрд╛рд░ рд╣реИрдВ:
- рдЗрд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
- рдХреИрдорд░рд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
- WiFi рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдмрд╕ рдЗрддрдирд╛ рд╣реА, рд╡рд░реНрдХрд┐рдВрдЧ рд╕реНрдХреНрд░реАрди, рдЯрдЪ рд╕реНрдХреНрд░реАрди, рдорд╛рдЗрдХреНрд░реЛрдлреЛрди, рд╕реНрдкреАрдХрд░ рдЖрджрд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ред рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВред рдпрд╣ рддрдереНрдп рд▓рд╛рдЧрдд рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред
EBay рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЯреВрдЯреЗ рд╣реБрдП рдлреЛрди рдЦрд░реАрджрдиреЗ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рд╢реМрдХ рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдорд╛рдЗрдХреНрд░реЛрдлреЛрди (~ $ 10) рдХреЗ рд╕рд╛рде рдПрдХ sgs3 рдорджрд░рдмреЛрд░реНрдб, рд╕рд╛рде рд╣реА рдПрдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдХреИрдорд░рд╛ (~ $ 10) рдФрд░ рдПрдХ рдЪреАрдиреА рдмреИрдЯрд░реА (~ 300 рд░рдЧрдбрд╝)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреЛрд░реНрдб рдХреЛ рдмреИрдЯрд░реА рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЯреВрдЯреЗ рд╣реБрдП рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд╕рд╛рде рдПрдХ рдлреНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдкрд╣рд▓реЗ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдорджрд░рдмреЛрд░реНрдб рдФрд░ рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рде рд╣реА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЪрд╛рд░реНрдЬрд┐рдВрдЧ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рднреА, рдмреЛрд░реНрдб рдмрд┐рдирд╛ рдмреИрдЯрд░реА рдХреЗ рдЪрд╛рд▓реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЕрднреА рднреА рдПрдХ рдлреНрд░реЗрдо рдФрд░ рдПрдХ рдмреИрдЯрд░реА рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрдЬрдЯ рд▓рдЧрднрдЧ $ 30 рдирд┐рдХрд▓рд╛, рдпрджрд┐ рдЖрдк sgs3 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдЫреЛрдЯреА рд░рд╛рд╢рд┐ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдЪ рд╣реИ, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЗрд╕рдХреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рдПрдХ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдФрд░ рдЯрдЪрд╕реНрдХреНрд░реАрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рдорд╢реАрди рдХреА рд╕реЗрдЯрд┐рдВрдЧ
рд╣рдо рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХреЛрдИ рдбрд┐рд╕реНрдкреНрд▓реЗ рдпрд╛ рдЯрдЪрд╕реНрдХреНрд░реАрди рдирд╣реАрдВ рд╣реИ, рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдореЗрдВ рд░реВрдЯ рдирд╣реАрдВ рд╣реИ, рдПрдбреАрдмреА рдбреАрдмрдЧрд┐рдВрдЧ рдЕрдХреНрд╖рдо рд╣реИ, рдлрд░реНрдорд╡реЗрдпрд░ рдЕрдЬреНрдЮрд╛рдд рд╣реИред
рд░реАрдПрдирд┐рдореЗрд╢рди
рдЪреЗрддрд╛рд╡рдиреА! рдирд┐рдореНрди рдирд┐рд░реНрджреЗрд╢ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реИрдорд╕рдВрдЧ рдЧреИрд▓реЗрдХреНрд╕реА рдПрд╕ III (SCH-I535) рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рд╣реИ, рддреЛ рдХреНрд░рд┐рдпрд╛рдПрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк adb, рдлрд░реНрдорд╡реЗрдпрд░ рдЖрджрд┐ рдЬреИрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЛ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдкреНрд░рд╕рд┐рджреНрдз рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдо рдУрдбрд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣рд╛рдВ рд╕реЗ рд╡реАрдЖрд░рдмреАрдПрдордмреА 1 рд╕реНрдЯреЙрдХ рдлрд░реНрдорд╡реЗрдпрд░ рдлреНрд▓реИрд╢ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрдВрдЯрд░рдиреЗрдЯ рдУрдбрд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рднрд░рд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдУрдбрд┐рди рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреА рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдмреВрдЯ рдореЛрдб рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рд╡реЙрд▓реНрдпреВрдо рдбрд╛рдЙрди + рд╣реЛрдо + рдкрд╛рд╡рд░ - рдЗрд╕реЗ рдХреБрдЫ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рджрдмрд╛рдП рд░рдЦреЗрдВ, рдлрд┐рд░ рд╡реЙрд▓реНрдпреВрдо рдЕрдк, рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпреВрдПрд╕рдмреА рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдпрд╣реА рд╡рд╣ рд╣реИред рдУрдбрд┐рди-рдПрдХ)ред
рдУрдбрд┐рди рдирд╛рд▓реА рдХреЛ рдЪрдордХрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдлреЛрди рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмреВрдЯ рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ рдпреВрдПрд╕рдмреА рд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдЯрд░реА рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред рдпрд╣ рдСрдкрд░реЗрд╢рди рдУрдбрд┐рди рджреНрд╡рд╛рд░рд╛ рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рд░ рдмрд╛рд░ рдмрдВрдж рд░рд╛рдЬреНрдп рд╕реЗ рдЕрдЧрд▓рд╛ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдЧрд▓рд╛, рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реАрдбрдмреНрд▓реНрдпреВрдПрдо рд░рд┐рдХрд╡рд░реА рдФрд░ рд░реВрдЯ рдХреЛ рд╕реАрд╡реЗ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рддрдм:
- рдУрдбрд┐рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдХрд╕реНрдЯрдо рдмреВрдЯрдЪреИрди VRALEC.bootchain.tar.md5 рдлреНрд▓реИрд╢ рдХрд░реЗрдВ
- рдУрдбрд┐рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдлреНрд▓реИрд╢ рд╕реАрдбрдмреНрд▓реНрдпреВрдПрдо рд░рд┐рдХрд╡рд░реА
- CWM рд░рд┐рдХрд╡рд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, SuperSU_Bootloader_FIXED.zip рдлреНрд▓реИрд╢ рдХрд░реЗрдВ ред рдирд┐рд░реНрджреЗрд╢ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдПрд╕рдбреА рдХрд╛рд░реНрдб рдкрд░ рдЬрд┐рдк рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░реАрди рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рд╕рд╛рдЗрдбрд▓реЛрдб рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
рд╡реЙрд▓реНрдпреВрдо рдЕрдк + рд╣реЛрдо + рдкрд╛рд╡рд░ рдХреЛ рдкрдХрдбрд╝реЗ рд╣реБрдП рд╢рд░реАрд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдВ - рдХреБрдЫ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдкрдХрдбрд╝реЗрдВ, рдлрд┐рд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 5 рд╕реЗрдХрдВрдб, рд╣рдо рд╕реАрдбрдмреНрд▓реНрдпреВрдПрдо-рд░рд┐рдХрд╡рд░реА рдореЛрдб рдореЗрдВ рдЖрддреЗ рд╣реИрдВред
рд╣рдо рдЗрд╕реЗ ubuntu рдХрдВрд╕реЛрд▓ рдореЗрдВadb devices
рдЯрд╛рдЗрдк рдХрд░рдХреЗ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ (рдмреЙрдбреА рдХреЛ usb рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ adb рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП -sudo apt-get install android-tools-adb
):
malefic@lepeshka:~$ adb devices List of devices attached 64cb5c59 recovery
рдпрджрд┐ рд╣рдо рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рд╡реЙрд▓реНрдпреВрдо рдбрд╛рдЙрди, рд╡реЙрд▓реНрдпреВрдо рдбрд╛рдЙрди, рдкрд╛рд╡рд░ - рдПрдбреАрдмреА рд╕рд╛рдЗрдбрд▓реЛрдб рдореЛрдб рдкрд░ рдЬрд╛рдПрдВ (рдХрдо рд╕реЗ рдХрдо рд╕реАрдбрдмреНрд▓реНрдпреВрдПрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдпрд╣ рд╢реАрд░реНрд╖ рд╕реЗ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╣реИ), рдЖрдкрдХреЛ рдмрд╕ рдХрдВрд╕реЛрд▓ рдореЗрдВ ubuntu рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
malefic@lepeshka:~$ adb sideload SuperSU_Bootloader_FIXED.zip sending: 'sideload' 100%
рдФрд░ рд░реВрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЙрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдмреИрдЯрд░реА рдХреЛ рдЙрд╕рдореЗрдВ рд╕реЗ рдЦреАрдВрдЪрдХрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдирд╣реАрдВ рднреВрд▓рддреЗред - рдУрдбрд┐рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╕реНрдЯреЙрдХ рдлрд░реНрдорд╡реЗрдпрд░ VRBMB1_Bootchain.tar.md5 рдХреЗ рдЕрдиреБрд░реВрдк рд╕реНрдЯреЙрдХ рдмреВрдЯрдЪреИрди рдлреНрд▓реИрд╢ рдХрд░реЗрдВ
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ рдпреВрдПрд╕рдмреА рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЛ рд╕реАрдбрдмреНрд▓реНрдпреВрдПрдо-рд░рд┐рдХрд╡рд░реА рдореЛрдб рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЪреЗрдХ рдХрд░реЗрдВ:
malefic@lepeshka:~$ adb devices List of devices attached 64cb5c59 recovery
рдорд╛рдЙрдВрдЯ рдкреНрд░рдгрд╛рд▓реА:
malefic@lepeshka:~$ adb shell mount -o rw -t ext4 /dev/block/platform/msm_sdcc.1/by-name/system /system
/System/build.prop рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:
malefic@lepeshka:~$ adb shell "echo \"persist.service.adb.enable=1\" >> /system/build.prop"
рд░реАрдмреВрдЯ:
malefic@lepeshka:~$ adb reboot
рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ adb рд╕реНрдЯреЗрдЯрд╕ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ:
malefic@lepeshka:~$ adb devices List of devices attached 64cb5c59 device
рдмрд┐рдВрдЧреЛ! рдбрд┐рдмрдЧрд┐рдВрдЧ рдЪрд╛рд▓реВ рд╣реИ, рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд╛рд╡рд╛ рд╡реЗрдм рд╕реНрдЯрд╛рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ AndroidScreenCast рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ:
рдпрд╣ Verizon SIM рдХрд╛рд░реНрдб рд╕рдХреНрд░рд┐рдпрдг рд╕реНрдХреНрд░реАрди рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рд╕рд┐рдо рдХрд╛рд░реНрдб рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ рд╕рдХреНрд░рд┐рдпрдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВ:
рднрд╛рд╖рд╛ рдЪрдпрди рд╕реНрдХреНрд░реАрди рдкрд░, рд╕реНрдХреНрд░реАрди рдкрд░ рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ рдХреЛрдиреЗ (рдЖрдкрд╛рддрдХрд╛рд▓реАрди рдХреЙрд▓ рдмрдЯрди рдХреЗ рдКрдкрд░), рдирд┐рдЪрд▓реЗ рджрд╛рдПрдВ рдХреЛрдиреЗ, рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ, рдирд┐рдЪрд▓реЗ рджрд╛рдПрдВ рдФрд░ рд╡реЙрд▓реНрдпреВрдо + рдкрд░ рдЯреИрдк рдХрд░реЗрдВ
рдЕрд░реНрдерд╛рддреН:
malefic@lepeshka:~$ adb shell input tap 10 1150 malefic@lepeshka:~$ adb shell input tap 710 1150 malefic@lepeshka:~$ adb shell input tap 10 1150 malefic@lepeshka:~$ adb shell input tap 710 1150
рддрдм рдореИрдВ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ Vol Up рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реВрдВ, рдЕрдм рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ:
рдПрдХ рдЯрд┐рдХ рд▓рдЧрд╛рдПрдВ рдФрд░ рдУрдХреЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:
malefic@lepeshka:~$ adb shell input tap 50 600 malefic@lepeshka:~$ adb shell input tap 650 600
рд╕реНрдХреНрд░реАрди рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рдЗрдк рдХрд░реЗрдВ:
malefic@lepeshka:~$ adb shell input swipe 100 100 500 100
рдЕрдм рдЖрдкрдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ vnc рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Android VNC рд╕рд░реНрд╡рд░ ред рдЗрд╕реЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ:
malefic@lepeshka:~$ adb install droid+VNC+server+v1.1RC0.apk 4055 KB/s (2084419 bytes in 0.501s) pkg: /data/local/tmp/droid+VNC+server+v1.1RC0.apk Success
рдЬрдм рд╣рдо vnc рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣реЗ рдереЗ, рдФрд░ рд╕реНрдХреНрд░реАрди рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рдЗрдк рдХрд░реЗрдВ: рд╣рдо рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЛ рдЬрдЧрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реЛрддрд╛ рдерд╛ред
malefic@lepeshka:~$ adb shell input keyevent 26 malefic@lepeshka:~$ adb shell input swipe 100 100 500 100
рд╣рдо vnc рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
malefic@lepeshka:~$ adb shell am start -a android.intent.action.Main -n org.onaips.vnc/.MainActivity
рдареАрдХ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:
malefic@lepeshka:~$ adb shell input tap 50 900
рдкреНрд░рд╛рд░рдВрдн рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:
malefic@lepeshka:~$ adb shell input tap 350 300
рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:
malefic@lepeshka:~$ adb shell input tap 600 1000
рдареАрдХ рд╣реИ, рдЕрдм рд╣рдо adb рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
malefic@lepeshka:~$ adb forward tcp:5801 tcp:5801 malefic@lepeshka:~$ adb forward tcp:5901 tcp:5901
рдФрд░ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдпрд╛ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ vnc рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ рдЬрд╛рдПрдВред
рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдлреЛрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╣ рд╡рд╛рдИрдлрд╛рдИ рдХрдиреЗрдХреНрд╢рди рдХреЛ рддреБрд░рдВрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдлрд┐рд░ рдЖрдк рд╡рд╛рдИрдлрд╛рдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлреЛрди рдХреЛ рд╣рд░ рд╕рдордп рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдЧреИрд╕ рдореАрдЯрд░ рд╣рдореЗрд╢рд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдХрд░реАрдм рдирд╣реАрдВ рд╕реНрдерд┐рдд рд╣реИ)ред
рдЕрдм рдЬрдм рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдлреЛрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрд╡рдзрд┐рдХ рдлреЛрдЯреЛрдЧреНрд░рд╛рдлреА
рдЯрд╛рд╕реНрдХрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ, рдЗрд╕рдореЗрдВ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ 00:00 рд╕реЗ 23:59 рддрдХ рд╣рд░ 30 рдорд┐рдирдЯ рдореЗрдВ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдПрдХ рдлреЛрдЯреЛ рд▓реЗрдВред рд╣рдо рд╢реВрдЯрд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдлреЛрди рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдореИрдХреНрд░реЛ рд╢реЙрдЯ рдЕрдирд┐рд╡рд╛рд░реНрдп рдлреНрд▓реИрд╢ рдХреЗ рд╕рд╛рде рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдлреЛрди (рд╢реАрд░реНрд╖ рджреГрд╢реНрдп) рд░рдЦрд╛:
рд░рд╕реНрд╕реА рдХреЗ рд╕рд╛рде рдХрд╛рдЙрдВрдЯрд░ рд╕реЗ рдмрдВрдзрд╛ рдПрдХ рдХрд╛рд░реНрдбрдмреЛрд░реНрдб рдмреЙрдХреНрд╕, рдПрдХ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдЙрд╕рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ, рдПрдХ рдИрдорд╛рдирджрд╛рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрдбреЗ рд╕реЗ рдкреИрдХрд┐рдВрдЧ рд╣реЛрддреА рд╣реИред рдлрд┐рд░ рдореИрдВрдиреЗ рдЯреЗрдк рдФрд░ рдХрд╛рд░реНрдбрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рдлреНрд▓реИрд╢ рд╕реАрдзреЗ рдбрд╛рдпрд▓ рдкрд░ рд╣рд┐рдЯ рди рд╣реЛ, рдЗрд╕рд╕реЗ рдЧрдВрднреАрд░ рдЪрдордХ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддреА рд╣реИред рдореИрдВрдиреЗ рдКрдкрд░ рд╕реЗ рдПрдХ рдврдХреНрдХрди рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдХрд╡рд░ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдпрд╣ рдЕрдВрджрд░ рдЕрдВрдзреЗрд░рд╛ рд╣реЛ, рдЕрдиреНрдпрдерд╛, рдЙрдЬреНрдЬреНрд╡рд▓ рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдореЗрдВ, рдСрдЯреЛрдлреЛрдХрд╕ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдЯреВрд▓ рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рдмреЙрдХреНрд╕ рдХреЛ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЪрд╛рд░реНрдЬрд┐рдВрдЧ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рд╕реЛ рди рдЬрд╛рдП, рдЕрдиреНрдпрдерд╛ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рддрд╕реНрд╡реАрд░реЗрдВ рд▓реЗрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдкрд░реЗрд╢рд╛рди рд╣реЛрддрд╛ рд╣реИред
рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдлреИрд▓ рдЧрдпрд╛
рдореАрдЯрд░ рдХреА рдХреИрдкреНрдЪрд░ рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬреЛ рдХрд┐ рднрд░ рдореЗрдВ рдЖрдпрд╛ рдерд╛ - FolderSync рд▓рд╛рдЗрдЯ ред рдпрд╣ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдПрдХ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Google рдбреНрд░рд╛рдЗрд╡ рдкрд░ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВ рдЕрдм рджреБрдирд┐рдпрд╛ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рд╕реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдореЗрд░реЗ Google рдбреНрд░рд╛рдЗрд╡ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕реЗрд╕ рд╣реИ рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЧреИрд╕ рдмреЙрдпрд▓рд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рднрд╛рдЧ 2. рдорд╛рдиреНрдпрддрд╛
рдЗрд╕рд▓рд┐рдП, рдореАрдЯрд░ рд░реАрдбрд┐рдВрдЧ рдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд░реАрдбрд┐рдВрдЧ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд╣рдЪрд╛рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереАред рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
- рдЧреИрд╕ рдХреА рдЦрдкрдд рдХрд╛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ
- рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧреИрд╕ рдЖрдЙрдЯреЗрдЬ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ (рдИ-рдореЗрд▓ рдпрд╛ рдПрд╕рдПрдордПрд╕ рджреНрд╡рд╛рд░рд╛ рдЪреЗрддрд╛рд╡рдиреА рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде)
рдкрд╛рдпрдерди рдХреЛ рд╡рд┐рдХрд╛рд╕ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, OpenCV рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдпрд╣рд╛рдБ рдкреНрд░рддрд┐ рдШрдВрдЯреЗ рдПрдХ рдмрд╛рд░ рддрд╛рдЬ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
import sys import os from models import getImage, sess from gdrive import getImagesFromGDrive, createImageFromGDriveObject if __name__ == '__main__': # images, http = getImagesFromGDrive() # for img_info in images: # img = createImageFromGDriveObject (img_info, http) file_name = img_info['title'] # try: dbimage = getImage(os.path.basename(file_name)) dbimage.img = img dbimage.download_url = img_info["downloadUrl"] dbimage.img_link = img_info['webContentLink'].replace('&export=download','') except ValueError as e: print e continue # dbimage.identifyDigits() # sess.commit()
рдпрд╣ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рдореИрдВ рдиреАрдЪреЗ рджреВрдВрдЧрд╛:
-
getImagesFromGDrive
- рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ Google рдбреНрд░рд╛рдЗрд╡ рд╕реЗ рдЧреИрд░-рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ -
createImageFromGDriveObject
- рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЫрд╡рд┐ рдХреЛ рд╕реНрд╡рдпрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ OpenCV рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ -
getImage
- рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЫрд╡рд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ -
identifyDigits
- рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдореЗрдВ рд░реАрдбрд┐рдВрдЧ рдХреЛ рдкрд╣рдЪрд╛рдирддреА рд╣реИ -
http
- Google рдбреНрд░рд╛рдЗрд╡ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХреГрдд рдХреНрд▓рд╛рдЗрдВрдЯ, рдпрд╣рд╛рдВ рдбреНрд░рд╛рдЗрд╡ API рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ -
sess
- SQL рдЕрд▓реНрдХреЗрдореА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ
Google рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ Google рдбреНрд░рд╛рдЗрд╡ рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
import os from datetime import tzinfo, timedelta, date from dateutil.relativedelta import relativedelta from apiclient.discovery import build from models import getLastRecognizedImage def getImagesFromGDrive(): # id Google , FOLDER_ID = '0B5mI3ROgk0mJcHJKTm95Ri1mbVU' # http = getAuthorizedHttp() # drive_service = build('drive', 'v2', http=http) # , month_ago = date.today() + relativedelta( months = -1 ) q = "'%s' in parents and mimeType = 'image/jpeg' and trashed = false and modifiedDate<'%s'" % (FOLDER_ID, month_ago.isoformat()) files = drive_service.files().list(q = q, maxResults=1000).execute() for image in files.get('items'): drive_service.files().trash(fileId=image['id']).execute() # , last_image = getLastRecognizedImage() # , page_size = 1000 result = [] pt = None # API 1000 , # 1000 while True: q = "'%s' in parents and trashed = false and mimeType = 'image/jpeg' and modifiedDate>'%s'" % (FOLDER_ID, last_image.check_time.replace(tzinfo=TZ()).isoformat('T')) files = drive_service.files().list(q = q, maxResults=page_size, pageToken=pt).execute() result.extend(files.get('items')) pt = files.get('nextPageToken') if not pt: break # , result.reverse() return result, http
рдЕрдзрд┐рдХреГрдд рдбреНрд░рд╛рдЗрд╡ рдХреНрд▓рд╛рдЗрдВрдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
import httplib2 import ConfigParser from oauth2client.client import OAuth2WebServerFlow from oauth2client.file import Storage def getAuthorizedHttp(): # config.ini CLIENT_ID CLIENT_SECRET config = ConfigParser.ConfigParser() config.read([os.path.dirname(__file__)+'/config.ini']) CLIENT_ID = config.get('gdrive','CLIENT_ID') CLIENT_SECRET = config.get('gdrive','CLIENT_SECRET') # OAuth 2.0 scope that will be authorized. # Check https://developers.google.com/drive/scopes for all available scopes. OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive' # Redirect URI for installed apps REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob' # client_secrets.json storage = Storage(os.path.dirname(__file__) + '/client_secrets.json') credentials = storage.get() # , if not credentials: # Perform OAuth2.0 authorization flow. flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI) authorize_url = flow.step1_get_authorize_url() # , print 'Go to the following link in your browser: ' + authorize_url # code = raw_input('Enter verification code: ').strip() credentials = flow.step2_exchange(code) # storage.put(credentials) # http http = httplib2.Http() credentials.authorize(http) return http
Google рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрдВрд╕реЛрд▓ рдореЗрдВ CLIENT_ID рдФрд░ CLIENT_SECRET рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП API рдФрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ - рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ - OAuth рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, NEW CLIENT ID рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ - рдЕрдиреНрдп рд╡рд╣рд╛рдБ :
рдкрд╣рд▓реА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреА url рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Google рдбреНрд░рд╛рдЗрд╡ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ Google рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рджреЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕реНрдХреНрд░рд┐рдкреНрдЯ
client_secrets.json
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреА рд╕рднреА
client_secrets.json
рдХреЛ
client_secrets.json
рдФрд░ рдмрд╛рдж рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдкреВрдЫреЗрдЧрд╛ред
рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб рд╕рдорд╛рд░реЛрд╣ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ:
import cv2 import numpy as np def downloadImageFromGDrive (downloadUrl, http=None): if http==None: http = getAuthorizedHttp() # resp, content = http.request(downloadUrl) # OpenCV img_array = np.asarray(bytearray(content), dtype=np.uint8) return cv2.imdecode(img_array, cv2.IMREAD_COLOR) def createImageFromGDriveObject (img_info, http=None): return downloadImageFromGDrive(img_info['downloadUrl'], http)
рдлреЛрдЯреЛ рдореЗрдВ рд░реАрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ
рдлрд╝реЛрдЯреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕ рдкрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рдЪрд╛рдиреЗрдВрдЧреЗред
extractDigitsFromImage
рд╡рд┐рдзрд┐
extractDigitsFromImage
:
def extractDigitsFromImage (self): img = self.img
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдлреЛрдЯреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╣рдо рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗред
# 90 h, w, k = img.shape M = cv2.getRotationMatrix2D((w/2,h/2),270,1) img = cv2.warpAffine(img,M,(w,h))
# , img = img[0:h, (wh)/2:h+(wh)/2] h, w, k = img.shape
рдЕрдм рдПрдХ рд▓рд╛рд▓ рдлреНрд░реЗрдо рд╕реЗ рдШрд┐рд░реА рдЫрд╡рд┐ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдХреЗ рднреАрддрд░ рдХрд╛рдлреА рдЕрдиреЛрдЦреА рд╣реИ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд╛рдпрд▓ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ
sample.jpg
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓рд╛ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рд▓рд┐рдЦрд╛:
# sample = cv2.imread(os.path.dirname(__file__)+"/sample.jpg") sample_h, sample_w, sample_k = sample.shape # res = cv2.matchTemplate(img,sample,cv2.TM_CCORR_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # x_center = max_loc[0] + sample_w/2 y_center = max_loc[1] + sample_h/2 # , , # if x_center>w*0.6: img = img[0:h, 0.2*w:w] h, w, k = img.shape x_center = x_center-0.2*w
рдЖрдХреГрддрд┐ рдореЗрдВ рдмрд┐рдВрджреА рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓рд╛ рдерд╛, рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗред рдЕрдЧрд▓рд╛, рд╣рдо рд╕реАрдорд╛ рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЫрд╡рд┐ рдХреЛ рдЧреНрд░реЗ рдЯрди рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд 100 рдФрд░ 200 рджрд╣рд▓реАрдЬ рдореВрд▓реНрдп рд╣реИрдВред
# gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # Canny edges = cv2.Canny(gray, 100, 200)
рдЕрдм рд╣рдо рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐ рдкрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЫрд╡рд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛,
HoughLines
рд╡рд┐рдзрд┐ рднреА рджреВрд░реА рдХреЗ рдХреЛрдг рдФрд░ рд░реЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬ рдЪрд░рдгреЛрдВ рдХреА рдкрд░рд┐рдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рдиреНрдпреВрдирддрдо рд╕реАрдорд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдХ рдереНрд░реЗрд╢реЛрд▓реНрдб рдорд╛рди рд╣реИ рдЬреЛ рдПрдХ рд▓рд╛рдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реАрдорд╛ рдЬрд┐рддрдиреА рдХрдо рд╣реЛрдЧреА, рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЙрддрдиреА рд╣реА рдЕрдзрд┐рдХ рд░реЗрдЦрд╛рдПрдВ рдкрд╛рдПрдЧрд╛ред
# lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)
рдкрд╛рдИ рдЧрдИ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕реЗ, рд╣рдо рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдХреНрд╖реИрддрд┐рдЬ рд░реЗрдЦрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЛрдиреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдЦреЛрдЬреЗ рдЧрдП рдХреЗрдВрджреНрд░ (рдПрдХ рдКрдкрд░ рдФрд░ рдПрдХ рдиреАрдЪреЗ) рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рдкрд╛рддреЗ рд╣реИрдВред
# rho_below = rho_above = np.sqrt(h*h+w*w) line_above = None line_below = None for line in lines: rho,theta = line[0] sin = np.sin(theta) cos = np.cos(theta) # if (sin<0.7): continue # , "" rho_center = x_center*cos + y_center*sin # if rho_center>rho and rho_center-rho<rho_above: rho_above = rho_center-rho line_above = {"rho":rho, "theta":theta, "sin":sin, "cos":cos} # if rho_center<rho and rho-rho_center<rho_below: rho_below = rho-rho_center line_below = {"rho":rho, "theta":theta, "sin":sin, "cos":cos} # , if line_below==None or line_above==None: mylogger.warn("No lines found") return False # , if rho_below/rho_above>1.7 or rho_below/rho_above<0.6: mylogger.warn("Wrong lines found: %f" % (rho_below/rho_above)) return False
рд╣рдо рдЫрд╡рд┐ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдорд┐рд▓реА рд╣реБрдИ рд░реЗрдЦрд╛рдПрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреНрд╖реИрддрд┐рдЬ рд╣реЛ рдЬрд╛рдПрдВ:
# M = cv2.getRotationMatrix2D((0,(line_below["rho"]-line_above["rho"])/2+line_above["rho"]),line_above["theta"]/np.pi*180-90,1) img = cv2.warpAffine(img,M,(w,h))
рдЕрдм рдЬреЛ рдХреБрдЫ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрд╕рдХреЗ рдкреАрдЫреЗ рд╕рдм рдХреБрдЫ рдХрд╛рдЯ рджреЗрдВ:
# img = img[line_above["rho"]:line_below["rho"], 0:w] h, w, k = img.shape
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдбрд╛рдпрд▓ рдХреЗ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдЫрд╡рд┐ рдХреЛ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
# gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) thres = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
рд╣рдо "рдХреЗрдВрджреНрд░реАрдп" рдмрд┐рдВрджреБ рдХреЗ рд╕рдорд╛рди рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд╛рд╣рд┐рдиреЗ рдХрд┐рдирд╛рд░реЗ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдкрд░рд┐рдЪрд╛рд▓рд┐рдд рд╣реИ:
sample_right = cv2.imread(os.path.dirname(__file__)+"/sample_right.jpg",cv2.IMREAD_GRAYSCALE) # res = cv2.matchTemplate(thres,sample_right,cv2.TM_CCORR_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # x_right = max_loc[0]-6
рдмрд╛рдИрдВ рд╕реАрдорд╛ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╢реЛрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдкрди рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
# kernel = np.ones((7,7),np.uint8) thres = cv2.morphologyEx(thres, cv2.MORPH_CLOSE, kernel)
рдЕрдЧрд▓рд╛, рд╣рдо рдмрд╛рдИрдВ рдУрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдВрдЧреЗ, рдЬрдм рддрдХ рд╣рдо рдХрд╛рд▓реЗ рд╕реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдпрд╣ рдмрд╛рдПрдВ рдХрд┐рдирд╛рд░реЗ рд╣реЛрдЧрд╛:
# x_left=0 while x_left<w : if thres[h/2,x_left]==0: break x_left+=1
рдЫрд╡рд┐ рдХреЛ рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдХреНрд░реЙрдк рдХрд░реЗрдВ:
# img = img[:, x_left:x_right] h, w, k = img.shape
рдЖрдЗрдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЪреЗрдХ рдмрдирд╛рдПрдВ рдХрд┐ рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд┐рд▓реА рдЫрд╡рд┐ рдбрд╛рдпрд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ:
# if float(w)/float(h)<6.5 or float(w)/float(h)>9.5: mylogger.warn("Image has bad ratio: %f" % (float(w)/float(h))) return False self.digits_img = img return True
рдирдВрдмрд░реЛрдВ рдкрд░ рд╡рд┐рднрд╛рдЬрди
splitDigits
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд┐рдЫрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рдбрд╛рдпрд▓ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрдХреЛрдВ рдореЗрдВ
splitDigits
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
def splitDigits (self): # , , if None == self.digits_img: if not self.extractDigitsFromImage(): return False img = self.digits_img h, w, k = img.shape
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд╣рдорд╛рд░реА рдбрд╛рдпрд▓ рдХреЛ 8 рдмрд░рд╛рдмрд░ рднрд╛рдЧреЛрдВ рдореЗрдВ рдХрд╛рдЯреЗрдВ:
рд╣рдо рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ 7 рднрд╛рдЧреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ 8 рд╡рд╛рдВ рдЕрдВрдХ рд▓рдЧрд╛рддрд╛рд░ рдШреВрдо рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирдирд╛ рдмреЗрдХрд╛рд░ рд╣реИред
рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЛ b / w рдореЗрдВ
adaptiveThreshold
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрднрд╡рдЬрдиреНрдп рд░реВрдк рд╕реЗ рдЪреБрдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ:
# 8 for i in range(1,8): digit = img[0:h, (i-1)*w/8:i*w/8] dh, dw, dk = digit.shape # / digit_gray = cv2.cvtColor(digit,cv2.COLOR_BGR2GRAY) digit_bin = cv2.adaptiveThreshold(digit_gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 0)
рд╣рдо рдЙрджреНрдШрд╛рдЯрди рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдорджрдж рд╕реЗ рд╢реЛрд░ рдХреЛ рдереЛрдбрд╝рд╛ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВ (рдХреЗрд╡рд▓ рдПрдХ 2x2 рдХрд░реНрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдкрддрд▓реЗ рдХреВрджрдиреЗ рд╡рд╛рд▓реЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдмрдбрд╝реЗ рд╕рдлреЗрдж рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдХрд╛рдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ:
# kernel = np.ones((2,2),np.uint8) digit_bin = cv2.morphologyEx(digit_bin, cv2.MORPH_OPEN, kernel)
рд╕рдореЛрдЪреНрдЪ рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЪрд▓рд╛рдПрдБ
# other, contours, hierarhy = cv2.findContours(digit_bin.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЫрд╡рд┐ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдмрд╣реБрдд рдЫреЛрдЯреЗ рдЖрдХреГрддрд┐ рдФрд░ рдЖрдХреГрддрд┐ рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрдВ, рдлрд┐рд░ рд╣рдо рд╢реЗрд╖ рднрд╛рдЧ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рдореЛрдЪреНрдЪ рдкрд╛рдПрдВрдЧреЗ:
# biggest_contour = None biggest_contour_area = 0 for cnt in contours: M = cv2.moments(cnt) # if cv2.contourArea(cnt)<30: continue # if cv2.arcLength(cnt,True)<30: continue # cx = M['m10']/M['m00'] cy = M['m01']/M['m00'] # , - if cx/dw<0.3 or cx/dw>0.7: continue # if cv2.contourArea(cnt)>biggest_contour_area: biggest_contour = cnt biggest_contour_area = cv2.contourArea(cnt) biggest_contour_cx = cx biggest_contour_cy = cy # , if biggest_contour==None: digit = self.dbDigit(i, digit_bin) digit.markDigitForManualRecognize (use_for_training=False) mylogger.warn("Digit %d: no biggest contour found" % i) continue
рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рдореЛрдЪреНрдЪ рд╣рдорд╛рд░реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЪрд▓реЛ рдПрдХ рдореБрдЦреМрдЯрд╛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд░реЗ рд╕рдм рдХреБрдЫ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрдВ:
# , mask = np.zeros(digit_bin.shape,np.uint8) cv2.drawContours(mask,[biggest_contour],0,255,-1) digit_bin = cv2.bitwise_and(digit_bin,digit_bin,mask = mask)
рдЕрдм рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдХ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕рдореЛрдЪреНрдЪ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдПрдХ рдорд╛рдирдХ рдЖрдХрд╛рд░ рдХреА рдЖрдпрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
# rw = dw/2.0 rh = dh/1.4 # , if biggest_contour_cy-rh/2 < 0: biggest_contour_cy = rh/2 if biggest_contour_cx-rw/2 < 0: biggest_contour_cx = rw/2
рд╣рдо рдЫрд╡рд┐ рдХреЛ рдПрдХ рдЖрдпрдд рдореЗрдВ
digit_base_h = 2
рдФрд░ рдЗрд╕реЗ рджрд┐рдП рдЧрдП рдЖрдХрд╛рд░ рдореЗрдВ рд╕реНрдХреЗрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣
digit_base_h = 2
4,
digit_base_w = 16
ред рдкрд░рд┐рдгрд╛рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред
# digit_bin = digit_bin[int(biggest_contour_cy-rh/2):int(biggest_contour_cy+rh/2), int(biggest_contour_cx-rw/2):int(biggest_contour_cx+rw/2)] # digit_bin = cv2.resize(digit_bin,(digit_base_w, digit_base_h)) digit_bin = cv2.threshold(digit_bin, 128, 255, cv2.THRESH_BINARY)[1] # digit = self.dbDigit(i, digit_bin) return True
рдЕрдВрдХ рдорд╛рдиреНрдпрддрд╛
рдпрд╣рд╛рдБ
identifyDigits
рд╡рд┐рдзрд┐ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
def identifyDigits(self): # , if self.result!='': return True # if len(self.digits)==0: # , if self.img == None: return False # if not self.splitDigits(): return False # , sess.commit() # for digit in self.digits: digit.identifyDigit() # str_digits = map(str,self.digits) # , if '?' in str_digits: return False # self.result = ''.join(str_digits) return True
рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рддреБрдЪреНрдЫ рд╣реИ, рдХреЗрд╡рд▓
identifyDigit
рдкрджреНрдзрддрд┐ рдХреЛ рдЫреЛрдбрд╝рдХрд░:
def identifyDigit (self): # , if self.result!='?': return True if not KNN.recognize(self): # , self.markDigitForManualRecognize() # 7- , "0", , , if self.i==7: self.result = 0 return True return False else: self.use_for_training = True return True
identifyDigit
рд╡рд┐рдзрд┐ рднреА рддреБрдЪреНрдЫ рд╣реИ, рдорд╛рдиреНрдпрддрд╛
KNN.recognize
рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реЛрддреА рд╣реИ, OpenCV рд╕реЗ рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
@staticmethod def recognize(dbdigit): # , if not KNN._trained: KNN.train() # , , h,w = dbdigit.body.shape if h!=digit_base_h or w!=digit_base_w: dbdigit.markDigitForManualRecognize(use_for_training=False) mylogger.warn("Digit %d has bad resolution: %dx %d" % (dbdigit.i,h,w)) return False # sample = dbdigit.body.reshape(digit_base_h*digit_base_w).astype(np.float32) test_data = np.array([sample]) # , - - 5 knn = KNN.getKNN() ret,result,neighbours,dist = knn.find_nearest(test_data,k=5) # if result[0,0]!=neighbours[0,0]: # dbdigit.markDigitForManualRecognize() return False if neighbours[0,1]!=neighbours[0,0] or neighbours[0,2]!=neighbours[0,0]: # dbdigit.markDigitForManualRecognize() return False if dist[0,0]>3000000 or dist[0,1]>3500000 or dist[0,2]>4000000: # dbdigit.markDigitForManualRecognize() return False # , dbdigit.result = str(int(ret)) return True
рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╡рд┐рдзрд┐ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ
KNN.train
:
@staticmethod def getKNN(): # cv2.KNearest if KNN._knn==None: KNN._knn = cv2.KNearest() return KNN._knn @staticmethod def train(): knn = KNN.getKNN() # train_digits = sess.query(Digit).filter(Digit.result!='?').filter_by(use_for_training=True).all() train_data = [] responses = [] for dbdigit in train_digits: h,w = dbdigit.body.shape # if h*w != digit_base_h*digit_base_w: continue # sample = dbdigit.body.reshape(digit_base_h*digit_base_w).astype(np.float32) train_data.append(sample) responses.append(int(dbdigit.result)) # KNN knn.train(np.array(train_data), np.array(responses)) KNN._trained = True
models.py
рдЕрдЧрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдореИрдВ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рдЕрдВрд╢ рджреЗрддрд╛ рд╣реВрдВ , рд▓реЗрдХрд┐рди рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдирд╣реАрдВред
рд▓реЗрдЦ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЧреБрдо рд╣реИ
import datetime from sqlalchemy import Column, Integer, String, Text, Boolean, ForeignKey, DateTime, PickleType from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker import base64 import cv2 import numpy as np import os import logging import sys dbengine = create_engine('sqlite:///' + os.path.dirname(__file__) + '/../db/images.db', echo=False) Session = sessionmaker(bind=dbengine) sess = Session() Base = declarative_base() # image class class Image(Base): __tablename__ = 'images' id = Column(Integer, primary_key=True) file_name = Column(String) img_link = Column(Text) download_url = Column(Text) check_time = Column(DateTime) result = Column(String(8)) digits = relationship("Digit", backref="image") img = None # source image digits_img = None # cropped source image def __init__(self, file_name): self.file_name = file_name self.check_time = datetime.datetime.strptime(file_name, "gaz.%Y-%m-%d.%H.%M.%S.jpg") self.result = "" def __repr__(self): return "<Image ('%s','%s','%s')>" % (self.id, self.file_name, self.result) def dbDigit(self, i, digit_img): digit = sess.query(Digit).filter_by(image_id=self.id).filter_by(i=i).first() if not digit: digit = Digit(self, i, digit_img) sess.add(digit) else: digit.body = digit_img return digit ## # digit class class Digit(Base): __tablename__ = 'digits' id = Column(Integer, primary_key=True) image_id = Column(Integer, ForeignKey("images.id")) i = Column(Integer) body = Column(PickleType) result = Column(String(1)) use_for_training = Column(Boolean) def __init__(self, image, i, digit_img): self.image_id = image.id self.i = i self.body = digit_img self.markDigitForManualRecognize() def __repr__(self): return "%s" % self.result def markDigitForManualRecognize (self, use_for_training=False): self.result = '?' self.use_for_training = use_for_training def getEncodedBody (self): enc = cv2.imencode('.png',self.body)[1] b64 = base64.b64encode(enc) return b64 ## Base.metadata.create_all(bind=dbengine) # function to get Image object by file_name and img def getImage(file_name): image = sess.query(Image).filter_by(file_name=file_name).first() if not image: image = Image(file_name) sess.add(image) # store image object to base sess.commit() image.digits_img = None return image def getLastRecognizedImage(): return sess.query(Image).filter(Image.result!='').order_by(Image.check_time.desc()).first() def dgDigitById(digit_id): digit = sess.query(Digit).get(digit_id) return digit
рд░реАрдбрд┐рдВрдЧ рдФрд░ рдореИрдиреБрдЕрд▓ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдлреНрд▓рд╛рд╕реНрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╡реЗрдм-рдЖрдзрд╛рд░рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреА рд▓рд┐рдЦрд╛ ред рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреЛрдб рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЬреЛ рдХреЛрдИ рднреА рдЗрдЪреНрдЫреБрдХ рд╣реИ рд╡рд╣ рдЗрд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╢реЗрд╖ рдХреЛрдб рднреА рдЬреАрдердм рдкрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ ред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдкреГрд╖реНрда рд╣реИрдВ, рдПрдХ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рд░реАрдбрд┐рдВрдЧ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рджрд┐рди рдпрд╛ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рд▓рд┐рдП:
рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдореИрдиреНрдпреБрдЕрд▓ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдкреГрд╖реНрдаред рдЬрдм рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдкрд╣рд▓реА 20-30 рд░реАрдбрд┐рдВрдЧ рдЪрд▓рд╛рдИ, рддреЛ рд░реЛрдмреЛрдЯ рдиреЗ рдЦреБрдж рдХреЛ рд░реАрдбрд┐рдВрдЧ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╣рдЪрд╛рдирдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдХрднреА-рдХрднреА, рдЕрдкрд╡рд╛рдж рдЕрднреА рднреА рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдорд╛рдиреНрдпрддрд╛ рдирд╣реАрдВ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдбрд╛рдпрд▓ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ:
рдлрд┐рд░ рдЖрдкрдХреЛ рд▓рд╛рдкрддрд╛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╣рд╛рде рд╕реЗ рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
рдпрд╛ рдЖрдк рдмрд╕ рдРрд╕реЗ рд╕рдмреВрддреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд░реНрдЯ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХреБрдЫ рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдХрдИ рд╣рд╛рд▓рд┐рдпрд╛ рд░реАрдбрд┐рдВрдЧ рдХреЗ рд╕рдВрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдИ-рдореЗрд▓ рднреЗрдЬреЗрдЧрд╛ред
рдЕрдЧрд░ рдореИрдВ рдЕрдВрдд рддрдХ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред