рдореЛрд╢рди рдбрд┐рдЯреЗрдХреНрдЯрд░ рдмрдирд╛рдирд╛, рдпрд╛ OpenCV - рдпрд╣ рд╕рд┐рд░реНрдл рд╣реИ

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдореЗрдВ рдХреБрдЫ рдХрд░рдирд╛ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЧреИрд░-рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рднреАред рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдБ рдХрд┐ рдХреИрд╕реЗред

рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП: рд▓реЗрдЦ рдореЗрдВ рдПрдХ рднрдпрд╛рдирдХ рдмрд░реНрдбрд▓рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдбрд░рд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЗ рдЕрдВрдд рддрдХ рд╕реЛрдиреЗ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЕрднреА рддрдХ рдбрд░ рдирд╣реАрдВ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдЧреЗ рд╕реНрд╡рд╛рдЧрдд рдХрд░реЗрдВред

рдкрд░рд┐рдЪрдп

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред рдореИрдВ рдкреНрд░рдХрд╛рд╢ рдХреЗ рдореИрдиреБрдЕрд▓ рд╕рдорд╛рд╡реЗрд╢ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рд╣реИ, рдФрд░ рдРрд╕реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреЗ рд╣реИрдВред рд▓реЛрдЧреЛрдВ рдХреЛ рд░реЛрд╢рдиреА рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд╕реНрддреБрдПрдВ рдирд╣реАрдВ рдЪрд▓рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реЛрдЧ рдЪрд▓рддреЗ рд╣реИрдВ (рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдорд░ рдЧрдпрд╛ рдпрд╛ рд╕реЛ рдЧрдпрд╛ред рдореГрдд рдФрд░ рд╕реЛрддреЗ рд╣реБрдП рдкреНрд░рдХрд╛рд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рддрджрдиреБрд╕рд╛рд░, рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдореЗрдВ рдХреЗрд╡рд▓ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд░реЛрд╢рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд╣рд╛рдВ рдХреБрдЫ рдЖрдВрджреЛрд▓рди рдордирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдВрджреЛрд▓рди рдмрдВрдж рд╣реЛ рдЧрдпрд╛ - рдЖрдк рдЖрдзреЗ рдШрдВрдЯреЗ рдпрд╛ рдПрдХ рдШрдВрдЯреЗ рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдВрджреЛрд▓рди рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВ?

рд╕реЗрдВрд╕рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдЗрд╕рдХрд╛ рдкрддрд╛ рдРрд╕реЗ рдбрд┐рдЯреЗрдХреНрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

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

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

рдЕрднреА рднреА рд╡рд╣реА рдЪреАрдЬреЗрдВ, рд▓реЗрдХрд┐рди рд╣рд╛рд░реНрдиреЗрд╕ рдХреЗ рд╕рд╛рде, рдЧреИрд░-рд╕рдВрдкрд░реНрдХ рдерд░реНрдорд╛рдореАрдЯрд░ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИрдВ - рд╡реЗ рдЬреЛ рдорд╛рдереЗ рдкрд░ рдпрд╛ рдХрд╛рди рдореЗрдВ рдХреБрдЫ рд╕реЗрдХрдВрдб рдореЗрдВ рддрд╛рдкрдорд╛рди рдХреЛ рдорд╛рдкрддреЗ рд╣реИрдВред

рдФрд░ pyrometers рдореЗрдВ, рдПрдХ рд╣реА рдерд░реНрдорд╛рдореАрдЯрд░, рд▓реЗрдХрд┐рди рдПрдХ рд╡реНрдпрд╛рдкрдХ рд░реЗрдВрдЬ рдХреЗ рд╕рд╛рде:

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

рдЦреИрд░, рдореИрдВ OpenCV рдЪреБрдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ, рд╣рд╛рдБред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдбрд┐рдмреНрдмреЗ рдореЗрдВ рдПрдХ рдХреИрдорд░рд╛ рдорд┐рд▓рд╛, рдПрдХ рдмреЛрд░реНрдб (A20 рдкрд░ CubieBoard2 ) рд▓рд┐рдпрд╛ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ред

рд╕реНрдерд╛рдкрдирд╛

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, OpenCV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░ (рдореИрдВ * nix рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ), рдЗрд╕реЗ рдПрдХрд▓ рдХрдорд╛рдВрдб рдЬреИрд╕реЗ apt-get install opencv рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдПрдВрдЧреЗ, рд╣реИ рдирд╛? рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХрд▓-рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рдирд╣реАрдВ рд╣реИред
рдПрдХ рд╡реНрдпрд╛рдкрдХ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдЧрд╛рдЗрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛ред
рд╣рдо cmake рдФрд░ GTK рдбрд╛рд▓рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡реЗрдХ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ- cmake libgtk2.0-dev рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ)ред
рд╣рдо рдСрдлрд╕рд╛рдЗрдЯ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо Robocraft рдореИрдиреБрдЕрд▓ рд╕реЗ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ SourceForge рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг (2.4.6.1) рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ 2.4.6 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдХреИрдорд░реЗ рд╕реЗ v4l2 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрд╡рд┐ рд░рд┐рд╕реЗрдкреНрд╢рди рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП 4 рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдЕрдЧрд░ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд╣реАрдВ рд▓рд┐рдЦрд╛ред
рдЖрдЧреЗ - рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ:
tar -xjf OpenCV-*.tar.bz2 && cd OpenCV-* && cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ./ && make && make install 

рдЖрдк рдХрд┐рдЯ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 cd samples/c/ && chmod +x build_all.sh && ./build_all.sh 

рджрд░рдЕрд╕рд▓, рдореЗрд░рд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб motempl рдирд╛рдордХ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рдлреНрд░реЗрдо рдореЗрдВ рдЧрддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рдУрд▓реЗрд╣ рдбреЛрдкрд┐рд▓рдХрд╛

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

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдереЛрдбрд╝рд╛ рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдЪреАрдЬрд╝ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рд╡рд┐рдВрдбреЛ рдореЗрдВ рдХреИрдорд░реЗ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ:

 #include <cv.h> #include <highgui.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char* argv[]) { CvCapture* capture = cvCaptureFromCAM(0);//   CvCapture(   ,      ),   capture.       cvCaptureFromCAM, 0    ,        . IplImage* image = cvQueryFrame( capture ); //    ( image)        cvNamedWindow("image window", 1); //    image window for(;;) //    { image = cvQueryFrame( capture ); //         image cvShowImage("image window", image);//   (image window)   ,       cvWaitKey(10); // 10   .    ,      .   ,  -,    ,   . } } 

рдЖрдк рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ test.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 gcc -ggdb `pkg-config --cflags opencv` -o `basename test.c .c` test.c `pkg-config --libs opencv` 
рдлрд┐рд░ рд╕реЗ, рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдХрд┐ рдпрд╣ рдЯреАрдо рдХреНрдпрд╛ рдХрд░ рд░рд╣реА рд╣реИред рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред рдЖрдЦрд┐рд░ рдРрд╕рд╛ рдХреНрдпреЛрдВ?

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

 char c = cvWaitKey(10); //         . if (c == 113 || c == 81) //,   . 113  81 -    "q" -     . { cvReleaseCapture( &capture ); //      . cvDestroyWindow("capture"); //  ,    ! return 0; //  . } 


рдФрд░ рдПрдлрдкреАрдПрд╕ рдХрд╛рдЙрдВрдЯрд░:

 CvFont font; //  "" cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX_SMALL, 1.0, 1.0, 1,1,8); //   -  , ,  struct timeval tv0; //-   . int fps=0; int fps_sec=0; char fps_text[2]; int now_sec=0;//  ... gettimeofday(&tv0,0); //   now_sec=tv0.tv_sec; //    if (fps_sec == now_sec) //,      ,      { fps++; // ,     (    ,   .) } else { fps_sec=now_sec; //  ,    snprintf(fps_text,254,"%d",fps); //    FPS fps=0; //   } cvPutText(image, fps_text, cvPoint(5, 20), &font, CV_RGB(255,255,255));//   (image)     520,  ,  ,    , ,     . 


рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда
 #include "opencv2/video/tracking.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc_c.h" #include <time.h> #include <stdio.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <errno.h> int main(int argc, char** argv) { IplImage* image = 0; CvCapture* capture = 0; struct timeval tv0; int fps=0; int fps_sec=0; int now_sec=0; char fps_text[2]; CvFont font; cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX_SMALL, 1.0, 1.0, 1,1,8); capture = cvCaptureFromCAM(0); cvNamedWindow( "Motion", 1 ); for(;;) { IplImage* image = cvQueryFrame( capture ); gettimeofday(&tv0,0); now_sec=tv0.tv_sec; if (fps_sec == now_sec) { fps++; } else { fps_sec=now_sec; snprintf(fps_text,254,"%d",fps); fps=0; } cvPutText(image, fps_text, cvPoint(5, 20), &font, CV_RGB(255,255,255)); cvShowImage( "Motion", image ); if( cvWaitKey(10) >= 0 ) break; } cvReleaseCapture( &capture ); cvReleaseImage(&image); cvDestroyWindow( "Motion" ); return 0; } 


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

 int dig_key=0;//,    int region_coordinates[10][4]; // ,     . ... char c = cvWaitKey(20); //         . if (c <=57 && c>= 48) //,       { dig_key=c-48; //key "0123456789" // ,      . } cvSetMouseCallback( "Motion", myMouseCallback, (void*) image); //,      myMouseCallback  ,      Motion    image if (region_coordinates[dig_key][0] != 0 && region_coordinates[dig_key][1] != 0 && region_coordinates[dig_key][2] == 0 && region_coordinates[dig_key][3] == 0) // .        -     . cvRectangle(image, cvPoint(region_coordinates[dig_key][0],region_coordinates[dig_key][1]), cvPoint(region_coordinates[dig_key][0]+1,region_coordinates[dig_key][1]+1), CV_RGB(0,0,255), 2, CV_AA, 0 ); if (region_coordinates[dig_key][0] != 0 && region_coordinates[dig_key][1] != 0 && region_coordinates[dig_key][2] != 0 && region_coordinates[dig_key][3] != 0) //       -   . cvRectangle(image, cvPoint(region_coordinates[dig_key][0],region_coordinates[dig_key][1]), cvPoint(region_coordinates[dig_key][2],region_coordinates[dig_key][3]), CV_RGB(0,0,255), 2, CV_AA, 0 ); void myMouseCallback( int event, int x, int y, int flags, void* param) //       ,    { IplImage* img = (IplImage*) param; // . ,       switch( event ){ //      case CV_EVENT_MOUSEMOVE: break; //     .  , ,      : printf("%dx %d\n", x, y); case CV_EVENT_LBUTTONDOWN: //     if (region_coordinates[dig_key][0] != 0 && region_coordinates[dig_key][1] != 0 && region_coordinates[dig_key][2] == 0 && region_coordinates[dig_key][3] == 0) //   (    -      ),       -       { region_coordinates[dig_key][2]=x; //dig_key - ,    .      . region_coordinates[dig_key][3]=y; } if (region_coordinates[dig_key][0] == 0 && region_coordinates[dig_key][1] == 0)//   (     ),      . { region_coordinates[dig_key][0]=x; region_coordinates[dig_key][1]=y; } break; } } 


рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рдХреНрд╖реЗрддреНрд░ рдбрд┐рдЬрд┐рдЯрд▓ рдмрдЯрди рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд┐рдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда
 #include "opencv2/video/tracking.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc_c.h" #include <time.h> #include <stdio.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <errno.h> int dig_key=0; int region_coordinates[10][4]; void myMouseCallback( int event, int x, int y, int flags, void* param) { IplImage* img = (IplImage*) param; switch( event ){ case CV_EVENT_MOUSEMOVE: //printf("%dx %d\n", x, y); break; case CV_EVENT_LBUTTONDOWN: //printf("%dx %d\n", region_coordinates[dig_key][0], region_coordinates[dig_key][1]); if (region_coordinates[dig_key][0] != 0 && region_coordinates[dig_key][1] != 0 && region_coordinates[dig_key][2] == 0 && region_coordinates[dig_key][3] == 0) { region_coordinates[dig_key][2]=x; region_coordinates[dig_key][3]=y; } if (region_coordinates[dig_key][0] == 0 && region_coordinates[dig_key][1] == 0) { region_coordinates[dig_key][0]=x; region_coordinates[dig_key][1]=y; } break; case CV_EVENT_RBUTTONDOWN: break; case CV_EVENT_LBUTTONUP: break; } } int main(int argc, char** argv) { IplImage* image = 0; CvCapture* capture = 0; struct timeval tv0; int fps=0; int fps_sec=0; int now_sec=0; char fps_text[2]; CvFont font; cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX_SMALL, 1.0, 1.0, 1,1,8); capture = cvCaptureFromCAM(0); cvNamedWindow( "Motion", 1 ); for(;;) { IplImage* image = cvQueryFrame( capture ); gettimeofday(&tv0,0); now_sec=tv0.tv_sec; if (fps_sec == now_sec) { fps++; } else { fps_sec=now_sec; snprintf(fps_text,254,"%d",fps); fps=0; } cvSetMouseCallback( "Motion", myMouseCallback, (void*) image); if (region_coordinates[dig_key][0] != 0 && region_coordinates[dig_key][1] != 0 && region_coordinates[dig_key][2] == 0 && region_coordinates[dig_key][3] == 0) cvRectangle(image, cvPoint(region_coordinates[dig_key][0],region_coordinates[dig_key][1]), cvPoint(region_coordinates[dig_key][0]+1,region_coordinates[dig_key][1]+1), CV_RGB(0,0,255), 2, CV_AA, 0 ); if (region_coordinates[dig_key][0] != 0 && region_coordinates[dig_key][1] != 0 && region_coordinates[dig_key][2] != 0 && region_coordinates[dig_key][3] != 0) cvRectangle(image, cvPoint(region_coordinates[dig_key][0],region_coordinates[dig_key][1]), cvPoint(region_coordinates[dig_key][2],region_coordinates[dig_key][3]), CV_RGB(0,0,255), 2, CV_AA, 0 ); cvPutText(image, fps_text, cvPoint(5, 20), &font, CV_RGB(255,255,255)); cvShowImage( "Motion", image ); char c = cvWaitKey(20); if (c <=57 && c>= 48) { dig_key=c-48; //key "0123456789" } } cvReleaseCapture( &capture ); cvReleaseImage(&image); cvDestroyWindow( "Motion" ); return 0; } 


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

 FILE *settings_file; FILE* fd = fopen("regions.bin", "rb"); // . "rb" -    if (fd == NULL) { printf("Error opening file for reading\n"); //    FILE* fd = fopen("regions.bin", "wb"); //  if (fd == NULL) { printf("Error opening file for writing\n"); } else { fwrite(region_coordinates, 1, sizeof(region_coordinates), fd); //  -     fclose(fd); //  printf("File created, please restart program\n"); } return 0; } size_t result = fread(region_coordinates, 1, sizeof(region_coordinates), fd); //  if (result != sizeof(region_coordinates)) //        printf("Error size file\n"); //  fclose(fd); //  FILE* fd = fopen("regions.bin", "wb"); // . "wb" -    if (fd == NULL) //    printf("Error opening file for writing\n"); // fwrite(region_coordinates, 1, sizeof(region_coordinates), fd); //    fclose(fd); //  

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

рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рд╣реА рд░рд╣ рдЧрдпрд╛ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдВрджреЛрд▓рди рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реБрдЖ, рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИред рд╣рдо рдЕрдкрдиреА рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХреЛ motempl.s рдХреЗ рд╕реНрд░реЛрдд рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд╣рд╛рдБ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рд╡рд╣ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдЧрддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╡реГрддреНрдд рдЦреАрдВрдЪрддрд╛ рд╣реИ:
 cvCircle( dst, center, cvRound(magnitude*1.2), color, 3, CV_AA, 0 ); 


рдФрд░ рдХреЗрдВрджреНрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЗрд╕ рддрд░рд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:
 center = cvPoint( (comp_rect.x + comp_rect.width/2), (comp_rect.y + comp_rect.height/2) ); 


рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЕрдкрдирд╛ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
 int i_mass; //   for (i_mass = 0; i_mass <= 9; i_mass++) //     ,       . { if( comp_rect.x + comp_rect.width/2 <= region_coordinates[i_mass][2] && comp_rect.x + comp_rect.width/2 >= region_coordinates[i_mass][0] && comp_rect.y + comp_rect.height/2 <= region_coordinates[i_mass][3] && comp_rect.y + comp_rect.height/2 >= region_coordinates[i_mass][1] ) //,   ,      -. { cvRectangle(dst, cvPoint(region_coordinates[i_mass][0],region_coordinates[i_mass][1]), cvPoint(region_coordinates[i_mass][2],region_coordinates[i_mass][3]), CV_RGB(0,0,255), 2, CV_AA, 0 ); //    ,      , ,     . printf("Detect motion in region %d\n",i_mass); //       } } 


рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


рдпрд╣ рдереЛрдбрд╝рд╛ рд░рд╣рддрд╛ рд╣реИ: рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХрдВрд╕реЛрд▓ рдкрд░ рдирд╣реАрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди UART рдореЗрдВ, рдХрд┐рд╕реА рднреА MK рд░рд┐рд▓реЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдЬреЛ рдкреНрд░рдХрд╛рд╢ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЧрддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдХреНрд╖реЗрддреНрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЙрд╕реЗ рд╕реМрдВрдкреЗ рдЧрдП рджреАрдкрдХ рдХреЛ рд░реЛрд╢рдиреА рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред

рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ github рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХрд╛ рд╕рдордп рдорд┐рд▓ рдЬрд╛рдП рддреЛ рдореБрдЭреЗ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА:
github.com/vvzvlad/motion-sensor-opencv

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

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


All Articles