Bladeren bron

v0.8.14 优化茎粗检测功能,增加xx_grab_offset_cut, 在ybt、yup中间点进行偏移,在这个位置计算茎粗;茎edge直线拟合,剔除茎节的影响

chenhongjiang 1 jaar geleden
bovenliggende
commit
20fe43e660
5 gewijzigde bestanden met toevoegingen van 29 en 10 verwijderingen
  1. 2 1
      ReadMe.txt
  2. 6 0
      config.cpp
  3. 2 0
      data_def_api.h
  4. 18 8
      grab_point_rs.cpp
  5. 1 1
      graft_cv_api.cpp

+ 2 - 1
ReadMe.txt

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

+ 6 - 0
config.cpp

@@ -41,6 +41,7 @@ namespace graft_cv{
 			<< "rs_grab_offset" << m_cparam->rs_grab_offset
 			<< "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_holes_number" << m_cparam->rs_grab_holes_number
 
 			<< "sc_grab_xmin" << m_cparam->sc_grab_xmin
@@ -61,6 +62,7 @@ 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_holes_number" << m_cparam->sc_grab_holes_number
 
 			<< "}"; 	
@@ -89,6 +91,7 @@ namespace graft_cv{
 		m_cparam->rs_grab_offset = (double)node["rs_grab_offset"];		
 		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_holes_number = (int)node["rs_grab_holes_number"];
 
 		m_cparam->sc_grab_xmin = (double)node["sc_grab_xmin"];
@@ -109,6 +112,7 @@ namespace graft_cv{
 		m_cparam->sc_grab_offset_normal = (double)node["sc_grab_offset_normal"];
 		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_holes_number = (int)node["sc_grab_holes_number"];
   }
 	string get_cparam_info(ConfigParam*m_cparam)
@@ -139,6 +143,7 @@ namespace graft_cv{
 			<< "rs_grab_offset:\t" << m_cparam->rs_grab_offset << endl			
 			<< "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_holes_number:\t" << m_cparam->rs_grab_holes_number << endl
 
 			<< "sc_grab_xmin:\t" << m_cparam->sc_grab_xmin << endl
@@ -159,6 +164,7 @@ namespace graft_cv{
 			<< "sc_grab_offset_normal:\t" << m_cparam->sc_grab_offset_normal << endl
 			<< "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_holes_number:\t" << m_cparam->sc_grab_holes_number << endl
 
 			<< "}" << endl; 	

+ 2 - 0
data_def_api.h

@@ -37,6 +37,7 @@ typedef struct{
 	double rs_grab_offset;	
 	double rs_grab_fork_yup; //茎节高度上限
 	double rs_grab_fork_ybt; //茎节高度下限, 不在范围内,按下限
+	double rs_grab_offset_cut; // 在ybt、yup中间点进行偏移,在这个位置计算茎粗
 	int rs_grab_holes_number; //单排穴孔数量
 
 	// scion grab based points cloud
@@ -61,6 +62,7 @@ typedef struct{
 
 	double sc_grab_fork_yup; //茎节高度上限
 	double sc_grab_fork_ybt; //茎节高度下限, 不在范围内,按下限
+	double sc_grab_offset_cut; // 在ybt、yup中间点进行偏移,在这个位置计算茎粗
 	int sc_grab_holes_number; //单排穴孔数量
 } ConfigParam;
 

+ 18 - 8
grab_point_rs.cpp

@@ -1567,10 +1567,7 @@ void CRootStockGrabPoint::line_filter(
 
 		//植株点云直线查找
 		//找到inbox点云中的直线
-		float stem_radius = m_cparam.rs_grab_stem_diameter / 2.0;
-		if (m_dtype == 0) {
-			stem_radius = m_cparam.sc_grab_stem_diameter / 2.0;
-		}
+		float stem_radius = 2.0 * m_cloud_mean_dist;
 		//pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
 		pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
 		pcl::SACSegmentation<pcl::PointXYZ> seg;
@@ -2987,11 +2984,19 @@ void CRootStockGrabPoint::line_filter(
 		float stem_width = 0.0;
 
 		double ymin = m_cparam.rs_grab_ymin;
-		double ymax = m_cparam.rs_grab_ymax;		
+		double ymax = m_cparam.rs_grab_ymax;
+		double yup = m_cparam.rs_grab_fork_yup;
+		double ybt = m_cparam.rs_grab_fork_ybt;
+		double offset = m_cparam.rs_grab_offset_cut;		
 		if (m_dtype == 0) {
 			ymin = m_cparam.sc_grab_ymin;
-			ymax = m_cparam.sc_grab_ymax;			
+			ymax = m_cparam.sc_grab_ymax;	
+			yup = m_cparam.sc_grab_fork_yup;
+			ybt = m_cparam.sc_grab_fork_ybt;
+			offset = m_cparam.sc_grab_offset_cut;
 		}
+		double ycut = 0.5 * (yup + ybt) + offset;
+		double xleft_cut, xright_cut;
 
 		float t_left = (ymin - edge_line_left->values.at(1)) / edge_line_left->values.at(4);
 		double xleft = edge_line_left->values.at(3) * t_left + edge_line_left->values.at(0);
@@ -3005,6 +3010,9 @@ void CRootStockGrabPoint::line_filter(
 		p_left_max.y = ymax;
 		p_left_max.z = 0.0;
 
+		t_left = (ycut - edge_line_left->values.at(1)) / edge_line_left->values.at(4);
+		xleft_cut = edge_line_left->values.at(3) * t_left + edge_line_left->values.at(0);
+
 
 		float t_right = (ymin - edge_line_right->values.at(1)) / edge_line_right->values.at(4);
 		double xright = edge_line_right->values.at(3) * t_right + edge_line_right->values.at(0);
@@ -3018,8 +3026,10 @@ void CRootStockGrabPoint::line_filter(
 		p_right_max.y = ymax;
 		p_right_max.z = 0.0;
 
-		stem_width = 0.5 * (fabs(p_left_max.x - p_right_max.x) +
-			fabs(p_left_min.x - p_right_min.x));
+		t_right = (ycut - edge_line_right->values.at(1)) / edge_line_right->values.at(4);
+		xright_cut = edge_line_right->values.at(3) * t_right + edge_line_right->values.at(0);
+
+		stem_width = fabs(xleft_cut - xright_cut);
 		stem_width += 1.5*m_cloud_mean_dist;
 		return stem_width;
 	}

+ 1 - 1
graft_cv_api.cpp

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