OpenCV рдХреЗ рд╕рд╛рде GIF рдмрдирд╛рдПрдБ



рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ OpenCV, Python рдФрд░ ImageMagick рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдирд┐рдореЗрдЯреЗрдб GIF рдХреИрд╕реЗ рдмрдирд╛рдПрдВред рдлрд┐рд░ OpenCV рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдо рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ!

рд╣рдо рд╕рднреА рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рд╣рдВрд╕рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдФрд░ рд╢рд╛рдпрдж рд▓реБрд▓рдЬрд╛ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдореЗрдореЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдореЗрд░реЗ рдХреБрдЫ рдкрд╕рдВрджреАрджрд╛:

  • Krogit рдореЗрдВрдврдХ: "рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░рд╛ рд╡реНрдпрд╡рд╕рд╛рдп рдирд╣реАрдВ рд╣реИ"
  • рдХреНрд░реЛрдзреА рдмрд┐рд▓реНрд▓реА
  • рдорд╣рд╛рдХрд╛рд╡реНрдп рдХреА рд╡рд┐рдлрд▓рддрд╛
  • рдЕрдЪреНрдЫрд╛ рдЖрджрдореА рдЬреАрдЬреА

рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореЗрдо "рдбреАрд▓ рд╡рд┐рде рдЗрдЯ" рдореЗрдо ("рдЗрд╕рдХреЗ рд╕рд╛рде рдбреАрд▓" рдпрд╛ "рдЗрд╕реЗ рдЦреБрдж рд╕рдордЭреЗрдВ") рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  1. рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╡рд╛рдм рдпрд╛ рдЖрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рдХрд╛рдо рдХреЛ рдордВрдЬреВрд░реА рдирд╣реАрдВ рджреЗрддрд╛ / рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ("рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реМрджрд╛")
  2. рдЕрдкрдиреЗ рдЪрд╢реНрдореЗ рдкрд░ рд░рдЦрдирд╛ рдорд╛рдиреЛ рдЖрдк рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рдХрд░ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ ("рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╕рдордЭреЗрдВ")

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

OpenCV рдкрд░ рдореЗрдореЗ рдЬрдирд░реЗрдЯрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╣рдореЗрдВ рдХрдИ рдореВрд▓реНрдпрд╡рд╛рди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХреМрд╢рд▓ рд╕рд┐рдЦрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  1. рдбреАрдк рд▓рд░реНрдирд┐рдВрдЧ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдлреЗрд╕ рдбрд┐рдЯреЗрдХреНрд╢рди
  2. рдЪреЗрд╣рд░реЗ рдХреА рдЬрдЧрд╣реЗрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдЖрдВрдЦреЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП dlib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  3. рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдВрдЦреЛрдВ рдХреЗ рдмреАрдЪ рд░реЛрдЯреЗрд╢рди рдХреЗ рдХреЛрдг рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ
  4. рдФрд░ рдЕрдВрдд рдореЗрдВ, OpenCV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдирд┐рдореЗрдЯреЗрдб GIF рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ (ImageMagick рд╕реЗ рдереЛрдбрд╝реА рдорджрдж рдХреЗ рд╕рд╛рде)

рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдордЬрд╝реЗрджрд╛рд░ рдФрд░ рдордиреЛрд░рдВрдЬрдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП - рдФрд░ рд╕рд╛рде рд╣реА рдЖрдкрдХреЛ рдореВрд▓реНрдпрд╡рд╛рди рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреМрд╢рд▓ рд╕рд┐рдЦрд╛рдПрдБ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХрд╛рдо рдЖрддреЗ рд╣реИрдВред

OpenCV рдХреЗ рд╕рд╛рде GIF рдмрдирд╛рдирд╛


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

рдлрд┐рд░ рд╣рдорд╛рд░реЗ OpenCV GIF рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ / рдХреИрдЯрд▓реЙрдЧ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдЬреИрд╕реЗ рд╣реА рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ, рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ: 1) рд╣рдорд╛рд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓; 2) OpenCV рдХреЗ рд╕рд╛рде GIF рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рд▓реЛрдХрдкреНрд░рд┐рдп рдореЗрдо "рдбреАрд▓ рд╡рд┐рдж рдЗрдЯ" рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВрдЧреЗред

рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛рдПрдБ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ



рдЕрдВрдЬреАрд░ред 1. рд╣рдо GIF рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП OpenCV, dlib рдФрд░ ImageMagick рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ

Opencv рдФрд░ dlib


OpenCV рдХреЛ рдлреНрд░реЗрдо рдФрд░ рдмреЗрд╕рд┐рдХ рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЗрдВ рдЪреЗрд╣рд░реЗ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдкрд░ OpenCV рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдореЗрд░реЗ рдХрд┐рд╕реА OpenCV рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдЧрд╛рдЗрдб рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред

рд╣рдо рдЪреЗрд╣рд░реЗ рдХреА рд╕реНрдерд▓реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд▓рд┐рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдЪреЗрд╣рд░реЗ рдкрд░ рджреЛ рдЖрдБрдЦреЗрдВ рдЦреЛрдЬрдиреЗ рдФрд░ рдзреВрдк рдХрд╛ рдЪрд╢реНрдорд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ dlib рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

ImageMagick


рдпрджрд┐ рдЖрдк ImageMagick рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╡реНрдпрд░реНрде рдореЗрдВред рдпрд╣ рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЯреВрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдлреАрдЪрд░реНрд╕ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк PNG / JPG рдХреЛ рдПрдХ рдХрдорд╛рдВрдб рд╕реЗ PDF рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред

рдХрдИ рдЫрд╡рд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдЖрдкрдХреЛ рдПрдХ рдмрд╣реБ-рдкреГрд╖реНрда рдкреАрдбреАрдПрдл рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЖрд╕рд╛рдиреА рд╕реЗред

рдмрд╣реБрднреБрдЬ, рд░реЗрдЦрд╛рдУрдВ рдФрд░ рдЕрдиреНрдп рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдФрд░ рдпрд╣ рд╕рдВрднрд╡ рд╣реИред

рдХреИрд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреИрдЪ рд░рдВрдЧ рдЧреНрд░реЗрдбрд┐рдВрдЧ рдпрд╛ рдПрдХ рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рднреА рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ OpenCV рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдореЗрдВ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

ImageMagick рдХрд┐рд╕реА рднреА рдЗрдореЗрдЬ рд╕реЗ GIF рднреА рдмрдирд╛рддрд╛ рд╣реИред

Ubuntu (рдпрд╛ рд░рд╛рд╕реНрдкрд┐рдпрди) рдкрд░ ImageMagick рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ apt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

OpenCVShell рдХреЗ рд╕рд╛рде GIF рдмрдирд╛рдирд╛

$ sudo apt-get install imagemagick 

MacOS рдкрд░, рдЖрдк HomeBrew рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 $ brew install imagemagick 

imutils


рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЗрдЦреЛрдВ, рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдФрд░ рдкреБрд╕реНрддрдХреЛрдВ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ imutils рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 $ pip install imutils 

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛



рдЕрдВрдЬреАрд░ред 2. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рджреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ, рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдХ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ

рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рджреЛ рдХреИрдЯрд▓реЙрдЧ рд╣реИрдВ:

  • images/ : рдЗрдирдкреБрдЯ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдПрдирд┐рдореЗрдЯреЗрдб GIF рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕рд╛рде рдХреБрдЫ рдЫрд╡рд┐рдпрд╛рдВ рдорд┐рд▓реАрдВ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред
  • assets/ : рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣рдорд╛рд░рд╛ рдлреЗрд╕ рдбрд┐рдЯреЗрдХреНрдЯрд░, рдлреЗрд╕ рд▓реИрдВрдбрдорд╛рд░реНрдХ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдФрд░ рд╕рднреА рдЪрд┐рддреНрд░ + рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рд╕реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрди рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдкрд╣рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдореВрд▓ рдЪрд┐рддреНрд░реЛрдВ рдкрд░ рдЕрдВрдХ рдФрд░ рдкрд╛рда рдбрд╛рд▓реЗрдВрдЧреЗред

рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдореИрдВрдиреЗ JSON рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЬреЛ: 1) рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рдВрдкрд╛рджрди рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛; 2) рдХрдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рд╡рд┐рдиреНрдпрд╛рд╕ рдкреИрд░рд╛рдореАрдЯрд░ config.json рдореЗрдВ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИрдВред

config.json рдФрд░ create_gif.py рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд▓рдЧрднрдЧред рдкреНрд░рддрд┐: рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди, рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдФрд░ OpenCV рдкрд░ 17-рдкреЗрдЬ рдореИрдиреБрдЕрд▓ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рджрд░реНрдкрдг: рд╕реНрд░реЛрдд рдХреЛрдб , рдореИрдиреБрдЕрд▓ )ред

OpenCV рдХреЗ рд╕рд╛рде GIF рдЬрдирд░реЗрд╢рди


рддреЛ, рдЪрд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдирд╛ OpenCV GIF рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!

JSON рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА


рдЖрдЗрдП JSON рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЬрд╛рдПрдВред

рдПрдХ рдирдпрд╛ config.json рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреБрдВрдЬреА / рдорд╛рди рдЬреЛрдбрд╝реЗ рдбрд╛рд▓реЗрдВ:

OpenCVPththon рдХреЗ рд╕рд╛рде GIF рдмрдирд╛рдирд╛

 { "face_detector_prototxt": "assets/deploy.prototxt", "face_detector_weights": "assets/res10_300x300_ssd_iter_140000.caffemodel", "landmark_predictor": "assets/shape_predictor_68_face_landmarks.dat", 

рдпреЗ OpenCV рдлреЗрд╕ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдореЙрдбрд▓ рдлрд╛рдЗрд▓реНрд╕ рдбреАрдк рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ рд╣реИрдВ ред

рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ dlib рдлреЗрд╕ рдкреНрд░реЗрдбрд┐рдХреНрдЯрд░ рдХрд╛ рдорд╛рд░реНрдЧ рд╣реИред

рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдореЗрдЬ рдлрд╛рдЗрд▓ рдХреЗ рдХреБрдЫ рд░рд╛рд╕реНрддреЗ рд╣реИрдВ:

 "sunglasses": "assets/sunglasses.png", "sunglasses_mask": "assets/sunglasses_mask.png", "deal_with_it": "assets/deal_with_it.png", "deal_with_it_mask": "assets/deal_with_it_mask.png", 

рдпреЗ рд╣рдорд╛рд░реЗ рдзреВрдк рдХреЗ рдЪрд╢реНрдореЗ, рдкрд╛рда рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд░рд╛рд╕реНрддреЗ рд╣реИрдВ, рдЬреЛ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлреИрдВрд╕реА рдзреВрдк рдХрд╛ рдЪрд╢реНрдорд╛ рдФрд░ рдПрдХ рдореБрдЦреМрдЯрд╛:


рдЕрдВрдЬреАрд░ред 3. рдЖрдкрдХреЛ рдкрд┐рдХреНрд╕рд▓ рд╡рд╛рд▓реЗ рдЪрд╢реНрдореЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИрдВ? рдмрд╕ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рдЦреЛ


рдЕрдВрдЬреАрд░ред 4. рдЖрдкрдХреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдзреВрдк рдХреЗ рдЪрд╢реНрдореЗ рдХреЗ рд▓рд┐рдП рдорд╛рд╕реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдмрд╕ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рдЦреЛ - рдпрд╛ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдмрд╛рдХреА рд▓реЗрдЦ рдкрдврд╝реЗрдВред

рдФрд░ рдЕрдм рд╣рдорд╛рд░рд╛ рдкрд╛рда "рдЖрдИрдЯреА рдХреЗ рд╕рд╛рде рд╕реМрджрд╛" рдФрд░ рдореБрдЦреМрдЯрд╛ рд╣реИ:


рдЕрдВрдЬреАрд░ред 5. рдХреНрдпрд╛ рдЖрдк Helvetica Neue Condensed рд╕реЗ рдирдлрд░рдд рдХрд░рддреЗ рд╣реИрдВ? рдЗрд╕рд╕реЗ рдирд┐рдкрдЯреЛ


рдЕрдВрдЬреАрд░ред 6: рдпрд╣ рдореБрдЦреМрдЯрд╛ рдЖрдкрдХреЛ рдкрд╛рда рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╕реАрдорд╛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдУрд╣, рд╢рд╛рдпрдж рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ, рдХреНрдпрд╛ рдЖрдк рдПрдХ рд╕реАрдорд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдареАрдХ рд╣реИ, рдЗрд╕рдХреЗ рд╕рд╛рде рд░рдЦреЛ

рдлреЛрдЯреЛ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЫрд╡рд┐ рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд╕реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред

рдЕрдм рдореЗрдо рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:

  "min_confidence": 0.5, "steps": 20, "delay": 5, "final_delay": 250, "loop": 0, "temp_dir": "temp" } 

рдпрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рджреА рдЧрдИ рд╣реИрдВ:

  • min_confidence : рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рдЪреЗрд╣рд░рд╛ рдкрд╣рдЪрд╛рди рд╕рдВрднрд╛рд╡рдирд╛ред
  • steps : рдЕрдВрддрд┐рдо рдПрдиреАрдореЗрд╢рди рдореЗрдВ рдлрд╝реНрд░реЗрдо рдХреА рд╕рдВрдЦреНрдпрд╛ред рдкреНрд░рддреНрдпреЗрдХ "рд╕реНрдЯреЗрдк" рдзреВрдк рдХреЗ рдЪрд╢реНрдореЗ рдХреЛ рдКрдкрд░реА рд╕реАрдорд╛ рд╕реЗ рдиреАрдЪреЗ рд▓рдХреНрд╖реНрдп (рдпрд╛рдиреА рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП) рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред
  • delay : рд╕реЗрдХрдВрдб рдХреЗ рд╕реМрд╡реЗрдВ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдлреНрд░реЗрдо рдХреЗ рдмреАрдЪ рджреЗрд░реАред
  • final_delay : рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рд╕реМрд╡реЗрдВ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЕрдВрддрд┐рдо рдлреНрд░реЗрдо рдореЗрдВ рджреЗрд░реА (рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдкрдпреЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рда рдмрд╛рдХреА рдлрд╝реНрд░реЗрдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛ)ред
  • loop : рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬреАрдЖрдИрдПрдл рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдиреАрдореЗрд╢рди рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
  • temp_dir : рдЕрдВрддрд┐рдо рдЬреАрдЖрдИрдПрдл рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕реНрдерд╛рдпреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реНрд░реЗрдо рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореЗрдо, GIF рдФрд░ OpenCV


рд╣рдордиреЗ JSON рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ, рдЕрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ, рдЗрд╕реЗ create_gif.py рдирд╛рдо рджреЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ:

 #    from imutils import face_utils from imutils import paths import numpy as np import argparse import imutils import shutil import json import dlib import cv2 import sys import os 

рдпрд╣рд╛рдВ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо imutils, dlib рдФрд░ OpenCV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдП рдЧрдП рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛рдПрдБ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВред

рдЕрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд╣реИрдВ, рддреЛ overlay_image рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 def overlay_image(bg, fg, fgMask, coords): #     (, )  #    (sH, sW) = fg.shape[:2] (x, y) = coords #          #  ,   , **  # ,    overlay = np.zeros(bg.shape, dtype="uint8") overlay[y:y + sH, x:x + sW] = fg # - , **  ** # ,    ,    # ,       alpha = np.zeros(bg.shape[:2], dtype="uint8") alpha[y:y + sH, x:x + sW] = fgMask alpha = np.dstack([alpha] * 3) #  -   , #   - output = alpha_blend(overlay, bg, alpha) #   return output 

overlay_image рдлрдВрдХреНрд╢рди, рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЗрдореЗрдЬ ( bg ) рдХреЗ рдКрдкрд░ fgMask ( рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (x, y) ) рдкрд░ рдПрдХ рдЕрдЧреНрд░рднреВрдорд┐ ( fg ) рд▓рдЧрд╛рддрд╛ рд╣реИ, рдЬреЛ fgMask рдлреЛрд░рдЧреНрд░рд╛рдЙрдВрдб рдорд╛рд╕реНрдХ рдкрд░ рдЕрд▓реНрдлрд╛ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ fgMask рд╣реИред

рдУрдкрдирд╕реАрд╡реА рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдЗрд╕ рдЧрд╛рдЗрдб рдХреЛ рдкрдврд╝рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рд╕рдореНрдорд┐рд╢реНрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд▓реНрдлрд╛ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХрд░реЗрдВ:

 def alpha_blend(fg, bg, alpha): #  ,    - #        [0, 1] fg = fg.astype("float") bg = bg.astype("float") alpha = alpha.astype("float") / 255 #  - fg = cv2.multiply(alpha, fg) bg = cv2.multiply(1 - alpha, bg) #     ,    output = cv2.add(fg, bg) #   return output.astype("uint8") 

рдпрд╣ рдЕрд▓реНрдлрд╛ рдмреНрд▓реЗрдВрдбрд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди LearnOpenCV рдмреНрд▓реЙрдЧ рдкрд░ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рдЕрдЧреНрд░рднреВрдорд┐, рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕реАрдорд╛ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ [0, 1] ред рдлрд┐рд░ рд╣рдо рдЕрд▓реНрдлрд╛ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рднреВрдорд┐ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред

рд╣рдо рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рднреА рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ ImageMagick рдФрд░ convert рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рдкрдереЛрдВ рдХреЗ рд╕реЗрдЯ рд╕реЗ GIF рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

 def create_gif(inputPath, outputPath, delay, finalDelay, loop): #        imagePaths = sorted(list(paths.list_images(inputPath))) #      lastPath = imagePaths[-1] imagePaths = imagePaths[:-1] #   imagemagick 'convert'  #  GIF      #   ( ) cmd = "convert -delay {} {} -delay {} {} -loop {} {}".format( delay, " ".join(imagePaths), finalDelay, lastPath, loop, outputPath) os.system(cmd) 

create_gif рдлрд╝рдВрдХреНрд╢рди рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрд╝реНрд░реЗрдо рдФрд░ рдЫреЛрд░реЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рджреЗрд░реА рдХреЗ рд╕рд╛рде GIF рдПрдирд┐рдореЗрд╢рди рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИред ImageMagick рдпрд╣ рд╕рдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ - рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ convert рдХрдорд╛рдВрдб рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЙрдкрд▓рдмреНрдз convert рддрд░реНрдХ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ ред рд╡рд╣рд╛рдБ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рдЯреАрдо рдХреЗ рдХрд┐рддрдиреЗ рдХрд╛рд░реНрдп рд╣реИрдВ!

рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо:

  • imagePaths рд▓реЗрдВред
  • рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдХрд╛ рдкрде рдЪреБрдиреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд▓рдВрдм рд╣реЛрдЧрд╛ред
  • рдЕрдВрддрд┐рдо рдкрде рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП imagePaths рдкреБрди: рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред
  • рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ GIF рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП convert рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдкрдиреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ:

 #      ap = argparse.ArgumentParser() ap.add_argument("-c", "--config", required=True, help="path to configuration file") ap.add_argument("-i", "--image", required=True, help="path to input image") ap.add_argument("-o", "--output", required=True, help="path to output GIF") args = vars(ap.parse_args()) 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • --config : JSON рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрдеред рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреАред
  • --image : рдЗрдирдкреБрдЯ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдкрде, рдЬрд┐рд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╛рдиреА рдЪреЗрд╣рд░реЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛, рдзреВрдк рдХрд╛ рдЪрд╢реНрдорд╛ рдЬреЛрдбрд╝рдирд╛, рдФрд░ рдлрд┐рд░ рдкрд╛рда)ред
  • --output : рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк GIF рдХреЗ рд▓рд┐рдП рдкрдеред

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди / рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддреЗ рд╕рдордп рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓, рд╕рд╛рде рд╣реА рдЪрд╢реНрдорд╛ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рд╕реНрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:

 #    JSON, #     config = json.loads(open(args["config"]).read()) sg = cv2.imread(config["sunglasses"]) sgMask = cv2.imread(config["sunglasses_mask"]) #    (  ),   #  ,  ,     #   GIF- shutil.rmtree(config["temp_dir"], ignore_errors=True) os.makedirs(config["temp_dir"]) 

рдпрд╣рд╛рдВ рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкрд╛рдпрдерди рдбрд┐рдХреНрд╢рдирд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛ рд╕рдХрддреА рд╣реИ)ред рдлрд┐рд░ рдзреВрдк рдХрд╛ рдЪрд╢реНрдорд╛ рдФрд░ рдореБрдЦреМрдЯрд╛ рд▓реЛрдб рдХрд░реЗрдВред

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

рдЕрдм OpenCV рдбреАрдк рд▓рд░реНрдирд┐рдВрдЧ рдлреЗрд╕ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ:

 # load our OpenCV face detector and dlib facial landmark predictor print("[INFO] loading models...") detector = cv2.dnn.readNetFromCaffe(config["face_detector_prototxt"], config["face_detector_weights"]) predictor = dlib.shape_predictor(config["landmark_predictor"]) 

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, cv2.dnn.readNetFromCaffe рдХреЙрд▓ рдХрд░реЗрдВред dnn рдореЙрдбреНрдпреВрд▓ рдХреЗрд╡рд▓ OpenCV 3.3 рдпрд╛ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдПрдХ рдЪреЗрд╣рд░рд╛ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдЫрд╡рд┐ рдореЗрдВ рдЪреЗрд╣рд░реЗ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛:


рдЕрдВрдЬреАрд░ред 7. OpenCV DNN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлреЗрд╕ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдСрдкрд░реЗрд╢рди

рдлрд┐рд░ dlib рдлреЗрд╕ рд▓реИрдВрдбрдорд╛рд░реНрдХ рдкреНрд░реЗрдбрд┐рдХреНрдЯрд░ рд▓реЛрдб рдХрд░реЗрдВред рдпрд╣ рдЖрдкрдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛: рдЖрдБрдЦреЗрдВ, рднреМрдВ, рдирд╛рдХ, рдореБрдВрд╣ рдФрд░ рдареЛрдбрд╝реА рд░реЗрдЦрд╛:


рдЕрдВрдЬреАрд░ред 8. dlib рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬреЗ рдЧрдП рд╕реНрдерд▓ рдореЗрд░реЗ рдЪреЗрд╣рд░реЗ рдкрд░ рдЕрдВрдХрд┐рдд рд╣реИрдВ

рдмрд╛рдж рдореЗрдВ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдЖрдВрдЦ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред

рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЪрд▓реЛ рдЪреЗрд╣рд░рд╛ рдорд┐рд▓:

 #       image = cv2.imread(args["image"]) (H, W) = image.shape[:2] blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0)) #        print("[INFO] computing object detections...") detector.setInput(blob) detections = detector.forward() #       ,  #  ,      i = np.argmax(detections[0, 0, :, 2]) confidence = detections[0, 0, i, 2] #    if confidence < config["min_confidence"]: print("[INFO] no reliable faces found") sys.exit(0) 

рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ:

  • рдореВрд▓ image рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
  • рд╣рдо рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдлреЗрд╕ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ blob рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрд▓реЗрдЦ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ OpenCV рд╕реЗ blobFromImage рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  • рдЪреЗрд╣рд░рд╛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВред
  • рд╣рдо рдЙрдЪреНрдЪрддрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдиреНрдпреВрдирддрдо рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕рдВрднрд╛рд╡рдирд╛ рд╕реАрдорд╛ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдорд╛рдирджрдВрдб рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВред рдЕрдиреНрдпрдерд╛, рдЬрд╛рд░реА рд░рдЦреЗрдВред

рдЕрдм рд╣рдо рдЪреЗрд╣рд░реЗ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ рдФрд░ рд╕реНрдерд▓реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ:

 #   (x, y)  #    box = detections[0, 0, i, 3:7] * np.array([W, H, W, H]) (startX, startY, endX, endY) = box.astype("int") #    dlib    #       rect = dlib.rectangle(int(startX), int(startY), int(endX), int(endY)) shape = predictor(image, rect) shape = face_utils.shape_to_np(shape) #        ,  #     (lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"] (rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"] leftEyePts = shape[lStart:lEnd] rightEyePts = shape[rStart:rEnd] 

рдЪреЗрд╣рд░реЗ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдЪреЗрд╣рд░реЗ рдХреЗ рд╕реНрдерд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ:

  • рд╣рдо рдЪреЗрд╣рд░реЗ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред
  • Dlib рдореЗрдВ рдПрдХ rectangle рд╡рд╕реНрддреБ рдмрдирд╛рдПрдБ рдФрд░ рдЪреЗрд╣рд░реЗ рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рд▓рд╛рдЧреВ рдХрд░реЗрдВред
  • рд╣рдо рдХреНрд░рдорд╢рдГ leftEyePts рдФрд░ rightEyePts leftEyePts рдХреА leftEyePts x (y, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ ) рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдЖрдВрдЦреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдзреВрдк рдХрд╛ рдЪрд╢реНрдорд╛ рдХрд╣рд╛рдВ рдФрд░ рдХреИрд╕реЗ рд▓рдЧрд╛рдПрдВ:

 #       leftEyeCenter = leftEyePts.mean(axis=0).astype("int") rightEyeCenter = rightEyePts.mean(axis=0).astype("int") #      dY = rightEyeCenter[1] - leftEyeCenter[1] dX = rightEyeCenter[0] - leftEyeCenter[0] angle = np.degrees(np.arctan2(dY, dX)) - 180 #      ,  #      sg = imutils.rotate_bound(sg, angle) #     **  ,    #   тАФ       # 90%       sgW = int((endX - startX) * 0.9) sg = imutils.resize(sg, width=sgW) #      ( ,   #  ),      #     - тАФ   #       , #     sgMask = cv2.cvtColor(sgMask, cv2.COLOR_BGR2GRAY) sgMask = cv2.threshold(sgMask, 0, 255, cv2.THRESH_BINARY)[1] sgMask = imutils.rotate_bound(sgMask, angle) sgMask = imutils.resize(sgMask, width=sgW, inter=cv2.INTER_NEAREST) 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЖрдВрдЦ рдХреЗ рдХреЗрдВрджреНрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╕реЗрдВрдЯреНрд░реЛрдЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдХрд╛ рдХреЛрдгред рдлрд╝реНрд░реЗрдо рдореЗрдВ рдЪреЗрд╣рд░реЗ рдХреЗ рдХреНрд╖реИрддрд┐рдЬ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдСрдкрд░реЗрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рдЖрдк рдЪрд╢реНрдореЗ рдХреЛ рдШреБрдорд╛ рдФрд░ рдЖрдХрд╛рд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд░реЛрдЯреЗрдЯ_рдмрд╛рдЙрдВрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ , рди рдХрд┐ рдХреЗрд╡рд▓ rotate , рддрд╛рдХрд┐ рдУрдкрдирд╕реАрд╡реА рдЙрди рднрд╛рдЧреЛрдВ рдХреЛ рдЯреНрд░рд┐рдо рди рдХрд░реЗрдВ рдЬреЛ рдХрд┐ рдПрдлрд╛рдЗрди рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред

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

рдиреЛрдЯ: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдорд╛рд╕реНрдХ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рддреЗ рд╕рдордп, рд╣рдо рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕реА рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд╖реЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдорд╛рд╕реНрдХ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдорд╛рди (0 рдФрд░ 255) рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдп рдкреНрд░рдХреНрд╖реЗрдк рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрдзрд┐рдХ рд╕реМрдВрджрд░реНрдпрд╡рд╛рджреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдорд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВред рдпрд╣рд╛рдВ рдЖрдк рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕реА рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдкреНрд░рдХреНрд╖реЗрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреЛрдб рдХреЗ рд╢реЗрд╖ рддреАрди рдмреНрд▓реЙрдХ GIF рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдо рдмрдирд╛рддреЗ рд╣реИрдВ:

 #    ,   #  N       #    steps = np.linspace(0, rightEyeCenter[1], config["steps"], dtype="int") # start looping over the steps for (i, y) in enumerate(steps): #      #  ,    **    #  ,       #   shiftX = int(sg.shape[1] * 0.25) shiftY = int(sg.shape[0] * 0.35) y = max(0, y - shiftY) # add the sunglasses to the image output = overlay_image(image, sg, sgMask, (rightEyeCenter[0] - shiftX, y)) 

рдЫрд╡рд┐ рдХреЗ рдКрдкрд░ рд╕реЗ рдЪрд╢реНрдорд╛ рдЧрд┐рд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдкрд░, рдЙрдиреНрд╣реЗрдВ рдЪреЗрд╣рд░реЗ рдХреЗ рдХрд░реАрдм рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдЕрдкрдиреА рдЖрдВрдЦреЛрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддреЗред JSON рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ "steps" рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП y-рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХреЗ рдмрд┐рдирд╛, рд╣рдо NumPy рд╕реЗ рд▓рд┐рдВрдЪрд╕реНрдкреЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

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

overlay_image рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, overlay_image рдЕрдВрддрд┐рдо output рдлрд╝реНрд░реЗрдо рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред

рдЕрдм рдПрдХ рдЕрдиреНрдп рдореБрдЦреМрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдЖрдИрдЯреА рдХреЗ рд╕рд╛рде рд╕реМрджрд╛" рдкрд╛рда рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

  #    ,    #  "DEAL WITH IT"   if i == len(steps) - 1: #   "DEAL WITH IT"  , #   dwi = cv2.imread(config["deal_with_it"]) dwiMask = cv2.imread(config["deal_with_it_mask"]) dwiMask = cv2.cvtColor(dwiMask, cv2.COLOR_BGR2GRAY) dwiMask = cv2.threshold(dwiMask, 0, 255, cv2.THRESH_BINARY)[1] #       80%   #  oW = int(W * 0.8) dwi = imutils.resize(dwi, width=oW) dwiMask = imutils.resize(dwiMask, width=oW, inter=cv2.INTER_NEAREST) #  ,   ,  #   oX = int(W * 0.1) oY = int(H * 0.8) output = overlay_image(output, dwi, dwiMask, (oX, oY)) 

рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ рд╣рдо рдкрд╛рда рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдФрд░ рдЫрд╡рд┐ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ OpenCV рдлреЛрдВрдЯ рдХреА рдкреНрд░рддрд┐рдкрд╛рджрди рдХреНрд╖рдорддрд╛рдПрдВ рдХрд╛рдлреА рд╕реАрдорд┐рдд рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдкрд╛рда рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЫрд╛рдпрд╛ рдФрд░ рдПрдХ рд╕реАрдорд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬреЛ рдлрд┐рд░ рд╕реЗ OpenCV рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреИрд╕реЗред

рдЗрд╕ рдХреЛрдб рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ, рд╣рдо рдЫрд╡рд┐ рдФрд░ рдореБрдЦреМрдЯрд╛ рджреЛрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдлрд╛ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдЬреАрдЖрдИрдПрдл-рдПрдиреАрдореЗрд╢рди рдХреЗ рдмрд╛рдж рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЛ рдбрд┐рд╕реНрдХ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реА рд░рд╣рддрд╛ рд╣реИ:

  #      p = os.path.sep.join([config["temp_dir"], "{}.jpg".format( str(i).zfill(8))]) cv2.imwrite(p, output) #      ,     #   GIF- print("[INFO] creating GIF...") create_gif(config["temp_dir"], args["output"], config["delay"], config["final_delay"], config["loop"]) #  --    print("[INFO] cleaning up...") shutil.rmtree(config["temp_dir"], ignore_errors=True) 

рд╣рдо рдбрд┐рд╕реНрдХ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╕рднреА рдлрд╝реНрд░реЗрдореЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо GIF рдПрдиреАрдореЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП create_gif рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╢реЗрд▓ рд╣реИ рдЬреЛ рдЗрдореЗрдЬрдореИрдЬрд┐рдХ convert рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЯреВрд▓ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдЕрд╕реНрдерд╛рдпреА рдЖрдЙрдЯрдкреБрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред

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


рдЕрдм рдордЬрд╝реЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛: рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдореЗрдо рдЬрдирд░реЗрдЯрд░ рдиреЗ рдХреНрдпрд╛ рдмрдирд╛рдпрд╛ рд╣реИ!

рд╕реНрд░реЛрдд рдХреЛрдб, рдирдореВрдирд╛ рдЪрд┐рддреНрд░ рдФрд░ рдЧрд╣рди рд╢рд┐рдХреНрд╖рдг рдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдлрд┐рд░ рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:

 $ python create_gif.py --config config.json --image images/adrian.jpg \ --output adrian_out.gif [INFO] loading models... [INFO] computing object detections... [INFO] creating GIF... [INFO] cleaning up... 


рдЪрд┐рддреНрд░ 9. рдЗрд╕ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде OpenCV рдФрд░ ImageMagick рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди GIF рдПрдиреАрдореЗрд╢рди

рдпрд╣рд╛рдВ рдЖрдк OpenCV рдФрд░ ImageMagick рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдЬреАрдЖрдИрдПрдл рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкрд░ рдирд┐рдореНрди рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ:

  1. рдореЗрд░реЗ рдЪреЗрд╣рд░реЗ рдХреА рд╕рд╣реА рдкрд╣рдЪрд╛рдиред
  2. рдЖрдВрдЦреЛрдВ рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдФрд░ рдЙрдирдХреЗ рдХреЗрдВрджреНрд░реЛрдВ рдХреА рдЧрдгрдирд╛ред
  3. рдЪреЗрд╣рд░реЗ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд╢реНрдорд╛ рдкрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред

рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬреБрд░рд╛рд╕рд┐рдХ рдкрд╛рд░реНрдХ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдмреЗрд╡рдХреВрдл рд╣реВрдВ рдФрд░ рдЕрдХреНрд╕рд░ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдореЗрд░реА рдкреБрд╕реНрддрдХреЛрдВ, рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдФрд░ рдЕрдзреНрдпрдпрди рдЧрд╛рдЗрдбреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬреБрд░рд╛рд╕рд┐рдХ рдкрд╛рд░реНрдХ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ?

рдареАрдХ рд╣реИ, рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдЬрд╡рд╛рдм рд╣реИ:

 $ python create_gif.py --config config.json --image images/adrian_jp.jpg \ --output adrian_jp_out.gif [INFO] loading models... [INFO] computing object detections... [INFO] creating GIF... [INFO] cleaning up... 


рдЕрдВрдЬреАрд░ред 10. OpenCV GIF рдПрдиреАрдореЗрд╢рди, рдЬреБрд░рд╛рд╕рд┐рдХ рд╡рд░реНрд▓реНрдб 2 рдХреА рд╣рд╛рд▓рд┐рдпрд╛ рд╕реНрдХреНрд░реАрдирд┐рдВрдЧ рдХреА рддрд╕реНрд╡реАрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ

рдпрд╣рд╛рдВ рдореИрдВ рдПрдХ рд╡рд┐рд╖рдпрдЧрдд рдЯреА-рд╢рд░реНрдЯ рдореЗрдВ "рдЬреБрд░рд╛рд╕рд┐рдХ рд╡рд░реНрд▓реНрдб: 2" рд╢реЛ рдореЗрдВ рдПрдХ рдЧрд┐рд▓рд╛рд╕ рдкреНрд░рдХрд╛рд╢ рдФрд░ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдкреБрд╕реНрддрдХ рдХреЗ рд╕рд╛рде рд╣реВрдВред

рдордЬреЗрджрд╛рд░ рдХрд╣рд╛рдиреА:

рдкрд╛рдВрдЪ рдпрд╛ рдЫрд╣ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореЗрд░реА рдкрддреНрдиреА рдФрд░ рдореИрдВрдиреЗ рдбрд┐рдЬреНрдиреА рд╡рд░реНрд▓реНрдб, рдлреНрд▓реЛрд░рд┐рдбрд╛ рдореЗрдВ рдПрдкрдХреЛрдЯ рд╕реЗрдВрдЯрд░ рдереАрдо рдкрд╛рд░реНрдХ рдХрд╛ рджреМрд░рд╛ рдХрд┐рдпрд╛ред

рд╣рдо рдХрдиреЗрдХреНрдЯрд┐рдХрдЯ рдореЗрдВ рдХрдареЛрд░ рд╕рд░реНрджрд┐рдпреЛрдВ рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛рддреНрд░рд╛ рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рд╕рдЦреНрдд рдзреВрдк рдХреА рдЬрд░реВрд░рдд рдереАред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдлреНрд▓реЛрд░рд┐рдбрд╛ рдореЗрдВ рд╣рд░ рд╕рдордп рдмрд╛рд░рд┐рд╢ рд╣реБрдИ, рдФрд░ рддрд╛рдкрдорд╛рди рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ 10 рдбрд┐рдЧреНрд░реА рд╕реЗрд▓реНрд╕рд┐рдпрд╕ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛ред

рдХреИрдиреЗрдбрд┐рдпрди рдЧрд╛рд░реНрдбрди рдХреЗ рдкрд╛рд╕, рддреГрд╖рд╛ рдиреЗ рдореЗрд░реА рдПрдХ рддрд╕реНрд╡реАрд░ рд▓реА: рд╡рд╣ рдХрд╣рддреА рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдЪрдордбрд╝реА рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реВрдБ рдЬрд┐рд╕рдореЗрдВ рдкреАрдЫреЗ рдХреА рдУрд░ рд╣рд░реЗ-рднрд░реЗ рдмрдЧреАрдЪреЗ, рдХрд╛рд▓реЗ рдХрдкрдбрд╝реЗ рдФрд░ рдПрдХ рд╣реБрдб, рд╣рд░реЗ-рднрд░реЗ рдмрдЧреАрдЪреЛрдВ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИ:

 $ python create_gif.py --config config.json --image images/vampire.jpg \ --output vampire_out.gif [INFO] loading models... [INFO] computing object detections... [INFO] creating GIF... [INFO] cleaning up... 


рдЕрдВрдЬреАрд░ред 11. OpenCV рдФрд░ рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЗрд╕ рдореЗрдо рдпрд╛ рдПрдХ рдФрд░ рдПрдирд┐рдореЗрдЯреЗрдб GIF рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

рдЙрд╕реА рд╢рд╛рдо, рддреНрд░рд┐рд╢рд╛ рдиреЗ рд╕реЛрд╢рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ рддрд╕реНрд╡реАрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреА - рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдерд╛ред

рдЖрдк рдореЗрдВ рд╕реЗ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ PyImageConf 2018 рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ ( рд╕рдореАрдХреНрд╖рд╛ рдкрдврд╝реЗрдВ ) рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рд╣рдореЗрд╢рд╛ рдЪреБрдЯрдХреБрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реВрдВред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

рдкреНрд░рд╢реНрди: рдореБрд░реНрдЧрд╛ рд╕рдбрд╝рдХ рдкрд╛рд░ рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ?

 $ python create_gif.py --config config.json --image images/rooster.jpg \ --output rooster_out.gif [INFO] loading models... [INFO] computing object detections... [INFO] creating GIF... [INFO] cleaning up... 


рдЕрдВрдЬреАрд░ред 12. рдЪреЗрд╣рд░рд╛ рдХрдо рд╡рд┐рдкрд░реАрдд рдХреЗ рд╕рд╛рде рднреА рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ OpenCV рдлреЛрдЯреЛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдзреВрдк рдХрд╛ рдЪрд╢реНрдорд╛ рдХрдо рдХрд░рддрд╛ рд╣реИ

рдЙрддреНрддрд░: рдореИрдВ рдЗрд╕ рдЬрд╡рд╛рдм рдХреЛ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ - рдЗрд╕рдХреЗ рд╕рд╛рде рд░рдЦреЛред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдПрдХ рдЕрдЪреНрдЫреЗ рдореЗрдо рдХреЗ рд╕рд╛рде рдЖрдЬ рдХреЗ рдЧрд╛рдЗрдб рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред

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

рдпрд╣рд╛рдБ рдЖрдк рдореЗрд░реЗ рдХрдВрдзреЗ рдкрд░ рдЧреЗрдорд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 $ python create_gif.py --config config.json --image images/pupper.jpg \ --output pupper_out.gif [INFO] loading models... [INFO] computing object detections... [INFO] creating GIF... [INFO] cleaning up... 


рдЕрдВрдЬреАрд░ред 13. рдЧреЗрдорд╛ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛? рдлрд┐рд░ "рдЗрд╕рдХреЗ рд╕рд╛рде рд╢рд░реНрддреЛрдВ рдкрд░ рдЖрдПрдВ!"

рд╕рд╣рдордд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдкреНрдпрд╛рд░рд╛ рд╣реИ? рдЗрд╕рд╕реЗ рдирд┐рдкрдЯреЛред

рдПрдХ рдЧреБрдг рддреНрд░реБрдЯрд┐ рд╣реИ?


рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ!

рдпрджрд┐ рдЖрдкрдиреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗрдЦреА рд╣реИ:

 $ python create_gif.py --config config.json --image images/adrian.jpg \ --output adrian_out.gif ... Traceback (most recent call last): File "create_gif.py", line 142, in <module> (lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"] AttributeError: module 'imutils.face_utils' has no attribute 'FACIAL_LANDMARKS_IDXS' 

... рддреЛ рдЖрдкрдХреЛ рдмрд╕ imutils рдкреИрдХреЗрдЬ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 $ pip install --upgrade imutils Collecting imutils ... Successfully installed imutils-0.5.1 

рдХреНрдпреЛрдВ?

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ imutils.face_utilsdlib (рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдорд┐рдд 68-рдмрд┐рдВрджреБ рд▓реИрдВрдбрдорд╛рд░реНрдХ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдирд╣реАрдВ рд╣реИ рдПрдХ рддреНрд╡рд░рд┐рдд 5 рдЕрдВрдХреЛрдВ рдбрд┐рдЯреЗрдХреНрдЯрд░ , рдЬреЛ рдЕрдм рднреА imutils рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рджреЛрдиреЛрдВ рдбрд┐рдЯреЗрдХреНрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП imutils рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ (рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗ)ред

рд╕рд╛рд░рд╛рдВрд╢


рдЖрдЬ рдХреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рдЖрдкрдиреЗ OpenCV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ GIF рдмрдирд╛рдирд╛ рд╕реАрдЦрд╛ред

рдкрд╛рда рдХреЛ рдордЬреЗрджрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдореЗрдо (рдФрд░ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛) GIF рдПрдиреАрдореЗрд╢рди "рдбреАрд▓ рд╡рд┐рде рдЗрдЯ" рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП OpenCV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рд▓рдЧрднрдЧ рд╣рд░ рд╕реЛрд╢рд▓ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд░реВрдк рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдордиреЗ рдХрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди рдФрд░ рдЧрд╣рд░реА рд╢рд┐рдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:

  • рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди
  • рдЪреЗрд╣рд░реЗ рдкрд░ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди
  • рдЪреЗрд╣рд░реЗ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдкрд╣рдЪрд╛рди (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдВрдЦ)
  • рдЪреЗрд╣рд░реЗ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдВрдЦреЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдг рдХреА рдЧрдгрдирд╛
  • рдЕрд▓реНрдлрд╛ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХреЗ рд╕рд╛рде рдкрд╛рд░рджрд░реНрд╢реА рдорд┐рд╢реНрд░рдг рдмрдирд╛рдПрдВ

рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓рд┐рдпрд╛ рдФрд░ OpenCV рдФрд░ ImageMagick рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдирд┐рдореЗрдЯреЗрдб GIF рдмрдирд╛рдпрд╛ред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЖрдЬ рдХрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рд╣реЛрдЧрд╛!

рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝реЗрдВ рдФрд░ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рдЦреЛред ;)

Source: https://habr.com/ru/post/hi429024/


All Articles