рдХреИрд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ OpenCV рдФрд░ рдбреАрдк рд▓рд░реНрдирд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдбреЛрдмрдмрд▓ рдЦреЗрд▓рдирд╛ рд╕рд┐рдЦрд╛рдпрд╛

рдирдорд╕реНрдХрд╛рд░ рдкреНрд░рд┐рдп рдЧреНрд░рд╛рд╣рдХреЛрдВ! рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдПрдХ рдирдпрд╛ рдкрд╛рдареНрдпрдХреНрд░рдо "рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрди" рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рд╣реИ , рдЬрд┐рд╕ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рджрд┐рдиреЛрдВ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд╢реБрд░реВ рд╣реЛрдВрдЧреАред рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ, рд╣рдордиреЗ рд╕реАрд╡реА рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╡рд┐рд╕рд░реНрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред




рдореЗрд░рд╛ рд╢реМрдХ рдмреЛрд░реНрдб рдЧреЗрдо рдЦреЗрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдореИрдВ рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдереЛрдбрд╝рд╛ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдРрд╕рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХрд╛рд░реНрдб рдЧреЗрдо рдореЗрдВ рд╣рд░рд╛ рд╕рдХреЗред рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЫреЛрдЯреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕рд╛рдзрд╛рд░рдг рдбреЛрдмрдмрд▓ рдЧреЗрдо (рдЬрд┐рд╕реЗ рд╕реНрдкреЙрдЯ рдЗрдЯ рдХреЗ рдирд╛рдо рд╕реЗ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ!) рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдпрджрд┐ рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдбреЛрдмрдмрд▓ рдХреНрдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЦреЗрд▓ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реВрдВ: рдбреЛрдмрдмрд▓ рдПрдХ рд╕рд░рд▓ рдкреИрдЯрд░реНрди рдорд╛рдиреНрдпрддрд╛ рдЦреЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рджреЛ рдХрд╛рд░реНрдбреЛрдВ рдкрд░ рдПрдХ рд╕рд╛рде рдЪрд┐рддреНрд░рд┐рдд рдЪрд┐рддреНрд░ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдореВрд▓ рдбреЛрдмрдмрд▓ рдЧреЗрдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдореЗрдВ рдЖрда рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдбреЛрдВ рдкрд░ рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рджреЛ рдХрд╛рд░реНрдб рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЪрд┐рдиреНрд╣ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рдкреНрд░рддреАрдХ рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдХрд╛рд░реНрдб рдЪреБрдиреЗрдВред рдЬрдм 55 рдХрд╛рд░реНрдб рдХрд╛ рдбреЗрдХ рдЦрддреНрдо рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдб рдЬреАрддрддрд╛ рд╣реИред


рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдЖрдЬрдорд╛рдПрдБ: рдЗрди рджреЛрдиреЛрдВ рдХрд╛рд░реНрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдкреНрд░рддреАрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ?

рдХрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ?


рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдирд╛ рд╣реИред рдореИрдВрдиреЗ рдлреЛрди рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдХреА рдЫрд╣ рддрд╕реНрд╡реАрд░реЗрдВ рд▓реАрдВред рдХреБрд▓ 330 рддрд╕реНрд╡реАрд░реЗрдВ рдирд┐рдХрд▓реАрдВред рдЙрдирдореЗрдВ рд╕реЗ рдЪрд╛рд░ рдЖрдк рдиреАрдЪреЗ рджреЗрдЦреЗрдВред рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрд╡реЗрджреА рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ? рд╣рдо рдЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗ!



рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


рдареАрдХ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рдбреЗрдЯрд╛ рд╣реИ, рд╡рд╣ рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ? рд╕рдВрднрд╡рддрдГ рд╕рдлрд▓рддрд╛ рдХреЗ рдкрде рдкрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛: рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгред рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рд╕реЗ рд╡рд░реНрдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╣рдореЗрдВ рдпрд╣рд╛рдБ рдЗрдВрддрдЬрд╛рд░ рд╣реИред рдКрдкрд░ рдХреА рддрд╕реНрд╡реАрд░реЛрдВ рдореЗрдВ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХреБрдЫ рд╡рд░реНрдг рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИрдВ: рд╕реНрдиреЛрдореИрди рдФрд░ рднреВрдд (рддреАрд╕рд░реА рддрд╕реНрд╡реАрд░ рдореЗрдВ) рдФрд░ рд╣рд▓реНрдХреЗ рд░рдВрдЧреЛрдВ рдХреЗ рд╕реБрдИ (рдЪреМрдереЗ рдореЗрдВ), рдФрд░ рдзрдмреНрдмрд╛ (рджреВрд╕рд░реА рддрд╕реНрд╡реАрд░ рдореЗрдВ) рдФрд░ рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди (рдЪреМрдереА рддрд╕реНрд╡реАрд░ рдореЗрдВ) рдХрдИ рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдирддрд╛ рд╣реИред ред рдкреНрд░рдХрд╛рд╢ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЗрдореЗрдЬ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВрдЧреЗ рдФрд░ рд╕реЗрд╡ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреЛрдбрд╝реЗрдВ


рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓реИрдм рдХрд▓рд░ рд╕реНрдкреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред L , рд╣рд▓реНрдХрд╛рдкрди рд╣реИ, рдЬреЛ рд╣рд░реЗ рд░рдВрдЧ рд╕реЗ рдореИрдЬреЗрдВрдЯрд╛ рддрдХ рдХреА рд░реЗрдВрдЬ рдореЗрдВ рдПрдХ рд░рдВрдЧреАрди рдШрдЯрдХ рд╣реИ, рдФрд░ b рдиреАрд▓реЗ рд╕реЗ рдкреАрд▓реЗ рд░рдВрдЧ рдХреА рд╕реАрдорд╛ рдореЗрдВ рд░рдВрдЧреАрди рдШрдЯрдХ рд╣реИред рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ OpenCV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рдШрдЯрдХреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ :

import cv2
import imutils
imgname = 'picture1'
image = cv2.imread(fтАЩ{imgname}.jpgтАЩ)
lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)


рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ: рдореВрд▓ рдЫрд╡рд┐, рд▓рдкрдЯ рдШрдЯрдХ, рдШрдЯрдХ a рдФрд░ рдШрдЯрдХ b

рдЕрдм рд╣рдо рд▓рдкрдЯ рдШрдЯрдХ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╕реЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЫрд╡рд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
cl = clahe.apply(l)
limg = cv2.merge((cl,a,b))
final = cv2.cvtColor(limg, cv2.COLOR_LAB2BGR)


рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ: рдореВрд▓ рдЫрд╡рд┐, рд▓рдкрдЯ рдШрдЯрдХ, рдЙрдЪреНрдЪ рд╡рд┐рдкрд░реАрдд рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдФрд░ рдЫрд╡рд┐ рд╡рд╛рдкрд╕ RGB рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЧрдИ

рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛


рдЕрдм рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВ рдФрд░ рдЫрд╡рд┐ рд╕рд╣реЗрдЬреЗрдВ:

resized = cv2.resize(final, (800, 800))
# save the image
cv2.imwrite(f'{imgname}processed.jpg', blurred)

рдХрд┐рдпрд╛ рд╣реБрдЖ!

рдХрд╛рд░реНрдб рдФрд░ рдЪрд░рд┐рддреНрд░ рдорд╛рдиреНрдпрддрд╛


рдЕрдм рдЫрд╡рд┐ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛ рдЧрдИ рд╣реИ, рд╣рдо рдЫрд╡рд┐ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред OpenCV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдмрд╛рд╣рд░реА рдЖрдХреГрддрд┐ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдЫрд╡рд┐ рдХреЛ рд╣рд╛рдлрд╝рдЯреЛрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдмреНрд▓реИрдХ-рдПрдВрдб-рд╡реНрд╣рд╛рдЗрдЯ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрд╢реЛрд▓реНрдб рдорд╛рди (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 190) рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬреЗрдВред рдХреЛрдб:

image = cv2.imread(fтАЩ{imgname}processed.jpgтАЩ)
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
thresh = cv2.threshold(gray, 190, 255, cv2.THRESH_BINARY)[1]
# find contours
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
output = image.copy()
# draw contours on image
for c in cnts:
    cv2.drawContours(output, [c], -1, (255, 0, 0), 3)


рд╕рдВрд╕рд╛рдзрд┐рдд рдЫрд╡рд┐ рдХреЛ рдереНрд░реЗрд╢реЛрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░реА рдЖрдХреГрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░

рдпрджрд┐ рд╣рдо рдмрд╛рд╣рд░реА рдЖрдХреГрддрд┐ рдХреЛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рдореЛрдЪреНрдЪ рдкрд╛рдПрдВрдЧреЗ - рдпрд╣ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдб рд╣реЛрдЧрд╛ред рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рдлреЗрдж рдкреГрд╖реНрдарднреВрдорд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

# sort by area, grab the biggest one
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
# create mask with the biggest contour
mask = np.zeros(gray.shape,np.uint8)
mask = cv2.drawContours(mask, [cnts], -1, 255, cv2.FILLED)
# card in foreground
fg_masked = cv2.bitwise_and(image, image, mask=mask)
# white background (use inverted mask)
mask = cv2.bitwise_not(mask)
bk = np.full(image.shape, 255, dtype=np.uint8)
bk_masked = cv2.bitwise_and(bk, bk, mask=mask)
# combine back- and foreground
final = cv2.bitwise_or(fg_masked, bk_masked)


рдореБрдЦреМрдЯрд╛, рдкреГрд╖реНрдарднреВрдорд┐, рдЕрдЧреНрд░рднреВрдорд┐ рдЫрд╡рд┐, рдЕрдВрддрд┐рдо рдЫрд╡рд┐

рдЕрдм рдпрд╣ рдЪрд░рд┐рддреНрд░ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╣реИ! рд╣рдо рдлрд┐рд░ рд╕реЗ рдЙрд╕ рдкрд░ рдмрд╛рд╣рд░реА рдЖрдХреГрддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпреЗ рдЖрдХреГрддрд┐ рдкреНрд░рддреАрдХ рд╣реЛрдВрдЧреЗред рдпрджрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддреАрдХ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдХреЛрдб рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рд╣реИ:

# just like before (with detecting the card)
gray = cv2.cvtColor(final, cv2.COLOR_RGB2GRAY)
thresh = cv2.threshold(gray, 195, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.bitwise_not(thresh)
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:10]
# handle each contour
i = 0
for c in cnts:
    if cv2.contourArea(c) > 1000:
        # draw mask, keep contour
        mask = np.zeros(gray.shape, np.uint8)
        mask = cv2.drawContours(mask, [c], -1, 255, cv2.FILLED)
        # white background
        fg_masked = cv2.bitwise_and(image, image, mask=mask)
        mask = cv2.bitwise_not(mask)
        bk = np.full(image.shape, 255, dtype=np.uint8)
        bk_masked = cv2.bitwise_and(bk, bk, mask=mask)
        finalcont = cv2.bitwise_or(fg_masked, bk_masked)
        # bounding rectangle around contour
        output = finalcont.copy()
        x,y,w,h = cv2.boundingRect(c)
        # squares io rectangles
        if w < h:
            x += int((w-h)/2)
            w = h
        else:
            y += int((h-w)/2)
            h = w
        # take out the square with the symbol
        roi = finalcont[y:y+h, x:x+w]
        roi = cv2.resize(roi, (400,400))
        # save the symbol
        cv2.imwrite(f"{imgname}_icon{i}.jpg", roi)
        i += 1


рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдЫрд╡рд┐ (рджрд╣рд▓реАрдЬ), рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдПрдХ рднреВрдд рдкреНрд░рддреАрдХ рдФрд░ рдПрдХ рджрд┐рд▓ рдкреНрд░рддреАрдХ (рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рдирд┐рдХрд╛рд▓реЗ рдЧрдП рд╡рд░реНрдг)

рдЪрд░рд┐рддреНрд░ рдХреА рддрд░рд╣


рдФрд░ рдЕрдм рд╕рдмрд╕реЗ рдЙрдмрд╛рдК! рдЖрдкрдХреЛ рд╡рд░реНрдгреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЯреНрд░реЗрди, рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕рддреНрдпрд╛рдкрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, 57 рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рдкреНрд░рддреНрдпреЗрдХ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрд▓ 57 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдг рд╣реИрдВ)ред рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

symbols
 тФЬтФАтФА test
 тФВ   тФЬтФАтФА anchor
 тФВ   тФЬтФАтФА apple
 тФВ   тФВ   ...
 тФВ   тФФтФАтФА zebra
 тФЬтФАтФА train
 тФВ   тФЬтФАтФА anchor
 тФВ   тФЬтФАтФА apple
 тФВ   тФВ   ...
 тФВ   тФФтФАтФА zebra
 тФФтФАтФА validation
     тФЬтФАтФА anchor
     тФЬтФАтФА apple
     тФВ   ...
     тФФтФАтФА zebra

рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдкрд╛рддреНрд░реЛрдВ (2500 рд╕реЗ рдЕрдзрд┐рдХ рдЯреБрдХрдбрд╝реЗ) рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧреЗрдЧрд╛! рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░реНрд╕, рдЯреЗрд╕реНрдЯ рд╕реВрдЯ рдФрд░ GitHub рдкрд░ рдПрдХ рд╕рддреНрдпрд╛рдкрди рдХрд┐рдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЫрдБрдЯрд╛рдИ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛ ...

рд╕рдВрд╡реИрдзрд╛рдирд┐рдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг


рдЙрдмрд╛рдК рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рдмрд╛рдж, рдордЬрд╝рд╛ рдлрд┐рд░ рд╕реЗ рдЖрддрд╛ рд╣реИ! рдпрд╣ рдПрдХ рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЖрдк рдпрд╣рд╛рдВ рдкрд░ рд╕рдВрд╡реЗрджреА рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

рдореЙрдбрд▓ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдмрд╣реБ-рд╢реНрд░реЗрдгреА рд╡рд░реНрдЧреАрдХрд░рдг рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рд▓реЗрдмрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╣рд╛рдирд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ 57 рдиреЛрдбреНрд╕ рдФрд░ рд╢реНрд░реЗрдгреАрдЧрдд рдХреНрд░реЙрд╕-рдПрдВрдЯреНрд░реЛрдкреА рдХреЗ рд╕рд╛рде рдЖрдЙрдЯрдкреБрдЯ рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдкрд░рдд рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ред

рдЕрдВрддрд┐рдо рдореЙрдбрд▓ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

# imports
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
# layers, activation layer with 57 nodes (one for every symbol)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(400, 400, 3)))
model.add(layers.MaxPooling2D((2, 2)))  
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(256, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(256, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5)) 
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(57, activation='softmax'))
model.compile(loss='categorical_crossentropy',       optimizer=optimizers.RMSprop(lr=1e-4), metrics=['acc'])

рдбреЗрдЯрд╛ рдСрдЧрдореЗрдВрдЯреЗрд╢рди


рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рд╡реГрджреНрдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдбреЗрдЯрд╛ рд╡реГрджреНрдзрд┐, рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдФрд░ рд╡рд┐рд╡рд┐рдзрддрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдпрд╣ рдореМрдЬреВрджрд╛ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдШреБрдорд╛рдиреЗ, рд╢рд┐рдлреНрдЯрд┐рдВрдЧ, рд╕реНрдХреЗрд▓рд┐рдВрдЧ, рдХреНрд░реЙрдкрд┐рдВрдЧ рдФрд░ рдлрд╝реНрд▓рд┐рдк рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд░рд╕ рдЖрд╕рд╛рдиреА рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

# specify the directories
train_dir = 'symbols/train'
validation_dir = 'symbols/validation'
test_dir = 'symbols/test'
# data augmentation with ImageDataGenerator from Keras (only train)
train_datagen = ImageDataGenerator(rescale=1./255, rotation_range=40, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.1, zoom_range=0.1, horizontal_flip=True, vertical_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(train_dir, target_size=(400,400), batch_size=20, class_mode='categorical')
validation_generator = test_datagen.flow_from_directory(validation_dir, target_size=(400,400), batch_size=20, class_mode='categorical')

рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗ, рд╕рдВрд╡рд░реНрдзрд┐рдд рднреВрдд рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рдмрд╛рдИрдВ рдУрд░ рднреВрдд рдХреА рдореВрд▓ рдЫрд╡рд┐, рдЕрдиреНрдп рд╕рднреА рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рд╕рдВрд╡рд░реНрдзрд┐рдд рднреВрдд

рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг


рдЖрдЗрдП рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВ, рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

history = model.fit_generator(train_generator, steps_per_epoch=100, epochs=100, validation_data=validation_generator, validation_steps=50)
# don't forget to save your model!
model.save('models/model.h5')


рдПрдХрджрдо рд╕рд╣реА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА!

рдкрд░рд┐рдгрд╛рдо


рдореВрд▓ рдореЙрдбрд▓ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рд╕рдВрд╡рд░реНрджреНрдзрди, рдбреНрд░реЙрдкрдЖрдЙрдЯ рдФрд░ рдХрдо рдкрд░рддреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕ рдореЙрдбрд▓ рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рджрд┐рдП:


рдореВрд▓ рдореЙрдбрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо

рдирдЧреНрди рдЖрдВрдЦреЛрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдореЙрдбрд▓ рдкреАрдЫреЗ рд╣рдЯ рдЧрдпрд╛ рд╣реИред рдореЙрдбрд▓ рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо (рдЗрд╕рдХрд╛ рдХреЛрдб рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдЖрдк рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╕реЗрдЯ рдкрд░ рд╕рдЯреАрдХрддрд╛ рдФрд░ рдиреБрдХрд╕рд╛рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдВрддрд┐рдо рдореЙрдбрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдоред

рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдкрд░, рдЗрд╕ рдореЙрдбрд▓ рдиреЗ рдХреЗрд╡рд▓ рдПрдХ рдЧрд▓рддреА рдХреА, рдЗрд╕рдиреЗ рдмрдо рдХреЛ рдПрдХ рдмреВрдВрдж рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рджреАред рдореИрдВрдиреЗ рдЗрд╕ рдореЙрдбрд▓ рдкрд░ рд░рд╣рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдкрд░ рд╕рдЯреАрдХрддрд╛ 0.995 рдереАред

рджреЛ рдХрд╛рд░реНрдбреЛрдВ рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддреАрдХ рдХреА рдорд╛рдиреНрдпрддрд╛


рдЕрдм рдЖрдк рджреЛ рдХрд╛рд░реНрдбреЛрдВ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддреАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рджреЛ рддрд╕реНрд╡реАрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпрд╛рдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдбреЛрдВ рдкрд░ рдХреМрди рд╕рд╛ рдкреНрд░рддреАрдХ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 3 рдХрд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  • рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖ: рдХреЛрдИ рднреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдг рдирд╣реАрдВ рдорд┐рд▓рд╛ред
  • рдЪреМрд░рд╛рд╣реЗ рдкрд░ рдПрдХ рдкреНрд░рддреАрдХ рд╣реИ (рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рд╕рдЪ рдпрд╛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддреА рд╣реИ)ред
  • рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрдгреЛрдВ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдкрд░ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЙрдЪреНрдЪрддрдо рд╕рдВрднрд╛рд╡рдирд╛ (рджреЛрдиреЛрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХрд╛ рдФрд╕рдд) рдХреЗ рд╕рд╛рде рдкреНрд░рддреАрдХ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реВрдВред

рд╕рднреА рдХреЗ рд╕рд╛рде рд╕реВрдЪреА рдЭреВрда рдореЗрдВ рджреЛ рдЫрд╡рд┐рдпреЛрдВ рдкрд░ рд╕рдВрдпреЛрдЬрди рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рд▓рд┐рдП рдХреЛрдб GitHub рдХреА main.pyред

рдФрд░ рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:



рдирд┐рд╖реНрдХрд░реНрд╖


рдХреНрдпрд╛ рдпрд╣ рдЖрджрд░реНрд╢ рдореЙрдбрд▓ рдирд╣реАрдВ рд╣реИ? рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢ рдирд╣реАрдВред рдЬрдм рдореИрдВрдиреЗ рдХрд╛рд░реНрдб рдХреА рдирдИ рддрд╕реНрд╡реАрд░реЗрдВ рд▓реАрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рджрд┐рдП, рддреЛ рд╕реНрдиреЛрдореИрди рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВред рдХрднреА-рдХрднреА рд╡рд╣ рдЖрдВрдЦ рдпрд╛ рдЬрд╝реЗрдмрд░рд╛ рдХреЛ рдПрдХ рд╕реНрдиреЛрдореИрди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирддрд╛ рдерд╛! рдирддреАрдЬрддрди, рдХрднреА-рдХрднреА рдкрд░рд┐рдгрд╛рдо рдЕрдЬреАрдм рд╣реЛрддреЗ рдереЗ:


рдЦреИрд░, рдпрд╣рд╛рдВ рд╣рд┐рдордорд╛рдирд╡ рдХрд╣рд╛рдВ рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдореЙрдбрд▓ рдЖрджрдореА рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ? рд╣рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рд┐рдП рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рд▓реЛрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╣рдЪрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЙрдбрд▓ рдЗрд╕реЗ рддреЗрдЬреА рд╕реЗ рдХрд░рддрд╛ рд╣реИ! рдореИрдВрдиреЗ рдЙрд╕ рд╕рдордп рдХреЛ рджреЗрдЦрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрдпреВрдЯрд░ рдореИрдереБрди рдХрд░ рд░рд╣рд╛ рд╣реИ: рдореИрдВрдиреЗ 55 рдХрд╛рд░реНрдбреЛрдВ рдХрд╛ рдПрдХ рдбреЗрдХ рджрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рджреЛ рдХрд╛рд░реНрдбреЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддреАрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛ред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдпреЗ 1485 рд╕рдВрдпреЛрдЬрди рд╣реИрдВред рдХрдВрдкреНрдпреВрдЯрд░ рдиреЗ рдЗрд╕реЗ 140 рд╕реЗрдХрдВрдб рд╕реЗ рднреА рдХрдо рд╕рдордп рдореЗрдВ рдХрд┐рдпрд╛ред рдЙрд╕рдиреЗ рдХреБрдЫ рдЧрд▓рддрд┐рдпрд╛рдБ рдХреАрдВ, рд▓реЗрдХрд┐рди рд╡рд╣ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рд░рд╛ рджреЗрдЧрд╛ рдЬрдм рдпрд╣ рдЧрддрд┐ рдореЗрдВ рдЖрддрд╛ рд╣реИ!



рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ 100% рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдпрд╣ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореЙрдбрд▓ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдкрд░реАрдХреНрд╖рдг рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдкрд░рддреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ рдЕрдЧрд▓реА рдмрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!



рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ рдФрд░ рдкреНрд░рд╡реЗрд╢ рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХрд░реЗрдВ



All Articles