Quellcode durchsuchen

v0.8.15 优化茎节检测功能,增加xx_grab_fork_height,控制识别较长的茎节

chenhongjiang vor 1 Jahr
Ursprung
Commit
4c78fb510f
5 geänderte Dateien mit 45 neuen und 3 gelöschten Zeilen
  1. 2 1
      ReadMe.txt
  2. 7 1
      config.cpp
  3. 2 0
      data_def_api.h
  4. 33 0
      grab_point_rs.cpp
  5. 1 1
      graft_cv_api.cpp

+ 2 - 1
ReadMe.txt

@@ -123,4 +123,5 @@ v0.8.10 优化茎节识别,实现邻域对比过滤,最近距离过滤,增
 v0.8.11 优化增加扩展茎粗检测茎节功能,减小ex范围从单侧1.5到1.05
 v0.8.12 优化茎粗检测功能,采用xy面投影茎粗统计结果
 v0.8.13 优化茎粗检测功能,采用茎两侧边缘点构建直线,计算直线间距离,再用点云平均距离进行补偿
-v0.8.14 优化茎粗检测功能,增加xx_grab_offset_cut, 在ybt、yup中间点进行偏移,在这个位置计算茎粗;茎edge直线拟合,剔除茎节的影响
+v0.8.14 优化茎粗检测功能,增加xx_grab_offset_cut, 在ybt、yup中间点进行偏移,在这个位置计算茎粗;茎edge直线拟合,剔除茎节的影响
+v0.8.15 优化茎节检测功能,增加xx_grab_fork_height,控制识别较长的茎节

+ 7 - 1
config.cpp

@@ -42,6 +42,7 @@ namespace graft_cv{
 			<< "rs_grab_fork_yup" << m_cparam->rs_grab_fork_yup
 			<< "rs_grab_fork_ybt" << m_cparam->rs_grab_fork_ybt
 			<< "rs_grab_offset_cut" << m_cparam->rs_grab_offset_cut
+			<< "rs_grab_fork_height" << m_cparam->rs_grab_fork_height
 			<< "rs_grab_holes_number" << m_cparam->rs_grab_holes_number
 
 			<< "sc_grab_xmin" << m_cparam->sc_grab_xmin
@@ -62,7 +63,8 @@ namespace graft_cv{
 			<< "sc_grab_offset_normal" << m_cparam->sc_grab_offset_normal
 			<< "sc_grab_fork_yup" << m_cparam->sc_grab_fork_yup
 			<< "sc_grab_fork_ybt" << m_cparam->sc_grab_fork_ybt
-			<< "rs_grab_offset_cut" <<m_cparam->rs_grab_offset_cut
+			<< "sc_grab_offset_cut" <<m_cparam->sc_grab_offset_cut
+			<< "sc_grab_fork_height" << m_cparam->sc_grab_fork_height
 			<< "sc_grab_holes_number" << m_cparam->sc_grab_holes_number
 
 			<< "}"; 	
@@ -92,6 +94,7 @@ namespace graft_cv{
 		m_cparam->rs_grab_fork_yup = (double)node["rs_grab_fork_yup"];
 		m_cparam->rs_grab_fork_ybt = (double)node["rs_grab_fork_ybt"];
 		m_cparam->rs_grab_offset_cut = (double)node["rs_grab_offset_cut"];
+		m_cparam->rs_grab_fork_height = (double)node["rs_grab_fork_height"];
 		m_cparam->rs_grab_holes_number = (int)node["rs_grab_holes_number"];
 
 		m_cparam->sc_grab_xmin = (double)node["sc_grab_xmin"];
@@ -113,6 +116,7 @@ namespace graft_cv{
 		m_cparam->sc_grab_fork_yup = (double)node["sc_grab_fork_yup"];
 		m_cparam->sc_grab_fork_ybt = (double)node["sc_grab_fork_ybt"];
 		m_cparam->sc_grab_offset_cut = (double)node["sc_grab_offset_cut"];
+		m_cparam->sc_grab_fork_height = (double)node["sc_grab_fork_height"];
 		m_cparam->sc_grab_holes_number = (int)node["sc_grab_holes_number"];
   }
 	string get_cparam_info(ConfigParam*m_cparam)
@@ -144,6 +148,7 @@ namespace graft_cv{
 			<< "rs_grab_fork_yup:\t" << m_cparam->rs_grab_fork_yup << endl
 			<< "rs_grab_fork_ybt:\t" << m_cparam->rs_grab_fork_ybt << endl
 			<< "rs_grab_offset_cut:\t" << m_cparam->rs_grab_offset_cut<< endl
+			<< "rs_grab_fork_height:\t" << m_cparam->rs_grab_fork_height << endl
 			<< "rs_grab_holes_number:\t" << m_cparam->rs_grab_holes_number << endl
 
 			<< "sc_grab_xmin:\t" << m_cparam->sc_grab_xmin << endl
@@ -165,6 +170,7 @@ namespace graft_cv{
 			<< "sc_grab_fork_yup:\t" << m_cparam->sc_grab_fork_yup << endl
 			<< "sc_grab_fork_ybt:\t" << m_cparam->sc_grab_fork_ybt << endl
 			<< "sc_grab_offset_cut:\t" << m_cparam->sc_grab_offset_cut << endl
+			<< "sc_grab_fork_height:\t" << m_cparam->sc_grab_fork_height << endl
 			<< "sc_grab_holes_number:\t" << m_cparam->sc_grab_holes_number << endl
 
 			<< "}" << endl; 	

+ 2 - 0
data_def_api.h

@@ -38,6 +38,7 @@ typedef struct{
 	double rs_grab_fork_yup; //茎节高度上限
 	double rs_grab_fork_ybt; //茎节高度下限, 不在范围内,按下限
 	double rs_grab_offset_cut; // 在ybt、yup中间点进行偏移,在这个位置计算茎粗
+	double rs_grab_fork_height; //茎节高度(最小值),毫米,小于此值不被识别
 	int rs_grab_holes_number; //单排穴孔数量
 
 	// scion grab based points cloud
@@ -63,6 +64,7 @@ typedef struct{
 	double sc_grab_fork_yup; //茎节高度上限
 	double sc_grab_fork_ybt; //茎节高度下限, 不在范围内,按下限
 	double sc_grab_offset_cut; // 在ybt、yup中间点进行偏移,在这个位置计算茎粗
+	double sc_grab_fork_height; //茎节高度(最小值),毫米,小于此值不被识别
 	int sc_grab_holes_number; //单排穴孔数量
 } ConfigParam;
 

+ 33 - 0
grab_point_rs.cpp

@@ -2830,11 +2830,13 @@ void CRootStockGrabPoint::line_filter(
 		double ymax = m_cparam.rs_grab_ymax;
 		double stemd = m_cparam.rs_grab_stem_diameter;
 		double th_fork = m_cparam.rs_grab_fork_ratio;
+		double th_fork_h = m_cparam.rs_grab_fork_height;
 		if (m_dtype == 0) {
 			ymin = m_cparam.sc_grab_ymin;
 			ymax = m_cparam.sc_grab_ymax;
 			stemd = m_cparam.sc_grab_stem_diameter;
 			th_fork = m_cparam.sc_grab_fork_ratio;
+			th_fork_h = m_cparam.sc_grab_fork_height;
 		}
 		int length = int(ymax - ymin);
 		std::vector<float> stem_diameters;
@@ -2881,6 +2883,22 @@ void CRootStockGrabPoint::line_filter(
 			if (stem_diameters.at(midx) > th_fork * mean_r) {
 				//大于周围的值的均值的1.5倍,才能成为茎节
 				if (stem_diameters.at(midx) > th_fork * stem_noise.at(midx)) {
+					//检测midx附近高于阈值的范围,得到茎节高度
+					int minj = 1000;
+					int maxj = -1000;
+					for (int k = -del_radius; k <= del_radius; ++k) {
+						int j = k + midx;
+						if (j < 0 || j >= length) {
+							continue;
+						}
+						if (stem_diameters.at(j) <= th_fork * stem_noise.at(midx)) { continue; }
+						if (j <= minj) { minj = j; }
+						if (j >= maxj) { maxj = j; }
+					}
+					if (maxj - minj + 1 < th_fork_h) {
+						continue;
+					}
+
 					//检测fork_pos中的近邻是否存在
 					bool has_nn = false;
 					for (auto& fy : fork_pos) {
@@ -2914,6 +2932,21 @@ void CRootStockGrabPoint::line_filter(
 			//找到最大值的位置和最大值
 			int midx = max_element(stem_width_ex_cp.begin(), stem_width_ex_cp.end()) - stem_width_ex_cp.begin();
 			if (stem_width_ex_cp.at(midx) > th_fork * stem_width_ex_mu) {
+				int minj = 1000;
+				int maxj = -1000;
+				for (int k = -del_radius; k <= del_radius; ++k) {
+					int j = k + midx;
+					if (j < 0 || j >= stem_width_ex_cp.size()) {
+						continue;
+					}
+					if (stem_width_ex_cp.at(j) <= th_fork * stem_width_ex_mu) { continue; }
+					if (j <= minj) { minj = j; }
+					if (j >= maxj) { maxj = j; }
+				}
+				if (maxj - minj + 1 < th_fork_h) {
+					continue;
+				}
+
 				//检测fork_pos中的近邻是否存在
 				bool has_nn = false;
 				for (auto& fy : fork_pos) {

+ 1 - 1
graft_cv_api.cpp

@@ -15,7 +15,7 @@ extern CRITICAL_SECTION g_cs;
 namespace graft_cv
 {
 
-	char *g_version_str = "0.8.14";
+	char *g_version_str = "0.8.15";
 
 	//configure
 	string g_conf_file = "./gcv_conf.yml";