Java 将OpenCv DCT转换为Android
我正在尝试在Android中实现一个DCT代码。我正在使用代码进行测试,但只是更改为DCT而不是DFT:。多亏了timegalore,代码发生了变化。现在我无法将图像转换回BGRJava 将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
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);