Forráskód Böngészése

v0.1.3 增加图片切分功能

chenhongjiang 1 éve
szülő
commit
2b14cd7a25
7 módosított fájl, 125 hozzáadás és 24 törlés
  1. 2 1
      ReadMe.txt
  2. 22 1
      config.cpp
  3. 6 0
      data_def_api.h
  4. 6 0
      tcv_conf.yml
  5. 1 1
      tea_cv_api.cpp
  6. 87 21
      tea_sorter.cpp
  7. 1 0
      tea_sorter.h

+ 2 - 1
ReadMe.txt

@@ -1,3 +1,4 @@
 v0.1.0 初始版本,实现整体流程,模型待优化。
 v0.1.1 分开抓取和切割的接口。
-v0.1.2 增加棋盘格角点识别接口。
+v0.1.2 增加棋盘格角点识别接口。
+v0.1.3 增加图片切分功能

+ 22 - 1
config.cpp

@@ -28,9 +28,16 @@ namespace graft_cv{
 			<<"model_path_grab"<<m_cparam->model_path_grab
 			<<"object_threshold_grab"<<m_cparam->object_threshold_grab
 			<<"nms_threshold_grab"<<m_cparam->nms_threshold_grab
+			<< "grid_row_grab" << m_cparam->grid_row_grab
+			<< "grid_col_grab" << m_cparam->grid_col_grab
+			<< "grid_padding_grab" << m_cparam->grid_padding_grab
+
 			<< "model_path_cut" << m_cparam->model_path_cut
 			<< "object_threshold_cut" << m_cparam->object_threshold_cut
 			<< "nms_threshold_cut" << m_cparam->nms_threshold_cut
+			<< "grid_row_cut" << m_cparam->grid_row_cut
+			<< "grid_col_cut" << m_cparam->grid_col_cut
+			<< "grid_padding_cut" << m_cparam->grid_padding_cut
 
 			
 			<< "}"; 	
@@ -47,10 +54,16 @@ namespace graft_cv{
 		m_cparam->model_path_grab =(string)node["model_path_grab"];
 		m_cparam->object_threshold_grab = (float)node["object_threshold_grab"];
 		m_cparam->nms_threshold_grab = (float)node["nms_threshold_grab"];
+		m_cparam->grid_row_grab = (int)node["grid_row_grab"];
+		m_cparam->grid_col_grab	= (int)node["grid_col_grab"];
+		m_cparam->grid_padding_grab	= (int)node["grid_padding_grab"];
+		
 		m_cparam->model_path_cut = (string)node["model_path_cut"];
 		m_cparam->object_threshold_cut = (float)node["object_threshold_cut"];
 		m_cparam->nms_threshold_cut = (float)node["nms_threshold_cut"];
-		
+		m_cparam->grid_row_cut = (int)node["grid_row_cut"];
+		m_cparam->grid_col_cut = (int)node["grid_col_cut"];
+		m_cparam->grid_padding_cut = (int)node["grid_padding_cut"];
 		
   }
 	string get_cparam_info(ConfigParam*m_cparam)
@@ -69,9 +82,17 @@ namespace graft_cv{
 			<<"model_path_grab:\t"<<m_cparam->model_path_grab << endl
 			<<"object_threshold_grab:\t"<<m_cparam->object_threshold_grab << endl
 			<<"nms_threshold_grab:\t"<<m_cparam->nms_threshold_grab << endl
+			<< "grid_row_grab:\t" << m_cparam->grid_row_grab << endl
+			<< "grid_col_grab:\t" << m_cparam->grid_col_grab << endl
+			<< "grid_padding_grab:\t" << m_cparam->grid_padding_grab << endl
+			
 			<< "model_path_cut:\t" << m_cparam->model_path_cut << endl
 			<< "object_threshold_cut:\t" << m_cparam->object_threshold_cut << endl
 			<< "nms_threshold_cut:\t" << m_cparam->nms_threshold_cut << endl
+			<< "grid_row_cut:\t" << m_cparam->grid_row_cut << endl
+			<< "grid_col_cut:\t" << m_cparam->grid_col_cut << endl
+			<< "grid_padding_cut:\t" << m_cparam->grid_padding_cut << endl
+
 			<< "}" << endl; 	
 		return buff.str();
 	}

+ 6 - 0
data_def_api.h

@@ -21,10 +21,16 @@ typedef struct{
 	std::string model_path_grab;
 	float object_threshold_grab;
 	float nms_threshold_grab;
+	int grid_row_grab;
+	int grid_col_grab;
+	int grid_padding_grab;
 
 	std::string model_path_cut;
 	float object_threshold_cut;
 	float nms_threshold_cut;
+	int grid_row_cut;
+	int grid_col_cut;
+	int grid_padding_cut;
 
 } ConfigParam;
 

+ 6 - 0
tcv_conf.yml

@@ -8,10 +8,16 @@ conf_parameters:
    model_path_grab: "D:/projects/graft/py_code/retina_tea5/TeaDetector_op9.onnx"    
    object_threshold_grab: 0.45
    nms_threshold_grab: 0.5
+   grid_row_grab: 3
+   grid_col_grab: 2
+   grid_padding_grab: 50
 
    model_path_cut: "D:/projects/graft/py_code/retina_tea5/TeaDetector_op9.onnx"
    object_threshold_cut: 0.45
    nms_threshold_cut: 0.5
+   grid_row_cut: 1
+   grid_col_cut: 1
+   grid_padding_cut: 50
    
    
 

+ 1 - 1
tea_cv_api.cpp

@@ -21,7 +21,7 @@ extern CRITICAL_SECTION g_cs;
 namespace graft_cv
 {
 
-	char *g_version_str = "0.1.2";
+	char *g_version_str = "0.1.3";
 
 	//configure
 	string g_conf_file = "./tcv_conf.yml";	

+ 87 - 21
tea_sorter.cpp

@@ -36,25 +36,10 @@ int CTeaSort::detect(
 	const char* fn
 	)
 {	
-
-	//m_head_droplets.clear();
-	////0 ÎļþĿ¼ÓÐЧÐÔ¼ì²â
-	//int at = _access(m_temporary_dir.c_str(),0);
-	//int ai = _access(m_image_dir.c_str(),0);
-	//if(at==-1){
-	//	m_pLogger->ERRORINFO(
-	//		string("invalid temporary folder: ")+m_temporary_dir);
-	//	return 1;
-	//}
-	//if(ai==-1){
-	//	m_pLogger->ERRORINFO(
-	//		string("invalid image folder: ")+m_image_dir);
-	//	return 1;
-	//}	
 	//1 model status
 	if (!m_drop_detector.IsModelLoaded()) {
 		m_pLogger->ERRORINFO(
-			string("drople detect model NOT loaded"));
+			string("tea detect model NOT loaded"));
 		return 1;
 	}
 	//2 update recognize threshold
@@ -69,15 +54,57 @@ int CTeaSort::detect(
 	//3 load data
 	load_data(imginfo, fn);
 
-	//4 detect	
-	vector<Bbox> droplets_raw = m_drop_detector.RunModel(m_raw_img,m_pLogger);
+	//4 generate_detect_windows(vector<Rect>&boxes)
+	vector<Rect> drop_regions;
+	int region_cnt = generate_detect_windows(drop_regions);
+	if (region_cnt == 0) {
+		stringstream buff_;
+		buff_ << m_imgId << m_dtype_str << "tea detect image regions' size == 0";
+		m_pLogger->ERRORINFO(buff_.str());
+		return 1;
+	}
+	else {
+		stringstream bufftmp;
+		bufftmp << m_imgId << m_dtype_str << "tea detect image regions' size = "<<region_cnt;
+		m_pLogger->INFO(bufftmp.str());
+	}
+
+	//5 detect	
+	vector<Bbox> droplets_raw;
+	for (auto rect : drop_regions) {
+		Mat roi = m_raw_img(rect);
+		vector<Bbox> head_droplets = m_drop_detector.RunModel(roi, m_pLogger);
+		if (m_pLogger) {
+			stringstream buff_;
+			buff_ << m_imgId << m_dtype_str << "-------crop_rect["<< rect.x<<","<<rect.y<<","<<rect.width
+				<<","<<rect.height<<"],"
+				<<" roi image detect over. tea number is " << head_droplets.size();
+			m_pLogger->INFO(buff_.str());
+		}
+		for (Bbox& b : head_droplets) {
+			b.x1 += rect.x;
+			b.x2 += rect.x;
+			b.y1 += rect.y;
+			b.y2 += rect.y;
+			for (int i = 0; i < 5; ++i) {
+				b.ppoint[2 * i] += rect.x;
+				b.ppoint[2 * i + 1] += rect.y;
+			}			
+		}
+
+		if (head_droplets.size()) {
+			droplets_raw.insert(
+				droplets_raw.end(),
+				head_droplets.begin(),
+				head_droplets.end());
+		}
+	}
 	if (m_pLogger) {		
 		stringstream buff_;
 		buff_ << m_imgId<<m_dtype_str << "image detect over. tea number is " << droplets_raw.size();
 		m_pLogger->INFO(buff_.str());
 	}
-
-	//5 nms, width(height) filt and area calculation
+	//6 nms, width(height) filt and area calculation
 	vector<Bbox> droplets;
 	vector<int> keep;
 	nms_bbox(droplets_raw, m_drop_detector.GetNmsThreshold(), keep);
@@ -85,7 +112,12 @@ int CTeaSort::detect(
 	for (int i : keep) {		
 		droplets.push_back(droplets_raw[i]);
 	}
-	m_pLogger->INFO(string("nms droplets"));
+	if (m_pLogger) {
+		stringstream buff_;
+		buff_ << m_imgId << m_dtype_str << "after nms, keep tea number is " << droplets.size();
+		m_pLogger->INFO(buff_.str());		
+	}
+	
 	
 	int valid_cnt = 0;
 	for (int i = 0; i < droplets.size();++i) {
@@ -273,5 +305,39 @@ void CTeaSort::clear_imginfo() {
 		m_pImginfoRaw = 0;
 	}
 }
+int CTeaSort::generate_detect_windows(vector<Rect>&boxes)
+{
+	boxes.clear();
+	int grid_row = m_cp.grid_row_cut;
+	int grid_col = m_cp.grid_col_cut;
+	int grid_padding = m_cp.grid_padding_cut;
+	if (m_dtype == img_type::tea_grab) {
+		grid_row = m_cp.grid_row_grab;
+		grid_col = m_cp.grid_col_grab;
+		grid_padding = m_cp.grid_padding_grab;
+	}
+	if (grid_row < 1) {		grid_row = 1;	}
+	if (grid_col < 1) {		grid_col = 1;	}
+	if (grid_padding < 0) { grid_padding = 0; }
+
+	int block_height = int(m_raw_img.rows / (float)grid_row + 0.5);
+	int block_width = int(m_raw_img.cols / (float)grid_col + 0.5);
+	for (int r = 0; r < grid_row; ++r) {
+		for (int c = 0; c < grid_col; ++c) {
+			int x0 = c*block_width - grid_padding;
+			int y0 = r*block_height - grid_padding;
+			int x1 = (c+1)*block_width + grid_padding;
+			int y1 = (r+1)*block_height + grid_padding;
+
+			if (x0 < 0) { x0 = 0; }
+			if (y0 < 0) { y0 = 0; }
+			if (x1 > m_raw_img.cols) { x1 = m_raw_img.cols; }
+			if (y1 > m_raw_img.rows) { y1 = m_raw_img.rows; }
+			Rect r(x0, y0, x1-x0, y1-y0);
+			boxes.push_back(r);
+		}
+	}
+	return boxes.size();
+}
 
 }

+ 1 - 0
tea_sorter.h

@@ -40,6 +40,7 @@ namespace graft_cv{
 		ImgInfo* m_pImginfoRaw;
 		ImgInfo* m_pImginfoDetected; 
 
+		int generate_detect_windows(vector<Rect>&boxes);
 		void clear_imginfo();
 		double calalate_angle(Bbox&b);
 	};