0

嗨,

我实在想不通这个。

我正在使用 opencv 2.4.2。

以下示例中的 dft() 函数为最后一次调用 compute() 函数生成一个包含至少一个 NaN 值的图像。

当更改代码中的任何内容时,即使它不影响 dft,它也会突然起作用。

该代码只是问题的一个最小示例,也是一个巨大项目的一部分。代码的某些部分没有任何意义,但它只是为了向您展示问题。

现在的问题是“我做错了吗?” 我希望代码能像这样工作。我附上了图片以防有人想尝试自己。

#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

const std::vector<float> compute(const cv::Mat& image)
{
    cv::Mat workingImage;
    cv::Mat imgDFT;
    cv::Mat img;

    cv::cvtColor(image, workingImage, CV_BGR2GRAY);
    cv::resize(workingImage, img, cv::Size(256, 256));

    std::vector<float> result = std::vector<float>(1, 0);
    cv::copyMakeBorder(img, img, 32, 32, 32, 32, cv::BORDER_REFLECT);
    img.convertTo(img, CV_32FC1);

    cv::dft(img, imgDFT, cv::DFT_COMPLEX_OUTPUT);

    if (!cv::checkRange(imgDFT)) 
        std::cerr << "NaN in imgDFT" << std::endl;

    return result;
}

int main(int argc, char* argv[])
{
    std::vector<float> descriptor0 = compute(cv::imread("1.jpg", CV_LOAD_IMAGE_COLOR));
    std::vector<float> descriptor1 = compute(cv::imread("1.jpg", CV_LOAD_IMAGE_COLOR));
    std::vector<float> descriptor2 = compute(cv::imread("2.jpg", CV_LOAD_IMAGE_COLOR));
}

http://i.stack.imgur.com/OcK44.jpg (1.jpg) http://i.stack.imgur.com/wBU8a.jpg (2.jpg)

4

0 回答 0