我正在尝试在Android中实现DCT代码。我正在使用代码进行测试,但只是更改为DCT而不是DFT:将OpenCv DFT示例从C++转换为Android。由于时间紧迫,代码发生了变化。现在我在将图像转换回 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 错误: 断言失败(深度 == CV_8U || 深度 == CV_16U || 深度 == CV_32F) 在 void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int), 文件/home/reports/ci/slave_desktop/50-SDK/opencv/modules/imgproc/src/color.cpp, 行 3642
我不确定我应该怎么做,请指教。非常感谢您的帮助!
你有这样一行:
image.convertTo(secondImage, CvType.CV_64FC1);
但是你不再使用第二图像,只是图像。尝试:
Imgproc.copyMakeBorder(secondImage, padded, 0, m - secondImage.rows(), 0, n - secondImage.cols(), Imgproc.BORDER_CONSTANT);
看看你过得怎么样。
此外,DCT 看起来仅适用于实数而不是像 DFT 这样的复数,因此您无需添加第二个通道来将虚部归零。您可以直接使用填充变量,因此:
Mat result = new Mat(padded.size(), padded.type());
然后
Core.dct(padded, result);
此外,原始图像必须是单通道的 - 因此是灰度。当您调用Highgui.imread时,将加载的图像是多通道的 - 在我的设备上,它是BGR格式的3通道。您可以使用Imgproc.cvtColor将其转换为灰度,但首先将其加载为灰度会更简单:
image = Highgui.imread(imageName, Highgui.CV_LOAD_IMAGE_GRAYSCALE);