OpenCV / C++ - 将图像转换为双精度矢量以进行 FFT(快速傅立叶变换)
OpenCV / C++ - Convert image to vector of doubles for FFT (Fast Fourier Transform)
我正在尝试计算图像的 FFT(快速傅里叶变换)以使用频率来确定图像是否模糊。
我需要使用代码库中已有的自定义 FFT 算法。 FFT 算法需要 doubles
或 ints
的标准一维向量。我需要一种方法来读取图像,然后将其转换为双精度矢量,以便计算图像的 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>());
我正在尝试计算图像的 FFT(快速傅里叶变换)以使用频率来确定图像是否模糊。
我需要使用代码库中已有的自定义 FFT 算法。 FFT 算法需要 doubles
或 ints
的标准一维向量。我需要一种方法来读取图像,然后将其转换为双精度矢量,以便计算图像的 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>());