Переглянути джерело

v0.7.1 增加voxelsize参数;修改茎密度最大值的1/3为最小茎密度的下限(原来为1/2,有些小苗识别不出来)

chenhongjiang 1 рік тому
батько
коміт
a3d7e737ad
6 змінених файлів з 30 додано та 16 видалено
  1. 2 1
      ReadMe.txt
  2. 8 2
      config.cpp
  3. 2 0
      data_def_api.h
  4. 11 9
      gcv_conf.yml
  5. 6 3
      grab_point_rs.cpp
  6. 1 1
      graft_cv_api.cpp

+ 2 - 1
ReadMe.txt

@@ -85,4 +85,5 @@ v0.6.13 
 v0.6.14 修改茎识别方法,通过2d高密度点找到茎的位置,然后提取株的最大空间内点云,用直线分割的方法得到茎的位置,避免识别位置错误
 v0.6.15 修改抓取点识别方法,通过比较直线点云和原始点云相同位置邻域内xz的范围,确定此点是否是无干扰点的茎
 v0.6.16 加强苗的识别,增加倾斜苗的检测,修改排序错乱问题
-v0.7.0 支持多线程调用业务接口
+v0.7.0 支持多线程调用业务接口
+v0.7.1 增加voxelsize参数;修改茎密度最大值的1/3为最小茎密度的下限(原来为1/2,有些小苗识别不出来)

+ 8 - 2
config.cpp

@@ -105,6 +105,7 @@ namespace graft_cv{
 			<< "rs_grab_y_opt" << m_cparam->rs_grab_y_opt
 			<< "rs_grab_seedling_dist" << m_cparam->rs_grab_seedling_dist
 			<< "rs_grab_stem_min_pts" << m_cparam->rs_grab_stem_min_pts
+			<< "rs_grab_voxel_size" << m_cparam->rs_grab_voxel_size
 
 			<< "sc_grab_xmin" << m_cparam->sc_grab_xmin
 			<< "sc_grab_xmax" << m_cparam->sc_grab_xmax
@@ -116,6 +117,7 @@ namespace graft_cv{
 			<< "sc_grab_y_opt" << m_cparam->sc_grab_y_opt
 			<< "sc_grab_seedling_dist" << m_cparam->sc_grab_seedling_dist
 			<< "sc_grab_stem_min_pts" << m_cparam->sc_grab_stem_min_pts
+			<< "sc_grab_voxel_size" << m_cparam->sc_grab_voxel_size
 			<< "}"; 	
 	};
 	void CGCvConfig::read(const cv::FileNode& node){ //Read serialization for this class
@@ -203,7 +205,8 @@ namespace graft_cv{
 		m_cparam->rs_grab_stem_diameter = (double)node["rs_grab_stem_diameter"];
 		m_cparam->rs_grab_y_opt = (double)node["rs_grab_y_opt"];
 		m_cparam->rs_grab_seedling_dist = (double)node["rs_grab_seedling_dist"];
-		m_cparam->rs_grab_stem_min_pts = (double)node["rs_grab_stem_min_pts"];
+		m_cparam->rs_grab_stem_min_pts = (int)node["rs_grab_stem_min_pts"];
+		m_cparam->rs_grab_voxel_size = (double)node["rs_grab_voxel_size"];
 
 		m_cparam->sc_grab_xmin = (double)node["sc_grab_xmin"];
 		m_cparam->sc_grab_xmax = (double)node["sc_grab_xmax"];
@@ -214,7 +217,8 @@ namespace graft_cv{
 		m_cparam->sc_grab_stem_diameter = (double)node["sc_grab_stem_diameter"];
 		m_cparam->sc_grab_y_opt = (double)node["sc_grab_y_opt"];
 		m_cparam->sc_grab_seedling_dist = (double)node["sc_grab_seedling_dist"];
-        m_cparam->sc_grab_stem_min_pts = (double)node["sc_grab_stem_min_pts"];
+        m_cparam->sc_grab_stem_min_pts = (int)node["sc_grab_stem_min_pts"];
+		m_cparam->sc_grab_voxel_size = (double)node["sc_grab_voxel_size"];
   }
 	string get_cparam_info(ConfigParam*m_cparam)
 	{
@@ -308,6 +312,7 @@ namespace graft_cv{
 			<< "rs_grab_y_opt:\t" << m_cparam->rs_grab_y_opt << endl
             << "rs_grab_seedling_dist:\t" << m_cparam->rs_grab_seedling_dist << endl
 			<< "rs_grab_stem_min_pts:\t" << m_cparam->rs_grab_stem_min_pts << endl
+			<< "rs_grab_voxel_size:\t" << m_cparam->rs_grab_voxel_size << endl
 
 
 			<< "sc_grab_xmin:\t" << m_cparam->sc_grab_xmin << endl
@@ -320,6 +325,7 @@ namespace graft_cv{
 			<< "sc_grab_y_opt:\t" << m_cparam->sc_grab_y_opt << endl
 			<< "sc_grab_seedling_dist:\t" << m_cparam->sc_grab_seedling_dist << endl
 			<< "sc_grab_stem_min_pts:\t" << m_cparam->sc_grab_stem_min_pts << endl
+			<< "sc_grab_voxel_size:\t" << m_cparam->sc_grab_voxel_size << endl
 			<< "}" << endl; 	
 		return buff.str();
 	}

+ 2 - 0
data_def_api.h

@@ -115,6 +115,7 @@ typedef struct{
 	double rs_grab_y_opt;
 	double rs_grab_seedling_dist;
 	int rs_grab_stem_min_pts;
+	double rs_grab_voxel_size;
 
 	// scion grab based points cloud
 	double sc_grab_xmin;
@@ -128,6 +129,7 @@ typedef struct{
 	double sc_grab_y_opt;
 	double sc_grab_seedling_dist;
 	int sc_grab_stem_min_pts;
+	double sc_grab_voxel_size;
 
 
 

+ 11 - 9
gcv_conf.yml

@@ -1,6 +1,6 @@
 %YAML:1.0
 conf_parameters:
-   image_show: 0
+   image_show: 1
    image_return: 1
    image_row_grid: 20
    image_col_grid: 100
@@ -68,22 +68,24 @@ conf_parameters:
    rs_grab_xmin: -200
    rs_grab_xmax: 200
    rs_grab_ymin: -45
-   rs_grab_ymax: 30
+   rs_grab_ymax: 0
    rs_grab_zmin: 300
-   rs_grab_zmax: 450
+   rs_grab_zmax: 400
    rs_grab_stem_diameter: 5.0
    rs_grab_y_opt: -30
    rs_grab_seedling_dist: 40.0
-   rs_grab_stem_min_pts: 40
+   rs_grab_stem_min_pts: 50
+   rs_grab_voxel_size: 0.02
    sc_grab_xmin: -200
    sc_grab_xmax: 200
-   sc_grab_ymin: -50
-   sc_grab_ymax: 30
+   sc_grab_ymin: -45
+   sc_grab_ymax: -15
    sc_grab_zmin: 300
-   sc_grab_zmax: 500
+   sc_grab_zmax: 400
    sc_grab_stem_diameter: 5.0
-   sc_grab_y_opt: -10
+   sc_grab_y_opt: -20
    sc_grab_seedling_dist: 40.0
-   sc_grab_stem_min_pts: 35
+   sc_grab_stem_min_pts: 30
+   sc_grab_voxel_size: 0.02
    
 

+ 6 - 3
grab_point_rs.cpp

@@ -196,7 +196,10 @@ namespace graft_cv {
 		pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_dowm_sampled(new pcl::PointCloud<pcl::PointXYZ>);
 		pcl::VoxelGrid<pcl::PointXYZ> outrem;
 		outrem.setInputCloud(cloud_ror);
-		outrem.setLeafSize(stem_radius, stem_radius, stem_radius);
+		//outrem.setLeafSize(stem_radius, stem_radius, stem_radius);
+		double voxel_size = m_cparam.rs_grab_voxel_size;
+		if (m_dtype == 0) { voxel_size = m_cparam.sc_grab_voxel_size; }
+		outrem.setLeafSize(voxel_size, voxel_size, voxel_size);
 		outrem.filter(*cloud_dowm_sampled);
 
 		if (m_pLogger) {
@@ -738,13 +741,13 @@ void CRootStockGrabPoint::line_filter(
 			box_filter.filter(inbox_idx);
 			pcl::copyPointCloud(*in_cloud, inbox_idx, *seedling_inbox);
 			//点数过滤
-			if (inbox_idx.size() < int(max_density/2)) { continue; }
+			if (inbox_idx.size() < int(max_density/3)) { continue; }
 			//y方向分布范围滤波
 			pcl::PointXYZ min_v;
 			pcl::PointXYZ max_v;
 			pcl::getMinMax3D(*seedling_inbox, min_v, max_v);
 			float dy = max_v.y - min_v.y;
-			if (dy / (ymax - ymin) < 0.5) { continue; }
+			if (dy / (ymax - ymin) < 0.35) { continue; }
 			//y方向分布中心滤波
 			float dy_c = 0.5*(max_v.y + min_v.y);
 			if ((dy_c-ymin) / (ymax - ymin) > 0.75) { continue; }

+ 1 - 1
graft_cv_api.cpp

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