我想写一个android程序来计算输入图像的dct,我正在使用opencv android框架。首先,我将输入图像转换为灰度,然后我想使用16 * 16块的Core.dct()来计算dct。这是dct计算部分:
int rownum = 1;
for (int i = 1; i <= M - B + 1; i++) {
for (int j = 1; j <= N - B + 1; j++) {
Mat SubImg = GrayImage.submat(new Range(i, i+B-1), new Range(j, j+B-1));
Mat Block_DCT = Mat.zeros(16, 16, SubImg.type());
Mat Block_DCT_Quantized = Mat.zeros(16, 16, Block_DCT.type());
Core.dct(SubImg, Block_DCT);
Core.divide(Block_DCT, SQ16, Block_DCT_Quantized);
Mat row = Mat.zeros(1, B*B, Block_DCT_Quantized.type());
Block_DCT_Quantized.reshape(1, B*B);
rownum=rownum+1;
}
}
我调试代码并弄清楚应用程序崩溃在Core.dct()行! 我不知道是什么问题,但我想这是因为输入类型...
任何人都可以帮助我吗?我该怎么办?
更新:
我找到了解决方案,问题是由于Mat对象的大小和类型,实际上Core.dct()方法只适用于这种类型Mat:cv_64fc1。我使用SubImg.convertTo()函数来更改类型并更正块的大小,所以它工作... 感谢Rui Marques回答...
答案 0 :(得分:0)
dct需要 float 输入。
在应用dct / dft之前,您必须将图像转换为CvType.CV_32F或CvType.CV_64F