将 OpenCv DCT 转换为安卓



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

相关内容

  • 没有找到相关文章

最新更新