我正在尝试在 Android 中实现 DCT 代码。我正在使用代码进行测试,但只是更改为 DCT 而不是 DFT:Convert OpenCv DFT example from C++ to Android 。感谢 timegalore,代码已发生更改。现在我在将图像转换回 BGR 时遇到问题。
public void transformImage(){
image = Highgui.imread(imageName, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
try {
secondImage = new Mat(image.rows(), image.cols(), CvType.CV_64FC1);
image.convertTo(secondImage, CvType.CV_64FC1);
int m = Core.getOptimalDFTSize(image.rows());
int n = Core.getOptimalDFTSize(image.cols()); // on the border add zero values
Mat padded = new Mat(new Size(n, m), CvType.CV_64FC1); // expand input image to optimal size
Imgproc.copyMakeBorder(secondImage, padded, 0, m - secondImage.rows(), 0, n - secondImage.cols(), Imgproc.BORDER_CONSTANT);
Mat result = new Mat(padded.size(), padded.type());
Core.dct(padded, result);
Mat transformedImage = new Mat(padded.size(), padded.type());
Core.idct(result, watermarkedImage);
completedImage = new Mat(image.rows(), image.cols(), CvType.CV_64FC1);
Imgproc.cvtColor(transformedImage, completedImage, Imgproc.COLOR_GRAY2BGR);
} catch (Exception e) {
Log.e("Blargh", e.toString());
}
}
现在,我收到了这个错误
04-09 21:35:52.362: E/cv::error()(23460): OpenCV Error: Assertion failed (depth == CV_8U || depth == CV_16U || depth == CV_32F) in void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int), file /home/reports/ci/slave_desktop/50-SDK/opencv/modules/imgproc/src/color.cpp, line 3642
我不知道该怎么办,请指教。非常感谢您的帮助!
最佳答案
你有这一行:
image.convertTo(secondImage, CvType.CV_64FC1);
但是你不再使用第二个图像,只是图像。尝试:
Imgproc.copyMakeBorder(secondImage, padded, 0, m - secondImage.rows(), 0, n - secondImage.cols(), Imgproc.BORDER_CONSTANT);
看看你进展如何。
此外,DCT 看起来只适用于实数,而不适用于 DFT 等复数,因此您不需要添加第二个 channel 来将虚部归零。您可以直接使用填充的变量,因此:
Mat result = new Mat(padded.size(), padded.type());
然后
Core.dct(padded, result);
此外,原始图像需要是单 channel 的 - 因此是灰度图像。当您调用 Highgui.imread 时,将加载的图像是多 channel 的 - 在我的设备上,它是 BGR 格式的 3 channel 。您可以使用 Imgproc.cvtColor 将其转换为灰度,但首先将其加载为灰度会更简单:
image = Highgui.imread(imageName, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
关于java - 将 OpenCv DCT 转换为 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22910047/