OpenCV C++,难以理解DFT的起始代码



不太明白为什么这段代码有效:

cv::Mat img = cv::imread('pic.jpg', -1);
cv::Mat padded;                            
std::uint16_t m = cv::getOptimalDFTSize(img.rows);  // This will be 256
std::uint16_t n = cv::getOptimalDFTSize(img.cols);  // This will be 256
cv::copyMakeBorder(img, padded, 0, m - img.rows, 0, n - img.cols, 
cv::BORDER_CONSTANT, cv::Scalar::all(0));           // With my inputs, this effectively just copies img into padded
cv::Mat planes[] = { cv::Mat_<float>(padded),cv:: Mat::zeros(padded.size(), CV_32F) };
cv::Mat dft_img;  
cv::merge(planes, 2, dft_img);         
cv::dft(dft_img, dft_img);
cv::split(dft_img, planes);                   

但这会中断内存中的异常:

cv::Mat img = cv::imread('pic.jpg', -1);    // I know this image is 256x256
cv::Mat dft_img = cv::Mat::zeros(256,256,CV_32F);  // Hard coding for simplicity atm
cv::dft(img,dft_img);

我在理解 dft(( https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#dft 的文档时遇到问题, 以及其他函数和类。

我认为这与第二段中dft_img不是多通道数组有关,但我迷失了如何初始化这样一个数组,而不是复制第一段代码。

其次,当尝试访问平面 [0] 或平面 [1] 并使用以下方法修改其值时:

planes[0].at<double>(indexi,indexj) = 0;

我在内存中得到了另一个异常,尽管我也看到一个新页面说 mat.inl.hpp 未找到。 使用Visual Studio,OpenCV 3.4.3,一个C++但信号处理中级的新手,任何帮助都值得赞赏。

您没有指定您得到的异常,但重要的一点是 dft 函数的输入必须是浮点数,可以是 32 位或 64 位浮点数。另一点是,如果您对 c++ 不满意,尽量不要使用原始数组。我什至建议,如果使用 c++ 不是必需的,那么在 OpenCV 中更喜欢 python。下面是一个工作示例 dft 代码:

//  read your image
cv::Mat img = cv::imread("a2.jpg", CV_LOAD_IMAGE_GRAYSCALE);    // I know this image is 256x256
//  convert it to floating point
//normalization is optional(depends on library and you I guess?)
cv::Mat floatImage;
img.convertTo(floatImage, CV_32FC1, 1.0/255.0);
//  create a placeholder Mat variable to hold output of dft
std::vector<cv::Mat> dftOutputs;
dftOutputs.push_back(floatImage);
dftOutputs.push_back(cv::Mat::zeros(floatImage.size(), CV_32F));
cv::Mat dftOutput;
cv::merge(dftOutputs, dftOutput);
//  perform dft
cv::dft(dftOutput, dftOutput);
//  separate real and complex outputs back
cv::split(dftOutput, dftOutputs);

我稍微更改了教程中的代码,使其更易于理解。如果您想获得幅度图像等,可以按照拆分后函数的教程进行操作。

最新更新