【发布时间】:2018-09-28 01:44:48
【问题描述】:
不太明白为什么这段代码有效:
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 不是第二段中的多通道数组有关,但我不知道如何初始化这样的数组而不是复制第一段代码。
其次,当尝试访问 planes[0] 或 planes[1] 并修改它们的值时:
planes[0].at<double>(indexi,indexj) = 0;
我在内存中遇到另一个异常,但我还看到一个新页面显示 mat.inl.hpp 未找到。使用 Visual Studio,OpenCV 3.4.3,C++ 新手,信号处理中级,不胜感激。
【问题讨论】:
标签: c++ opencv signal-processing