示例#1
0
文件: AFH.cpp 项目: zengzhi2015/AFH
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;
        }
    }
}
示例#2
0
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;	
}