Java 将OpenCv DCT转换为Android

Java 将OpenCv DCT转换为Android,java,android,opencv,image-processing,Java,Android,Opencv,Image Processing,我正在尝试在Android中实现一个DCT代码。我正在使用代码进行测试,但只是更改为DCT而不是DFT:。多亏了timegalore,代码发生了变化。现在我无法将图像转换回BGR public void transformImage(){ image = Highgui.imread(imageName, Highgui.CV_LOAD_IMAGE_GRAYSCALE); try { secondImage = new Mat(image.rows(), image.cols

我正在尝试在Android中实现一个DCT代码。我正在使用代码进行测试,但只是更改为DCT而不是DFT:。多亏了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错误:断言失败(depth==cv|8U | | depth==cv|16U | | depth==cv|32F)无效cv::cvtColor(cv::InputArray,cv::OutputArray,int,int),file/home/reports/ci/slave|/desktop/50-SDK/OpenCV/modules/imgproc/src/color.cpp,第3642行

我不知道该怎么办,请告诉我。非常感谢你的帮助

您有这样一行:

image.convertTo(secondImage, CvType.CV_64FC1);
但是,您不再使用secondImage,只使用image。尝试:

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());
然后

此外,原始图像需要是单通道的,因此需要灰度。当您调用Highgui.imread时,将加载的图像是多通道的-在我的设备上是BGR格式的3通道。您可以使用Imgproc.cvtColor将其转换为灰度,但首先将其加载为灰度会更简单:

image = Highgui.imread(imageName, Highgui.CV_LOAD_IMAGE_GRAYSCALE); 

哈哈,谢谢你注意到这一点。但是现在它给我带来了一个例外:断言失败(type==CV_32FC1 | | type==CV_64FC1)在void CV::dct(CV::InputArray,CV::OutputArray,int),file/home/reports/ci/slave_desktop/50-SDK/opencv/modules/core/src/dxt.cpp,第2281行,我假设cvType是错误的,对吗?谢谢更新。但我仍然得到这样的结论:在void CV::dct(CV::InputArray,CV::OutputArray,int),file/home/reports/ci/slave_desktop/50-SDK/opencv/modules/core/src/dxt.cpp,第2281行,断言失败(type==CV|32FC1 | type==CV 64FC1)。我需要做些什么来修复它?我在原始答案的末尾添加了一些进一步的信息-看看你进展如何。哦,我明白了。谢谢,我会试试的。如果我想将图像转换回BGR格式,是否可能?哦,是的,它可以工作!非常感谢你!idct的过程是否与此相同?
image = Highgui.imread(imageName, Highgui.CV_LOAD_IMAGE_GRAYSCALE);