浏览代码

v0.7.16 优化茎节位置识别,增加平均茎节高度约束,10mm范围

chenhongjiang 1 年之前
父节点
当前提交
5a2a4bfb01
共有 5 个文件被更改,包括 28 次插入8 次删除
  1. 2 1
      ReadMe.txt
  2. 4 4
      gcv_conf.yml
  3. 16 2
      grab_point_rs.cpp
  4. 5 0
      grab_point_rs.h
  5. 1 1
      graft_cv_api.cpp

+ 2 - 1
ReadMe.txt

@@ -100,4 +100,5 @@ v0.7.11 
 v0.7.12 增加茎节peakfind功能
 v0.7.13 修改sc_grab_offset不起作用的bug
 v0.7.14 增加指定抓取位置的功能,抓取位置在ymax向下指定距离为抓取位置
-v0.7.15 优化茎节位置识别
+v0.7.15 优化茎节位置识别
+v0.7.16 优化茎节位置识别,增加平均茎节高度约束,10mm范围

+ 4 - 4
gcv_conf.yml

@@ -80,20 +80,20 @@ conf_parameters:
 
    rs_grab_xmin: -200
    rs_grab_xmax: 250
-   rs_grab_ymin: -30
+   rs_grab_ymin: -50
    rs_grab_ymax: 10
    rs_grab_zmin: 300
    rs_grab_zmax: 440
    rs_grab_stem_diameter: 5.0
-   rs_grab_y_opt: 20
+   rs_grab_y_opt: 30
    rs_grab_seedling_dist: 40.0
    rs_grab_stem_min_pts: 50
    rs_grab_ror_ratio: 0.85
-   rs_grab_offset: .0
+   rs_grab_offset: 0
 
 
    sc_grab_xmin: -200
-   sc_grab_xmax: 200
+   sc_grab_xmax: 220
    sc_grab_ymin: -30
    sc_grab_ymax: 10
    sc_grab_zmin: 300

+ 16 - 2
grab_point_rs.cpp

@@ -38,7 +38,8 @@ namespace graft_cv {
 		m_ppImgSaver(0),
 		m_1st_row_zmean_rs(-1.0),
 		m_1st_row_zmean_sc(-1.0),
-		m_cloud_mean_dist(0.0)
+		m_cloud_mean_dist(0.0),
+		m_stem_fork_ys_size(20)
 	{
 	}
 
@@ -2452,6 +2453,11 @@ void CRootStockGrabPoint::line_filter(
 			max_pos = tmp_max_pos;
 			max_pos_ref = max_pos;			
 		}
+		//保存历史茎节位置
+		m_stem_fork_ys.insert(m_stem_fork_ys.begin(), max_pos);
+		if (m_stem_fork_ys.size() > m_stem_fork_ys_size) { m_stem_fork_ys.pop_back(); }
+		int max_pos_mu = int(get_hist_mean<int>(m_stem_fork_ys) + 0.5);
+
 		float max_val = stem_width.at(max_pos);
 		float th = mu + th_ratio * stdv;
 		if(m_dtype == 0){
@@ -2477,7 +2483,8 @@ void CRootStockGrabPoint::line_filter(
 				max_pos = i;
 			}
 			max_pos_ref = max_pos;
-			max_pos += static_cast<int>(m_cparam.sc_grab_offset);			
+			max_pos += static_cast<int>(m_cparam.sc_grab_offset);
+			max_pos_mu += static_cast<int>(m_cparam.sc_grab_offset);
 		}
 		else{
 			//砧木可以按低点
@@ -2493,10 +2500,17 @@ void CRootStockGrabPoint::line_filter(
 			}
 			max_pos_ref = max_pos;
 			max_pos += static_cast<int>(m_cparam.rs_grab_offset);
+			max_pos_mu += static_cast<int>(m_cparam.rs_grab_offset);
 		}
 		if (max_pos < 0) { max_pos = 0;	}
 		if (max_pos >= online_points.size()) { max_pos = online_points.size() - 1; }
 
+		//用历史均值进行约束,如果偏差大于10mm,采用历史均值
+		if (abs(max_pos - max_pos_mu) > 10) {
+			max_pos = max_pos_mu;
+			max_pos_ref = max_pos;
+		}
+
 		/////////////////////////////////////////////////////////////////////
 		//直线点云,获取指定区域的dx_line,dz_line
 		Eigen::Vector4f min_point;

+ 5 - 0
grab_point_rs.h

@@ -33,6 +33,11 @@ namespace graft_cv {
 		pcl::PointCloud<pcl::PointXYZ>::Ptr m_raw_cloud;
 		double m_cloud_mean_dist;
 
+		//历史茎节位置,用于计算平均茎节位置
+		std::vector<int>m_stem_fork_ys;
+		int m_stem_fork_ys_size;
+
+
 
 		int read_ply_file(const char* fn);
 		double compute_nearest_neighbor_distance(pcl::PointCloud<pcl::PointXYZ>::Ptr);

+ 1 - 1
graft_cv_api.cpp

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