OpenCV filter2D C ++中的负值

时间:2015-03-01 11:16:46

标签: c++ opencv

我试图在C ++中的某些视频帧上实现直方图梯度直方图。我使用filter2D来卷积帧图像,但似乎结果值都是0。如何让filter2D也给出负值?

这是一段代码:

// 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);
    }
}

1 个答案:

答案 0 :(得分:0)

  1. 您的代码似乎没问题,应该会产生积极的结果以及否定的结果。你怎么检查没有负面结果?也许你正在将浮点图像转换为灰度级(即无符号字符),这确实会产生所有负面结果。

  2. 使用Sobel函数更容易获得相同的结果,该函数专用于计算图像中的渐变:

    Sobel(image,gradientX,CV_32F,1,0,1);

    Sobel(image,gradientY,CV_32F,0,1,1);