|
@@ -2440,76 +2440,76 @@ void CRootStockGrabPoint::line_filter(
|
|
|
|
|
|
//peak finder
|
|
|
std::vector<int> peak_indices;
|
|
|
+ std::vector<float> peak_power;
|
|
|
findPeaks(stem_width, peak_indices, false);
|
|
|
+ indexPeaks(stem_width, peak_indices, mu, peak_power);
|
|
|
+ float max_power = 0.0;
|
|
|
if(peak_indices.size() > 0) {
|
|
|
int tmp_max_pos = peak_indices[0];
|
|
|
- float max_v = stem_width[tmp_max_pos];
|
|
|
- for (auto&pid : peak_indices) {
|
|
|
- if (stem_width[pid] > max_v) {
|
|
|
+ max_power = peak_power[0];
|
|
|
+ for (int i = 0; i < peak_indices.size();++i) {
|
|
|
+ int pid = peak_indices.at(i);
|
|
|
+ if (peak_power[i] > max_power) {
|
|
|
tmp_max_pos = pid;
|
|
|
- max_v = stem_width[tmp_max_pos];
|
|
|
+ max_power = peak_power[i];
|
|
|
}
|
|
|
}
|
|
|
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);
|
|
|
+ //保存历史茎节位置
|
|
|
+ if (max_power > 0.5) {
|
|
|
+ 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 = 0;
|
|
|
+ if (m_stem_fork_ys.size() > 0) {
|
|
|
+ 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){
|
|
|
- //穗苗尽量找高点
|
|
|
- if (th < max_val) {
|
|
|
- int i = max_pos-10;
|
|
|
- if (i < 0) { i = 0; }
|
|
|
- for (; i < stem_width.size(); ++i) {
|
|
|
- if (stem_width.at(i) >= th) {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- max_pos = i;
|
|
|
+ //float max_val = stem_width.at(max_pos);
|
|
|
+ //float th = mu + th_ratio * stdv;
|
|
|
+ if(m_dtype == 0){
|
|
|
+ if (max_power > 0.5) {
|
|
|
+ max_pos_ref = max_pos;
|
|
|
+ max_pos += static_cast<int>(m_cparam.sc_grab_offset);
|
|
|
}
|
|
|
else {
|
|
|
- //从上往下10mm
|
|
|
- int i = stem_width.size() - 10;
|
|
|
- for (; i >=0; --i) {
|
|
|
- if (stem_width.at(i) >= mu) {
|
|
|
- break;
|
|
|
- }
|
|
|
+ if (max_pos_mu > 0) {
|
|
|
+ max_pos_ref = max_pos_mu;
|
|
|
+ max_pos = max_pos_mu;
|
|
|
}
|
|
|
- max_pos = i;
|
|
|
- }
|
|
|
- max_pos_ref = max_pos;
|
|
|
- max_pos += static_cast<int>(m_cparam.sc_grab_offset);
|
|
|
- max_pos_mu += static_cast<int>(m_cparam.sc_grab_offset);
|
|
|
- }
|
|
|
- else{
|
|
|
- //砧木可以按低点
|
|
|
- if (th < max_val) {
|
|
|
- int i = max_pos - 10;
|
|
|
- if (i < 0) { i = 0; }
|
|
|
- for (; i < stem_width.size(); ++i) {
|
|
|
- if (stem_width.at(i) >= th) {
|
|
|
- break;
|
|
|
- }
|
|
|
+ else {
|
|
|
+ max_pos_ref = max_pos;
|
|
|
+ max_pos += static_cast<int>(m_cparam.sc_grab_offset);
|
|
|
}
|
|
|
- max_pos = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ if (max_power > 0.5) {
|
|
|
+ max_pos_ref = max_pos;
|
|
|
+ max_pos += static_cast<int>(m_cparam.rs_grab_offset);
|
|
|
}
|
|
|
- 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);
|
|
|
+ else {
|
|
|
+ if (max_pos_mu > 0) {
|
|
|
+ max_pos_ref = max_pos_mu;
|
|
|
+ max_pos = max_pos_mu;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ max_pos_ref = max_pos;
|
|
|
+ max_pos += 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;
|
|
|
- }
|
|
|
+ ////用历史均值进行约束,如果偏差大于10mm,采用历史均值
|
|
|
+ //if (abs(max_pos - max_pos_mu) > 10) {
|
|
|
+ // max_pos = max_pos_mu;
|
|
|
+ // max_pos_ref = max_pos;
|
|
|
+ //}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
//直线点云,获取指定区域的dx_line,dz_line
|