рд░реЛрдмреЛрдЯ рд▓реЛрдбрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ: рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛

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

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

рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛: рдЧреЛрджрд╛рдо рдХреА рдЫрдд рдкрд░ рдореЗрд░рд╛ рд░реЛрдмреЛрдЯ рдХреНрдпрд╛ рджреЗрдЦрддрд╛ рд╣реИ?


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

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

рдЕрдореЗрд░рд┐рдХрди рдлрд╝реЛрд░рдо: рдореИрдВрдиреЗ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫрд╛ - рдЖрдкрдХреЛ рдПрдХ рдЙрддреНрддрд░ рдорд┐рд▓рддрд╛ рд╣реИред
рдЗрдЬрд░рд╛рдпрд▓ рдлреЛрд░рдо: рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛ - рдПрдХ рд╕рд╡рд╛рд▓ рдорд┐рд▓рддрд╛ рд╣реИред
рд░реВрд╕реА рдордВрдЪ: рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛ - рд╡реЗ рдЖрдкрдХреЛ рд╕рдордЭрд╛рдПрдВрдЧреЗ рдХрд┐ рдЖрдк рдПрдХ рдЧрдзреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░реЛрдмреЛрдЯ рдХреЛ Microsoft рд░реЛрдмреЛрдЯрд┐рдХреНрд╕ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рддрд╣рдд рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ OpenCV рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдкреНрдд .NET рдЕрд╕реЗрдВрдмрд▓реА рдирд╣реАрдВ рдорд┐рд▓реА - рдореИрдВрдиреЗ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдЕрдкрдиреА рдкрд╣рдЪрд╛рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд░реЙрдХреЗрдЯ рд╕рд╛рдЗрдВрд╕ рдирд╣реАрдВ, рдЪрд╛рдп - рдмрд╕ рдЪрдордХрджрд╛рд░ рд╕рдлреЗрдж рдЖрдпрддреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВред

рдЧреЛрджрд╛рдо рдХреА рдЫрдд рдХреЛ рд░реЛрдмреЛрдЯ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЪрдордХрджрд╛рд░ рд╕рдлреЗрдж рдЦрд┐рдбрд╝рдХреА рдХреЛ рдЕрдВрдзреЗрд░реЗ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо RGB рд╕реЗ YCbCr рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ Y = 227 рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдХреЛ рдЖрдиреБрднрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЗрд╕реЗ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдЫрд╡рд┐ рдХреА рдЪрдордХ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреВрд▓ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рдПрдЧрд╛)ред рд░рд╛рд╕реНрддреЗ рдХреЗ рд╕рд╛рде, рд╣рдо 640x480 рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЫрд╡рд┐ рдХреЛ 320x440 рддрдХ рдХрдо рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЪрд╛рд░ рдЧреБрдирд╛ рддреЗрдЬреА рд▓рд╛рдПрдЧрд╛ред

рдХреЛрдб:
byte[] bytes = response.Frame; int stride = bytes.Length / height; byte[,] belong = (byte[,])Array.CreateInstance(typeof(byte), new int[] { 326, 246 }, new int[] { -3, -3 }); int Ythreshold = settings.Ythreshold; for (int y = 0; y < 240; y++) { int offset = stride * y * 2; for (int x = 0; x < 320; x++) { int blu = bytes[offset] + bytes[offset + 3] + bytes[offset + stride] + bytes[offset + stride + 3]; offset++; int grn = bytes[offset] + bytes[offset + 3] + bytes[offset + stride] + bytes[offset + stride + 3]; offset++; int red = bytes[offset] + bytes[offset + 3] + bytes[offset + stride] + bytes[offset + stride + 3]; offset += 4; belong[x, y] = (0.299 / 4 * red + 0.587 / 4 * grn + 0.114 / 4 * blu > Ythreshold ? (byte)1 : (byte)0); } } 


рдЕрд▓рдЧрд╛рд╡ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИ:


рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ, рдПрдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрдпрдирд┐рдд рд╡рд┐рдВрдбреЛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЪрдХрд╛рдЪреМрдВрдз рд╕рддрд╣реЛрдВ рдкрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рд╢реЛрд░ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдЕрдВрджрд░ "рдкрд┐рдХреНрд╕реЗрд▓ рдмрд╛рд╣рд░ рдЦрдЯрдЦрдЯрд╛рдП рдЧрдП" рдЬреЛ рдкрд░реНрдпрд╛рдкреНрдд рдЙрдЬреНрдЬреНрд╡рд▓ рдирд╣реАрдВ рдереЗред

рд╣рдо рдПрдХ рдореАрдбрд┐рдпрди рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рд╢реЛрд░ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреНрдпреВрдП рдореЗрдВ рдореБрдЭреЗ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЧреЙрд╕рд┐рдпрди рдмреНрд▓рд░ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рдереАред рдЦреИрд░, рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдзрдмреНрдмрд╛ рд╣реИ?) 3 рдкрд┐рдХреНрд╕рд▓ рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде рдФрд░ 21 рдореЗрдВ рд╕реЗ 5 рдЙрдЬреНрдЬреНрд╡рд▓ рдкрд┐рдХреНрд╕рд▓ рдХреА рдПрдХ рд╕реАрдорд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдЙрдЬреНрдЬреНрд╡рд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП "рдЭреБрдХрд╛рд╡" рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рдЕрдВрдзреЗрд░реЗ рдкрд┐рдХреНрд╕реЗрд▓ рд╣реЛрддреЗ рд╣реИрдВ - рддрд╛рдХрд┐ рддреАрди рдЧреНрд▓рд╛рд╕ рдХреА рд╣рдорд╛рд░реА рдЦрд┐рдбрд╝рдХреА рдХреЛ рдПрдХ рдЖрдпрдд рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред

 private bool[,] filtered = (bool[,])Array.CreateInstance(typeof(bool), new int[] { 326, 246 }, new int[] { -3, -3 }); int medianThreshold = settings.MedianThreshold; for (int x = 0; x < 320; x++) for (int y = 0; y < 240; y++) filtered[x, y] = belong[x - 1, y - 2] + belong[x, y - 2] + belong[x + 1, y - 2] + belong[x - 2, y - 1] + belong[x - 1, y - 1] + belong[x, y - 1] + belong[x + 1, y - 1] + belong[x + 2, y - 1] + belong[x - 2, y * 1] + belong[x - 1, y * 1] + belong[x, y * 1] + belong[x + 1, y * 1] + belong[x + 2, y * 1] + belong[x - 2, y + 1] + belong[x - 1, y + 1] + belong[x, y + 1] + belong[x + 1, y + 1] + belong[x + 2, y + 1] + belong[x - 1, y + 2] + belong[x, y + 2] + belong[x + 1, y + 2] > medianThreshold; 

belong рдФрд░ filtered рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдо - [-3..322, -3..242] - рд╕реВрдЪрдХрд╛рдВрдХ рдЬрд╛рдВрдЪ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдХрд┐рдП рдмрд┐рдирд╛ рдЗрди рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкрдХреНрд╖ рдкрд░ рддреАрди рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ "рдлрд╝реАрд▓реНрдб" рдХреЗ рд╕рд╛рде рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред

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


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдлрд╝реНрд░реЗрдо рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рдлреЗрдж рд╕реНрдерд╛рди рд╕рднреА рддрд░рд╣ рд╕реЗ рдПрдХ рдЦрд┐рдбрд╝рдХреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдврд╝ рд╕реНрдерд╛рди (рдлреНрд▓рдбрдлрд╝рд┐рд▓) рдХреЛ рднрд░реЗрдВ рдФрд░ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдХреНрд╖реЗрддреНрд░ рд▓реЗрдВред

 int biggest_area = 0; byte area_id = 1, biggest_id = 0; // areas start from 2 Rectangle bounds = new Rectangle(); PointF cg = new PointF(); // center Point[] stack = new Point[320*200]; for (int x = 0; x < 320; x++) for (int y = 0; y < 240; y++) if (filtered[x, y] && belong[x, y] <= 1) { int area = 0, left = 320, top = 240, right = 0, bottom = 0; int sx = 0, sy = 0; ++area_id; // FloodFill int sp = 0; stack[0] = new Point(x, y); while (sp >= 0) { Point next = stack[sp--]; area++; sx += next.X; sy += next.Y; belong[next.X, next.Y] = area_id; if (next.X < left) left = next.X; if (next.X > right) right = next.X; if (next.Y < top) top = next.Y; if (next.Y > bottom) bottom = next.Y; if (filtered[next.X - 1, next.Y] && belong[next.X - 1, next.Y] <= 1) stack[++sp] = new Point(next.X - 1, next.Y); if (filtered[next.X, next.Y - 1] && belong[next.X, next.Y - 1] <= 1) stack[++sp] = new Point(next.X, next.Y - 1); if (filtered[next.X, next.Y + 1] && belong[next.X, next.Y + 1] <= 1) stack[++sp] = new Point(next.X, next.Y + 1); if (filtered[next.X + 1, next.Y] && belong[next.X + 1, next.Y] <= 1) stack[++sp] = new Point(next.X + 1, next.Y); } if (area > biggest_area) { biggest_area = area; biggest_id = area_id; bounds = new Rectangle(left, top, right - left, bottom - top); cg = new PointF((float)sx / area, (float)sy / area); } } 

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


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

 PointF c = new PointF(bounds.Left + (float)bounds.Width / 2, bounds.Top + (float)bounds.Height / 2); int[] hist = new int[400]; for (int i = 0; i < 400; i++) hist[i] = 0; int maxdist = 0; for (int x = bounds.Left; x <= bounds.Right; x++) for (int y = bounds.Top; y <= bounds.Bottom; y++) if (belong[x, y] == biggest_id) { int dist = (int)Math.Sqrt(Sqr(x - cX) + Sqr(y - cY)); hist[dist]++; if (dist > maxdist) maxdist = dist; } 




рдЧреНрд░реЗ рдЧреНрд░рд╛рдл рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рд╣реИ, рдЗрд╕ рдкрд░ рдЕрдВрдзреЗрд░реЗ рдкрдЯреНрдЯреА рдЕрдзрд┐рдХрддрдо рд╣реИ, рдЕрд░реНрдерд╛рддред рдЖрдпрдд рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рдЗрддрдиреА рджреВрд░реА рдкрд░ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд┐рдВрджреБ рд╕реНрдерд┐рдд рд╣реИрдВред (рдЗрд╕ рджреВрд░реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрдпрдд рдкрд░ рдПрдХ рдбрд╛рд░реНрдХ рд╕рд░реНрдХрд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред) рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣ рджреВрд░реА рдЖрдпрдд рдХреА рдЖрдзреА рдЪреМрдбрд╝рд╛рдИ рд╣реИ: рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╕рд░реНрдХрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдпрдд рдХреЗ рдЕрдВрджрд░ рд░рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИ (рдЧреБрдгрд╛рдВрдХ with рдХреЗ рд╕рд╛рде); рддрдм рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдзреАрд░реЗ-рдзреАрд░реЗ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдпрд╣ рдЖрдпрдд рдХреА рдЖрдзреА рд▓рдВрдмрд╛рдИ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛; рдЕрдм рд╕реЗ, рд╕рд░реНрдХрд▓ рдХреЗ рдХреЗрд╡рд▓ рдЪрд╛рд░ "рдХреЛрдиреЛрдВ" рдХреЛ рдЖрдпрдд рдХреЗ рдЕрдВрджрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рддреЗрдЬреА рд╕реЗ рдЧрд┐рд░рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдкрд░ рдЗрд╕ "рдХреНрд▓рд┐рдл" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдВрдмрд╛рдИ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ - рдЖрдпрдд рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░реИрдЧрд┐рдВрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рд╢реЛрд░ рдХрд╛ рдЕрдВрдд рдХрд░рдирд╛ рд╣реИред рд╣рдо рдПрдХ рдФрд░ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЖрдпрдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 5 рдкрд┐рдХреНрд╕реЗрд▓ рдЪреМрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЖрдпрдд рдХреЗ рдЕрдиреБрдкреНрд░рд╕реНрде рдЕрдХреНрд╖ рдкрд░ рдЗрд╕рдХреЗ рджреЛ рдХрд╛рд▓реЗ "рдкрдХреНрд╖" рд╣реЛрдВрдЧреЗ:



рд╣рдо рдЗрди "рд╕рд╛рдЗрдбрд╡реЙрд▓" рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдХреЗрдВрджреНрд░реЛрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ: рдпрд╣рд╛рдБ рдХрдард┐рдирд╛рдИ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ "рдЪрддреБрд░реНрдерд╛рдВрд╢" рдореЗрдВ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдирддреЗ рд╣реИрдВ, рдлрд┐рд░ рдХреЗрдВрджреНрд░реЛрдВ рдХреА рдирд┐рдХрдЯрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рдпреБрдЧреНрдордХреЛрдВ" рдХреЛ рджреЛ рдпреБрдЧреНрдореЛрдВ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
 int r1 = 0; // incircle radius for (int x = maxdist; x >= 3; x--) { if (hist[x] > hist[r1]) r1 = x; } int rSample = r1 + 5; int[] voters = new int[4]; Point[] sums = new Point[4]; Point sampleOrg = new Point(Math.Max((int)(cX - rSample), 0), Math.Max((int)(cY - rSample), 0)); Rectangle sample = new Rectangle(sampleOrg, new Size( Math.Min((int)(cX + rSample), 319) - sampleOrg.X, Math.Min((int)(cY + rSample), 239) - sampleOrg.Y)); for (int x = sample.Left; x <= sample.Right; x++) for (int y = sample.Top; y <= sample.Bottom; y++) if (belong[x, y] != biggest_id) { int dist = (int)Math.Sqrt(Sqr(x - cX) + Sqr(y - cY)); if (dist > r1 && dist <= rSample) { int idx = y < cY ? (x < cX ? 1 : 0) : (x < cX ? 2 : 3); voters[idx]++; sums[idx].X += x; sums[idx].Y += y; } } PointF adjusted = new PointF(); int vAbove = voters[0] + voters[1], vBelow = voters[2] + voters[3], vLeft = voters[2] + voters[1], vRight = voters[0] + voters[3], allVoters = vAbove + vBelow; if (allVoters == 0) { // abort: no black pixels found } else { if (vAbove > 0 && vBelow > 0) { // split vertically PointF above = new PointF((float)(sums[0].X + sums[1].X) / vAbove - cX, (float)(sums[0].Y + sums[1].Y) / vAbove - cY), below = new PointF((float)(sums[2].X + sums[3].X) / vBelow - cX, (float)(sums[2].Y + sums[3].Y) / vBelow - cY); double dAbove = Math.Sqrt(above.X * above.X + above.Y * above.Y), dBelow = Math.Sqrt(below.X * below.X + below.Y * below.Y); if (dAbove >= r1 && dAbove <= rSample && dBelow >= r1 && dBelow <= rSample) // the split is valid adjusted = new PointF((above.X * vAbove - below.X * vBelow) / allVoters, (above.Y * vAbove - below.Y * vBelow) / allVoters); } if (adjusted.X == 0 && adjusted.Y == 0 && vLeft > 0 && vRight > 0) { // split horizontally PointF toleft = new PointF((float)(sums[2].X + sums[1].X) / vLeft - cX, (float)(sums[2].Y + sums[1].Y) / vLeft - cY), toright = new PointF((float)(sums[0].X + sums[3].X) / vRight - cX, (float)(sums[0].Y + sums[3].Y) / vRight - cY); double dLeft = Math.Sqrt(toleft.X * toleft.X + toleft.Y * toleft.Y), dRight = Math.Sqrt(toright.X * toright.X + toright.Y * toright.Y); if (dLeft >= r1 && dLeft <= rSample && dRight >= r1 && dRight <= rSample) // the split is valid adjusted = new PointF((toleft.X * vLeft - toright.X * vRight) / allVoters, (toleft.Y * vLeft - toright.Y * vRight) / allVoters); } } 

adjusted рдмрд┐рдВрджреБ рдЕрдм рдЗрд╕рдХреЗ рдЕрдиреБрдкреНрд░рд╕реНрде рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдЖрдпрдд рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ:


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

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

рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг
рдореВрд▓ рдЫрд╡рд┐:


рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж:


рдЫрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж:


рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо:


рдмрдЧрд╝рд▓ рдореЗрдВ рд╕рд░реНрдХрд▓:


рдЕрдиреБрдкреНрд░рд╕реНрде рдЕрдХреНрд╖:


рдореИрдВрдиреЗ рдЬреЛ рдХреЛрдб WindowDetector рдерд╛, рд╡рд╣ WindowDetector MRDS рд╕реЗрд╡рд╛ рдореЗрдВ рдорд╛рдирдХ Technologies\Vision\ColorSegment рдХреА рдЫрд╡рд┐ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореЗрд░реА рд╕реЗрд╡рд╛ рдХреИрдордХреЙрд░реНрдбрд░ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ UpdateFoundWindow рдХреЛ рдлреНрд░реЗрдо рдореЗрдВ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХреЛрдг рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рднреЗрдЬрддреА рд╣реИред MRDS рд╕реЗрд╡рд╛ рдЬреЛ рд░реЛрдмреЛрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд WindowDetector рд╣реИ, рдЙрд╕реА рддрд░рд╣ рд╕реЗ WindowDetector рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИ, WindowDetector рдХрд┐ рдпрд╣ рдмрд╛рд░рдХреЛрдб рд╕реНрдХреИрдирд░ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рддрд░рд╣ рд╕реЗ рд╕рдВрджреЗрд╢ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИ - рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛, рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВред

рдПрдХ рдЦрд┐рдбрд╝рдХреА рдбрд┐рдЯреЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде, рдореЗрд░рд╛ рд░реЛрдмреЛрдЯ рдЬрд▓реНрджреА рд╕реЗ рдЧреЛрджрд╛рдо рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЪрд▓рд╛ рдЧрдпрд╛:


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

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

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


All Articles