2013-04-15 129 views
2

任何機構請幫我理解如何在JavaCV中使用convertTo方法。我正在嘗試和尋找很多時間,沒有找到正確的答案。 所以我的問題是,當我嘗試從灰色圖像轉換爲CV_32F類型的墊子,並嘗試顯示它在Android屏幕它會給我沒有結果。這是我的源:在opencv java wrapper中使用convertTo方法

Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGBA2GRAY, 1); // dst is gray image 
    dst.convertTo(dst_f, CvType.CV_32F, 1./255, 0); //convert dst to CV_32F with optional scale 
    Imgproc.cvtColor(dst_f, src, Imgproc.COLOR_GRAY2RGBA, 4); // to display it in android before convert to bitmap 

我也試圖在OpenCV的C++與此代碼,並將其順利運行:

imshow("dst", image); 
    cvtColor(image, dst, CV_BGR2GRAY); 
    dst.convertTo(dst_f, CV_32F, 1.0/255, 0); 
    imshow("dst_f", dst_f); 

更新:

我想我錯了,當我嘗試顯示在android屏幕上在線圖像。我不知道如何顯示它,儘管我知道android需要4個頻道才能在屏幕上顯示圖像。但是當我將灰色轉換爲CV_32F圖像類型時,我嘗試使用與上面相同的代碼進行顯示,並且無需即可順利運行。

回答

3

一些研究和實驗後,我剛拿到手的黃金的答案,那就是:

的Android能在屏幕上只顯示4路圖像,所以你需要將其轉換爲4個通道(RGBA),但在轉換爲RGBA/BGRA之前,您必須將Mat圖像更改爲具有相同比例的CV_8U。只是看看下面這個例子:

Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGBA2GRAY, 1); 
dst.convertTo(dst_f, CvType.CV_32F, 1./255, 0);  
dst_f.convertTo(final, CvType.CV_8U, 255, 0); 
Imgproc.cvtColor(final, src, Imgproc.COLOR_GRAY2RGBA, 4); 

有了上面的代碼,你的代碼將在Android的屏幕完美,但它會給你一個破碎的畫面,如果你嘗試將其保存爲JPG圖像或其他圖像擴充。如果你想保存到SD卡,你可以使用這個來源:

Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2GRAY, 1); 
dst.convertTo(dst_f, CvType.CV_32F, 1.0/255, 0); // Convert Mat image to CV_32F and scale it to 1.0/255 
dst_f.convertTo(final, CvType.CV_32F, 255, 0); //Convert it Back to Default type before 
Imgproc.cvtColor(final, roi, Imgproc.COLOR_GRAY2RGB, 0); 
Imgproc.cvtColor(roi, roi, Imgproc.COLOR_RGB2RGBA, 0); 

首先是我自己的實驗,如果你想要問我什麼,我會回答一樣好,我可以。謝謝。希望這可以幫助他人很多