void BOW::calc(cv::Mat & img, Feature & feat){
    Mat rimg;
    img.copyTo(rimg);
//    if (img.rows > 100 && img.cols > 100)
//        rimg = Mat(img, Range(img.rows/5, img.rows*4/5), Range(img.cols/5, img.cols*4/5));
//    else
//        rimg = img;
    if (rimg.cols > 300 || rimg.rows > 300)
    {
        double fr = min(300.0/rimg.rows, 300.0/rimg.cols);
        resize(rimg, rimg, Size(), fr, fr, INTER_AREA);
    }
    ImgBGReplace(rimg, rimg);
    //GaussianBlur(img, img, Size(5, 5), 1.5, 1.5, BORDER_REPLICATE);
    vector<KeyPoint> kps;
    m_fd->detect(rimg, kps);
    Mat res;
    m_ext->compute(rimg, kps, res);
    if (kps.size()) {
        feat.clear();
        for (int i = 0; i < m_ext->descriptorSize(); ++i)
            feat.push_back((double) res.at<uchar>(0, i) / max(kps.size(), 1U));
    }
    else {
        feat.clear();
        for (int i = 0; i < m_ext->descriptorSize(); ++i)
            feat.push_back(0);
    }
}
Multiscale centerSurround(Multiscale pyrm1, Multiscale pyrm2){
    Mat   aux1,aux2,aux3,
          aux4,aux5,aux6;
    Feature      cenSurr;

    resize(pyrm2.at(4),pyrm2.at(4), pyrm1.at(1).size(), 0, 0,INTER_LINEAR);
    resize(pyrm2.at(5),pyrm2.at(5), pyrm1.at(2).size(), 0, 0,INTER_LINEAR);
    resize(pyrm2.at(6),pyrm2.at(6), pyrm1.at(3).size(), 0, 0,INTER_LINEAR);

    aux1 = pyrm1.at(1)-pyrm2.at(4);
    aux2 = pyrm1.at(2)-pyrm2.at(5);
    aux3 = pyrm1.at(3)-pyrm2.at(6);

    resize(pyrm2.at(5),pyrm2.at(5), pyrm1.at(1).size(), 0, 0,INTER_LINEAR);
    resize(pyrm2.at(6),pyrm2.at(6), pyrm1.at(2).size(), 0, 0,INTER_LINEAR);
    resize(pyrm2.at(7),pyrm2.at(7), pyrm1.at(3).size(), 0, 0,INTER_LINEAR);

    aux4 = pyrm1.at(1)-pyrm2.at(5);
    aux5 = pyrm1.at(2)-pyrm2.at(6);
    aux6 = pyrm1.at(3)-pyrm2.at(7);

    cenSurr.push_back(aux1);
    cenSurr.push_back(aux4);

    cenSurr.push_back(aux2);
    cenSurr.push_back(aux5);

    cenSurr.push_back(aux3);
    cenSurr.push_back(aux6);

    return cenSurr;
}
void ColorMean::calc(Mat& im, Feature& res)
{
	Mat ras;
	resize(im, ras, Size(3, 3), 0, 0, INTER_AREA);
	res.clear();
	for (int i = 0; i < 3; ++i)
		for (int j = 0; j < 3; ++j)
		{
			Vec3b r = ras.at<Vec3b>(i, j);
			for (int k = 0; k < 3; ++k)
			{
				double t = r[k];
				t /= 256;
				res.push_back(t);
			}
		}
}