|
@@ -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();
|
|
|
+}
|
|
|
|
|
|
}
|