optimal_angle.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #pragma once
  2. #include <opencv.hpp>
  3. #include <map>
  4. #include <opencv2\imgproc\imgproc.hpp>
  5. #include "data_def_api.h"
  6. #include "logger.h"
  7. #include "imstorage_manager.h"
  8. using namespace std;
  9. using namespace cv;
  10. namespace graft_cv{
  11. // class COptimalAngle
  12. // 1. find the max angle
  13. // 2. find the clamp position
  14. // 条件:图像0度到180度间,并第一帧为0度时刻,最后一帧为180时刻
  15. // 采用的方法:拼接数据(360度范围),通过找到两个最小点,此两点间的数据用
  16. // 二次曲线拟合,得到对称轴x坐标,即为最优角度
  17. class COptimalAngle
  18. {
  19. public:
  20. COptimalAngle(ConfigParam&, CGcvLogger* pLog=0);
  21. virtual ~COptimalAngle(void);
  22. int reset();
  23. int append(ImgInfo*,
  24. PositionInfo& posinfo
  25. );
  26. double infer(PositionInfo& posinfo);// calculate the optimal angle
  27. //fit optimal angle based m_an2width
  28. virtual double angle_fit(map<int, int>&,bool is_base=false);
  29. virtual double angle_fit_base(map<int, int>&);// for base matter
  30. void set_image_saver(CImStoreManager** ppis)
  31. {
  32. m_ppImgSaver=ppis;
  33. }
  34. protected:
  35. //global configure parameters
  36. ConfigParam& m_cparam;
  37. CGcvLogger* m_pLogger;
  38. string m_patch_id;
  39. CImStoreManager** m_ppImgSaver;
  40. int m_imgIndex;
  41. string m_imgId;
  42. // binary image
  43. Mat m_binImg;
  44. Mat m_binImgBase;
  45. //返回图片,用于调试
  46. ImgInfo* m_pImginfo;
  47. ImgInfo* m_pImginfoBase;
  48. // 角度-叶展宽度(像素)
  49. map<int, int> m_an2width;
  50. map<int, int> m_an2widthBase;
  51. // 图像处理函数
  52. // 返回min_idx左侧x,max_idx右侧x
  53. int imgproc(
  54. Mat&,
  55. vector<int>& hist,
  56. int& min_idx,
  57. int& max_idx);
  58. int imgprocBase(
  59. Mat&,
  60. vector<int>& hist,
  61. int& min_idx,
  62. int& max_idx);
  63. // 清理释放m_pImginfo
  64. void clear_imginfo();
  65. //茎分叉点y值系列
  66. vector<int> m_fork_ys;
  67. //茎最低点y值系列
  68. vector<int> m_end_ys;
  69. //叶展宽度系列
  70. vector<int>m_widths;
  71. //all image size
  72. int m_width;
  73. int m_height;
  74. };
  75. //COptimalAnglePart, 继承自COptimalAngle
  76. //条件:图像0度到90度间,并保证>=90度范围
  77. //方法:0-90度范围必然存在最大值或最小值,通过最大最小值局部数据
  78. // 插值(二次曲线拟合)得到最大角度计算
  79. class COptimalAnglePart: public COptimalAngle{
  80. public:
  81. COptimalAnglePart(ConfigParam&, CGcvLogger*pLog=0);
  82. virtual ~COptimalAnglePart();
  83. //fit optimal angle based m_an2width
  84. double angle_fit(map<int, int>&,bool is_base=false);
  85. double angle_fit_base(map<int, int>&);// for base matter
  86. protected:
  87. //zero_cross_detect()
  88. //过零点检测,用于确定是否单调(增或减),局部最小,局部最大,
  89. //并返回局部极值index
  90. void zero_cross_detect(
  91. vector<int>&d_sign, //input
  92. bool& is_local_max, // whether exists local max
  93. int& local_limit_idx // local limit index of original vector
  94. );
  95. double limit_min_angle(
  96. vector<double>&x, //sorted, ascending
  97. vector<double>&y,
  98. size_t min_idx
  99. );
  100. // 计算y = k1*x + b1和y = k2*x + b2两条直线相交交点,x坐标
  101. double line_cross(
  102. double k1,
  103. double b1,
  104. double k2,
  105. double b2);
  106. //
  107. double opt_angle_part_impl(
  108. vector<double>&x, //sorted, ascending
  109. vector<double>&y,
  110. bool is_base=false);
  111. };
  112. };