void AFH::HistOpr_Thresh() { double *p_Hist = (double*)Hist.data; double *p_Sum = (double*)Sum.data; double *p_Thresh = (double*)Threshold.data; double *p_score = (double*)score.data; uchar *p_Flag = Flag.data; double temp_array[SoH+1]; double temp_sum; double temp_max; for(int i = 0; i<H; i++) { for(int j = 0; j<W; j++) { // Original version /* for(int k = 0; k<=SoH; k++) { // 拷贝出直方图 temp_array[k] = *(p_Hist + k); } sort(temp_array,temp_array + SoH + 1); // 直方图排序 temp_max = (*p_Sum) * MDRate; temp_sum = 0; *p_Thresh = 0; for(int k = 0; k<=SoH; k++) { // 求取阈值 temp_sum += temp_array[k]; if(temp_max < temp_sum) { if(k>0) { *p_Thresh = temp_array[k] - (temp_sum-temp_max)*(temp_array[k]-temp_array[k-1])/temp_array[k]; } else { *p_Thresh = temp_array[k] - (temp_sum-temp_max); } break; } } */ // The original version can be approximated and greatly accelerated as follows double max_hist = 0; for(int k = 0; k <= SoH; k++) { if(*(p_Hist + k)>=max_hist) { max_hist = *(p_Hist + k); } } *p_Thresh = max_hist*0.054; *p_Flag = (uchar)Thresh(255*(1.5*(*p_Thresh)-*p_score)/(*p_Thresh), 0, 255); p_Hist += SoH + 1; p_Sum += 1; p_Thresh += 1; p_score += 1; p_Flag += 1; } } }
cv::Mat_<int> cModel::__lbf_fast(const cv::Mat_<uchar>&img, const cv::Rect& bbox, const cv::Mat_<float>& shape,int markID, int stage) { int max_stage = m_Model.__head.__num_stage; int num_node = m_Model.__head.__num_leaf + m_Model.__head.__num_node; int num_point = m_Model.__head.__num_point; int num_tree_per_point = m_Model.__head.__num_tree_per_point; int num_leaf = m_Model.__head.__num_leaf; m_AX[stage].row(markID) *= bbox.width; m_AY[stage].row(markID) *= bbox.height; m_BX[stage].row(markID) *= bbox.width; m_BY[stage].row(markID) *= bbox.height; m_AX[stage].row(markID) += shape(markID, 0); m_AY[stage].row(markID) += shape(markID, 1); m_BX[stage].row(markID) += shape(markID, 0); m_BY[stage].row(markID) += shape(markID, 1); cv::Mat_<int> cind = cv::Mat::ones(m_AX[stage].cols, 1, CV_32SC1); cv::Mat_<float> AX = m_AX[stage].row(markID); cv::Mat_<float> AY = m_AY[stage].row(markID); cv::Mat_<float> BX = m_BX[stage].row(markID); cv::Mat_<float> BY = m_BY[stage].row(markID); cv::Mat_<float> Thresh = m_Thresh[stage].row(markID); int width = img.cols; int height = img.rows; for (int j = 0; j < AX.cols; j += num_node){ for (int index = 0; index < m_Model.__head.__num_node; index++){ int pos = j + index; int a_x = (int)(AX(0, pos) + 0.5); int a_y = (int)(AY(0, pos) + 0.5); int b_x = (int)(BX(0, pos) + 0.5); int b_y = (int)(BY(0, pos) + 0.5); a_x = MAX(0, MIN(a_x, width - 1)); a_y = MAX(0, MIN(a_y, height - 1)); b_x = MAX(0, MIN(b_x, width - 1)); b_y = MAX(0, MIN(b_y, height - 1)); float pixel_v_a = (float)img(cv::Point(a_x, a_y)); float pixel_v_b = (float)img(cv::Point(b_x, b_y)); float val = pixel_v_a - pixel_v_b; if (val < (float)Thresh(0, pos)){ cind(pos, 0) = 0; } } } cv::Mat_<int> binfeature = cv::Mat::zeros(1, (int)cv::sum(m_Isleaf).val[0], CV_32SC1); int cumnum_nodes = 0; int cumnum_leafnodes = 0; for (int t = 0; t < num_tree_per_point; t++){ int id_cnode = 0; while (1){ if (m_Isleaf(id_cnode + cumnum_nodes)){ binfeature(0, cumnum_leafnodes + __getindex(m_Idleafnodes, id_cnode)) = 1; cumnum_nodes = cumnum_nodes + num_node; cumnum_leafnodes = cumnum_leafnodes + num_leaf; break; } id_cnode = m_Cnodes(cumnum_nodes + id_cnode, cind(cumnum_nodes + id_cnode, 0)); } } return binfeature; }