2014-04-07 87 views
0

我正試圖在Android中實現DCT代碼。我正在使用代碼進行測試,但只是更改爲DCT而不是DFT:Convert OpenCv DFT example from C++ to Android。由於時間的關係,代碼已經發生了變化。現在我遇到問題,將圖像轉換回BGR。將OpenCv DCT轉換爲Android

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

我不知道我該怎麼辦,請大家指教。非常感激你的幫助!

回答

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

哈哈感謝注意到,。但它現在拋出我這個異常:無效cv :: dct(cv :: InputArray,cv :: OutputArray,int),文件/ home/reports/ci中的斷言失敗(類型== CV_32FC1 || type == CV_64FC1) slave_desktop/50-SDK/opencv/modules/core/src/dxt.cpp,第2281行 我假設cvType是錯的吧? – yukilynn

+0

我已更新答案 - 請參閱您的想法。 – timegalore

+0

感謝您的更新。但我仍然得到這個:斷言失敗(類型== CV_32FC1 ||類型== CV_64FC1)在無效cv :: dct(cv :: InputArray,cv :: OutputArray,int),文件/ home/reports/ci/slave_desktop /50-SDK/opencv/modules/core/src/dxt.cpp,第2281行。我需要做些什麼來解決它? – yukilynn