java - 将 OpenCv DCT 转换为 Android

标签 java android opencv image-processing

我正在尝试在 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/

相关文章:

java - 在没有事件的情况下检索 JavaFX 中的鼠标位置

java - Eclipse 的 JSON 库

android - 以编程方式结束android中的调用

java - 将 HashMap 存储在 SD 卡上

python-3.x - 在 Matplotlib 中使用百分比累积计数增强对比度

java - 如何获得频域中两个音频信号的比率?

java - 我的 JButtons 按下时不起作用

JAVA - 变量始终为空

python - Opencv在Python中检测四边形

python - 如何使用Python区分暗图像和亮图像?