рдирд╕ рд╕реНрдХреИрдирд░ рдкрд░ рд╣рдереЗрд▓реА рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп

рдХрд┐рд╕реА рддрд░рд╣ рдореИрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдЧрд┐рд░ рдЧрдпрд╛ред рд╢реИрдХреНрд╖рдгрд┐рдХ рд░реБрдЪрд┐ рдкреНрд░рдмрд▓ рд╣реБрдИ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╖реНрдЯрддрдо рдФрд░ рд╕рд╣реА рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдерд╛ред


рд╕реНрд░реЛрдд рдбреЗрдЯрд╛


рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдирд╛ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдереЗрд▓реА рдХреА рдирд╕ рд╕реНрдХреИрдирд░ рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдЫрд╡рд┐ рджреНрд╡рд╛рд░рд╛ рд╣рдереЗрд▓реА рд╕реНрдХреИрдирд░ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИред


рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ - рдПрдХ рдЬреНрдЮрд╛рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдХрдИ рдЫрд╡рд┐рдпрд╛рдВред



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


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




рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


рдЫрд╡рд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде ImageAnalyser рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛


class ImageAnalyser { public: ImageAnalyser(); explicit ImageAnalyser(const QImage&); bool analyze(const QImage&); bool analyze(); std::vector<std::vector<int>> data(); virtual ~ImageAnalyser(); }; 

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



рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдФрд╕рдд рдЪрдордХ рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рдЖрда рдЧреНрд░рд╛рдлрд╝ рдорд┐рд▓рддреЗ рд╣реИрдВред



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


 std::vector<int> ImageAnalyser::prepare_ideal_array(const std::vector<int>& array) { unsigned long min = static_cast<unsigned long>(array.size() * 0); unsigned long max = static_cast<unsigned long>(array.size() * 0.45); int ideal_value = 100; std::vector<int> ideal; ideal.resize(array.size()); for(unsigned long i = min; i < max; ++i) { ideal[i] = ideal_value; } return ideal; } 

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


 double ImageAnalyser::gsl_stats_correlation(const std::vector<int>& data) { std::vector<int> ideal = prepare_ideal_array(data); const int stride1 = 1; const int stride2 = 1; double sum_xsq = 0.0; double sum_ysq = 0.0; double sum_cross = 0.0; double mean_x = data[0]; double mean_y = ideal[0]; for (unsigned int i = 1; i < data.size(); ++i) { double ratio = i / (i + 1.0); double delta_x = data[i * stride1] - mean_x; double delta_y = ideal[i * stride2] - mean_y; sum_xsq += delta_x * delta_x * ratio; sum_ysq += delta_y * delta_y * ratio; sum_cross += delta_x * delta_y * ratio; mean_x += delta_x / (i + 1.0); mean_y += delta_y / (i + 1.0); } double r = sum_cross / (sqrt(sum_xsq) * sqrt(sum_ysq)); return r; } 

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


 bool ImageAnalyser::is_good(const vector<double>& correlation, const vector<int>& maximums) { bool result = true; double min_corr = *std::min_element(correlation.begin(), correlation.end()); if (min_corr < 0.5) { result = false; } double min_val = *std::min_element(maximums.begin(), maximums.end()); if (min_val < 30) { result = false; } return result; } 

рдХреЛрдб рд╕реЗ рдпрд╣ рднреА рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЪрдордХ рд╕реНрддрд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрджрд┐ рдореВрд▓реНрдп 30 рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рднреА рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдереЗрд▓реА рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реИред


рдкреНрд░рдпреБрдХреНрдд рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдвреЗрд░


  • рд╕реА / рд╕реА ++
  • рдХреНрдпреВрдЯреА рдирд┐рд░реНрдорд╛рддрд╛
  • QtCharts
  • GNU рд╕рд╛рдЗрдВрдЯрд┐рдлрд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА

рд╕реНрд░реЛрдд рдХреЛрдб


https://github.com/techlinked/PalmDetector.git

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


All Articles