【问题标题】:Convert OpenCv DCT to Android将 OpenCv DCT 转换为 Android
【发布时间】:2014-05-19 13:20:48
【问题描述】:

我正在尝试在 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 错误:无效 cv 中的断言失败(深度 == CV_8U || 深度 == CV_16U || 深度 == CV_32F) ::cvtColor(cv::InputArray, cv::OutputArray, int, int),文件/home/reports/ci/slave_desktop/50-SDK/opencv/modules/imgproc/src/color.cpp,第3642行

我不知道我应该怎么做,请指教。非常感谢您的帮助!

【问题讨论】:

    标签: java android opencv image-processing


    【解决方案1】:

    你有这行:

    image.convertTo(secondImage, CvType.CV_64FC1);
    

    但是你不再使用 secondImage,只是图像。试试:

    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); 
    

    【讨论】:

    • 哈哈感谢您注意到这一点。但它现在向我抛出了这个异常:断言失败(类型 == CV_32FC1 || 类型 == CV_64FC1) in void cv::dct(cv::InputArray, cv::OutputArray, int), file /home/reports/ci/ slave_desktop/50-SDK/opencv/modules/core/src/dxt.cpp,第 2281 行我会假设 cvType 是错误的,对吧?
    • 感谢您的更新。但我仍然得到这个:断言失败(类型 == CV_32FC1 || 类型 == CV_64FC1)在 void cv::dct(cv::InputArray, cv::OutputArray, int), 文件 /home/reports/ci/slave_desktop /50-SDK/opencv/modules/core/src/dxt.cpp,第 2281 行。我需要做什么来修复它?
    • 我在原始答案的末尾添加了一些进一步的信息 - 看看你的进展情况。
    • 哦,我明白了。谢谢,我会试试看。如果我想将图像转换回 BGR 格式,是否可以?
    • 哦,是的,它有效!太感谢了! idct的流程会和这个一样吗?
    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2023-03-18
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多