//===========================================================================
void Multi_SVR_patch_expert::Response(const Mat_<float> &area_of_interest, Mat_<double> &response)
{
	
	int response_height = area_of_interest.rows - height + 1;
	int response_width = area_of_interest.cols - width + 1;

	if(response.rows != response_height || response.cols != response_width)
	{
		response.create(response_height, response_width);
	}

	// For the purposes of the experiment only use the response of normal intensity, for fair comparison

	if(svr_patch_experts.size() == 1)
	{
		svr_patch_experts[0].Response(area_of_interest, response);		
	}
	else
	{
		// responses from multiple patch experts these can be gradients, LBPs etc.
		response.setTo(1.0);
		
		Mat_<double> modality_resp(response_height, response_width);

		for(size_t i = 0; i < svr_patch_experts.size(); i++)
		{			
			svr_patch_experts[i].Response(area_of_interest, modality_resp);			
			response = response.mul(modality_resp);	
		}	
		
	}

}
inline float calculate_var(const Mat_<float>& v1){
    if (v1.rows==0)
    {
		return 0;
    }
	float mean_1 = mean(v1)[0];
    float mean_2 = mean(v1.mul(v1))[0];
    return mean_2 - mean_1*mean_1;
    
}
void iterative_computation(Mat_<float>& u, Mat_<float>& v, const Mat_<float>& Ix, 
			   const Mat_<float>& Iy, const Mat_<float>& It) {
	if (METHOD == 0) { // Jacobi Methd
	    Mat_<float> f =  (Mat_<float>(3,3) << 1.0/12.0, 1.0/6.0, 1.0/12.0, 1.0/6.0, 0.0, 1.0/6.0, 
					  1.0/12.0, 1.0/6.0, 1.0/12.0);
	    Mat_<float> avg_u, avg_v;
	    filter2D(u, avg_u, -1 , f, Point(-1, -1), 0, BORDER_DEFAULT );
	    filter2D(v, avg_v, -1 , f, Point(-1, -1), 0, BORDER_DEFAULT );
	    Mat_<float> d1 = Ix.mul(avg_u) + Iy.mul(avg_v) + It;
	    Mat_<float> d2 = Mat::ones(u.size(), CV_32F) * ALPHA * ALPHA + Ix.mul(Ix) + Iy.mul(Iy);
	    Mat_<float> r = d1.mul(1 / d2);
	    u = avg_u - Ix.mul(r);
	    v = avg_v - Iy.mul(r);
	}
	else if (METHOD == 1) { // Gauss-Seidel method 
	    for (int i = 1; i < u.rows - 1; i ++) {
		for (int j = 1; j < u.cols - 1; j ++) {
			float avg_u = 1.f / 6.f * (u.at<float>(i - 1, j) + u.at<float>(i, j + 1) + 
					       u.at<float>(i + 1, j) + u.at<float>(i, j - 1)) +
				      1.f / 12.f * (u.at<float>(i - 1, j -1) + u.at<float>(i - 1, j + 1) + 
						u.at<float>(i + 1, j - 1) + u.at<float>(i + 1, j + 1));
			float avg_v = 1.f / 6.f * (v.at<float>(i - 1, j) + v.at<float>(i, j + 1) + 
					       v.at<float>(i + 1, j) + v.at<float>(i, j - 1)) +
				      1.f / 12.f * (v.at<float>(i - 1, j -1) + v.at<float>(i - 1, j + 1) + 
						v.at<float>(i + 1, j - 1) + v.at<float>(i + 1, j + 1));
			float ix = Ix.at<float>(i, j);
			float iy = Iy.at<float>(i, j);
			float it = It.at<float>(i, j);
			float r = (ix * avg_u + iy * avg_v + it) / 
				  (ALPHA * ALPHA + ix * ix + iy * iy);
			
			u.at<float>(i, j) = avg_u - ix * r;
			v.at<float>(i, j) = avg_v - iy * r;
		}
	    }
	} 

	else if (METHOD == 2) { // Successive overrelaxation method 
	    for (int i = 1; i < u.rows - 1; i ++) {
		for (int j = 1; j < u.cols - 1; j ++) {
			float avg_u = 1.f / 6.f * (u.at<float>(i - 1, j) + u.at<float>(i, j + 1) + 
					       u.at<float>(i + 1, j) + u.at<float>(i, j - 1)) +
				      1.f / 12.f * (u.at<float>(i - 1, j -1) + u.at<float>(i - 1, j + 1) + 
						u.at<float>(i + 1, j - 1) + u.at<float>(i + 1, j + 1));
			float avg_v = 1.f / 6.f * (v.at<float>(i - 1, j) + v.at<float>(i, j + 1) + 
					       v.at<float>(i + 1, j) + v.at<float>(i, j - 1)) +
				      1.f / 12.f * (v.at<float>(i - 1, j -1) + v.at<float>(i - 1, j + 1) + 
						v.at<float>(i + 1, j - 1) + v.at<float>(i + 1, j + 1));
			float ix = Ix.at<float>(i, j);
			float iy = Iy.at<float>(i, j);
			float it = It.at<float>(i, j);
			float r = (ix * avg_u + iy * avg_v + it) / 
				  (ALPHA * ALPHA + ix * ix + iy * iy);
			
			u.at<float>(i, j) = (1 - WEIGHT) * u.at<float>(i, j) + WEIGHT * (avg_u - ix * r);
			v.at<float>(i, j) = (1 - WEIGHT) * v.at<float>(i, j) + WEIGHT * (avg_v - iy * r);
		}
	    }
	}			   
}  
示例#4
0
/**
 * @brief       Window Function is just an element-wise product, a type of weighted staff. 
 *              Absolutely not a convolution !!!
 * @param       iImg    Input   -- the original signal
 * @param       oImg    Output  -- the transformed signal
 */
void VO_STFT::VO_ForwardTransform(  const Mat_<float>& iImg,
                                    Mat_<float>& oImg) const
{
    if( (iImg.cols != this->m_VOWindowFunc->m_MatWindowedKernel.cols) ||
        (iImg.rows != this->m_VOWindowFunc->m_MatWindowedKernel.rows) )
    {
        cerr << "STFT: signal should have the same size as Window kernel" << endl;
        exit(1);
    }
    // Explained by JIA Pei. for STFT, it's element-wise weighting, rather than convolution!!
    oImg = iImg.mul(this->m_VOWindowFunc->m_MatWindowedKernel);
    cv::dft(oImg, oImg);
}
示例#5
0
inline double calculate_var(const Mat_<double>& v1){
	double mean_1 = mean(v1)[0];
	double mean_2 = mean(v1.mul(v1))[0];
	return mean_2 - mean_1*mean_1;
	
}