2015-03-01 3 views
0

Я пытаюсь реализовать гистограмму ориентированных градиентов на некоторых видеокадрах на C++. Я использовал filter2D для свертывания изображения кадра, но кажется, что результирующие значения равны 0. Как мне получить filter2D, чтобы дать отрицательные значения?OpenCV filter2D отрицательные значения в C++

Вот фрагмент кода:

// Function that gets the histogram of gradients for a single video file 
int HOG(string filename) 
{ 
    static int frames_read = 0; 
    VideoCapture cap(filename); 
    if(!cap.isOpened()) // check if we succeeded 
     return -1; 

    Mat image; 
    namedWindow(filename,1); 

    // Read through frames of video 
    for(;;) 
    { 
     Mat frame; 
     float histogram[NUM_BINS * SPACIAL_X * SPACIAL_Y] = {0}; 
     cap >> frame; // Get a new frame from camera 
     if(frame.empty()) 
      break; 
     cvtColor(frame, image, CV_BGR2GRAY); 

     // Set up gradient kernels 
     float kernelX[9] = {0, 0, 0, -1.0, 0, 1.0, 0, 0, 0}; 
     float kernelY[9] = {0, -1.0, 0, 0, 0, 0, 0, 1.0, 0}; 
     Mat filterX(3, 3, CV_32F, kernelX); 
     Mat filterY(3, 3, CV_32F, kernelY); 
     Mat gradientX; 
     Mat gradientY; 

     // Apply gradients 
     filter2D(image, gradientX, CV_32F, filterX, Point (-1, 1), 0, BORDER_DEFAULT); 
     filter2D(image, gradientY, CV_32F, filterY, Point (-1, 1), 0, BORDER_DEFAULT); 
    } 
} 
+0

преобразовать изображение с плавающей точкой, а также – Photon

ответ

0
  1. Ваш код, кажется, хорошо, и должны генерировать положительные результаты, а также негативы. Как вы проверяете отсутствие отрицательных результатов? Возможно, вы конвертируете изображения с плавающей точкой на уровень серого (т. Е. Неподписанный символ), это действительно обрезает все отрицательные результаты.

  2. Это легче получить те же результаты, используя Sobel функцию, которая посвящена расчета градиентов в изображении:

    Собела (изображение, gradientX, CV_32F, 1, 0, 1);

    Sobel (изображение, градиентY, CV_32F, 0, 1, 1);

+0

Чтобы проверить, я просто итерацию через gradientX и gradientY коврики, используя что-то вдоль линий 'р = gradientX.ptr (IDX)' Когда вы говорите что преобразование изображений с плавающей запятой на уровень серого обрезает отрицательные результаты, означает ли это, что я не должен преобразовывать из BGR в серый, прежде чем применять градиент? –

+0

Подождите, я вижу, я должен использовать что-то вроде 'gradientX.ptr (idx)' –

Смежные вопросы