2012-02-27 66 views
1

我遇到了使用Android OpenCV二進制文件裁剪圖像的問題。使用openCV裁剪圖像使用Android二進制文件的矩陣

這是我在做什麼,試圖裁剪圖像的左上象限:

Initialization { 
    mYuv = new Mat(mFrameSize.height + mFrameSize.height/2, mFrameSize.width, CvType.CV_8UC1); 
    mGraySubmat = mYuv.submat(0, mFrameSize.height, 0, mFrameSize.width); 
} 


processFrame(byte[] data) { 
    mYuv.put(0, 0, data); 
    Imgproc.cvtColor(mGraySubmat, mRgba, Imgproc.COLOR_GRAY2BGR, 4); 
    bmp = Bitmap.createBitmap(mFrameSize.width/2, mFrameSize.height/2, Bitmap.Config.ARGB_8888); 
    Rect roi = new Rect(0,0,mFrameSize.width/2,mFrameSize.height/2); 
    Mat faceMat = new Mat(mRgba,roi); 
    Utils.matToBitmap(faceMat.clone(), bmp);  

}

我得到的是亂碼圖像。我見過其他職位,說要做我在做什麼,但它不工作。實際上,圖像看起來像是在那裏,但也有不同比例的陰影圖像。

我可以手動做到這一點,它的工作文件 - 見下文。難道我做錯了什麼?

processFrame(byte[] data) { 

    for (int i = 0; i < frameSize; i++) { 
    int y = (0xff & ((int) data[i])); 
    rgba[i] = 0xff000000 + (y << 16) + (y << 8) + y; 
} 
// Example of cropping the upper left corder 
bmp = Bitmap.createBitmap(mFrameSize.width/2, mFrameSize.height/2, Bitmap.Config.RGB_565); 
bmp.setPixels(rgba, 0/* offset */, mFrameSize.width /* stride */, 0, 0, mFrameSize.width/2, mFrameSize.height/2); 
+0

這兩個來源不可比,因爲您不使用第一個數據。無論如何,你的位圖和數據的類型應該匹配。 – rics 2012-02-27 21:22:29

+0

對不起,我添加了缺件 – scoleman2272 2012-02-27 21:35:40

+0

我已提高您的問題,因爲在修改代碼後找不到工作解決方案。 – rics 2012-03-02 22:27:20

回答

0

我想你從this example開始。在這個原始來源中,您可以看到沒有Imgproc.COLOR_GRAY2BGR轉換。如果你想有一個彩色圖像,那麼你需要使用選擇二:

Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV420sp2RGB, 4); 

並且你不需要mGraySubmat。

如果需要灰度圖像,則首先選擇的是更好:

Imgproc.cvtColor(mGraySubmat, mRgba, Imgproc.COLOR_GRAY2RGBA, 4); 

這後一種選擇截斷default preview format的色度分量什麼是YCbCr_420_SP (NV21)格式的圖像。

+0

我已經分別使用了Imgproc.COLOR_YUV420sp2RGB和Imgproc.COLOR_YUV420sp2RGB分別用於彩色灰度。只要我不嘗試裁剪圖像,它們都能像預期的那樣工作。當我使用Mat faceMat = new Mat(mRgba,roi);裁剪圖像。那是扭曲的時刻 – scoleman2272 2012-02-28 16:36:17