OpenCV / C++ - 将图像转换为双精度矢量以进行 FFT(快速傅立叶变换)

OpenCV / C++ - Convert image to vector of doubles for FFT (Fast Fourier Transform)

我正在尝试计算图像的 FFT(快速傅里叶变换)以使用频率来确定图像是否模糊。

我需要使用代码库中已有的自定义 FFT 算法。 FFT 算法需要 doublesints 的标准一维向量。我需要一种方法来读取图像,然后将其转换为双精度矢量,以便计算图像的 FFT。

我尝试了以下方法:

cv::Mat inputImage = cv::imread("testImage.png");
cv::Mat fImage; 

inputImage.convertTo(fImage, CV_32F); 
std::vector<double> actualImage = fImage.clone();

但是,我收到错误消息:

OpenCV Error: Assertion failed (channels() == CV_MAT_CN(dtype)) in copyTo,

关于如何实现此目标的任何想法?

CV_32F 表示 float,而不是 double。您应该改用 CV_64F

您还需要指定通道数。此示例适用于 1 通道图像(灰度),可能是您需要的:

// Load the image
cv::Mat inputImage = cv::imread("testImage.png");
// Convert to single channel (grayscale)
cv::cvtColor(inputImage, inputImage, cv::COLOR_BGR2GRAY);

// Or directly load as grayscale    
// cv::Mat inputImage = cv::imread("testImage.png", cv::IMREAD_GRAYSCALE);

// Convert to double
cv::Mat fImage; 
inputImage.convertTo(fImage, CV_64F); 

// Initialize the vector with the image content
std::vector<double> actualImage(fImage.begin<double>(), fImage.end<double>());

对于 3 个频道,您可以执行以下操作:

cv::Mat inputImage = cv::imread("testImage.png");
cv::Mat fImage; 

inputImage.convertTo(fImage, CV_64F); 
fImage = fImage.reshape(1); // You need to reshape to single channel
std::vector<double> actualImage(fImage.begin<double>(), fImage.end<double>());