user1435395
user1435395

Reputation: 71

Histogram of oriented gradiants

For a project I'm writing some code to compute the HoG of some images, but I'm stuck with the fact that my orientations are only between 0 ~ 90 degrees, while using the atan2 function. I'm guessing that this problem occurs due to the filter2D function of OpenCV but I'm not sure if this is the reason or that I'm doing something else wrong:

Vector<Vector<Mat_<float>>> HoG(Mat image) {
Mat img_x;
Mat img_y;
IplImage img = image;

Mat kern_x = (Mat_<char>(1, 3) << -1, 0, 1);
Mat kern_y = (Mat_<char>(3, 1) << -1, 0, 1);

filter2D(image, img_x, image.depth(), kern_x);
filter2D(image, img_y, image.depth(), kern_y);

Vector<Vector<Mat_<float>>> histograms;

for(int y = 0; y < image.rows - size; y += size) {
    Vector<Mat_<float>> temp_hist;
    for(int x = 0; x < image.cols - size; x += size) {
        float total_mag = 0;
        Mat hist = Mat::zeros(1, 8, CV_32FC1);
        for(int i = y; i < y + size; ++i) {
            for(int j = x; j < x + size; ++j) {
                float grad_x = (float)img_x.at<uchar>(i, j);
                float grad_y = (float)img_y.at<uchar>(i, j);
                double ori = myatan2(grad_x, grad_y);
                float mag = sqrt(pow(grad_x, 2) + pow(grad_y, 2));
                int bin = round(ori/45);
                hist.at<float>(0, (bin - 1 < 0 ? 7 : bin - 1)) += - (float)(ori - ((round(ori/45) - 1) * 45.0 + 22.5)) / 45.0f;
                hist.at<float>(0, bin) += -(float)(ori - ((round(ori/45) - 1) * 45.0 + 22.5)) / 45.0f;
                total_mag += mag;
            }
        }
        // Normalize the histogram
        for(int i = 0; i < 8; ++i) {
            hist.at<float>(0, i) = hist.at<float>(0, i) / total_mag;
        }
        temp_hist.push_back(hist);
    }
    histograms.push_back(temp_hist);
}

return histograms;
}

If you have any other tips to increase a speed-up in my code or something else that is also welcome of course.

Upvotes: 0

Views: 330

Answers (1)

paddy
paddy

Reputation: 63471

I notice this:

float grad_x = (float)img_x.at<uchar>(i, j);
float grad_y = (float)img_y.at<uchar>(i, j);

You seem to be using uchar. Should this not be char?

Upvotes: 1

Related Questions