2012-11-06 475 views
0

上午上一個項目,需要ImagesPreview ImagesCamera那麼我必須計算圖像中的Blue平均計數的工作,我已經把圖像從快速攝像機(As Preview Images)。 圖像格式是NV21(真的不是在圖像格式的專家,所以我不知道他們爲什麼使用它)計算彩色攝像頭預覽

,這是我從Camera Preview Callback

public void onPreviewFrame(byte[] data, Camera camera) { 

     Camera.Parameters parameters = camera.getParameters(); 
     Size size = parameters.getPreviewSize(); 
     YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, 
       size.height, null); 
     Rect rectangle = new Rect(); 
     rectangle.bottom = size.height; 
     rectangle.top = 0; 
     rectangle.left = 0; 
     rectangle.right = size.width; 
     ByteArrayOutputStream out2 = new ByteArrayOutputStream(); 
     image.compressToJpeg(rectangle, 100, out2); 

     byte[] d = out2.toByteArray(); 
     Bitmap bitmap = BitmapFactory.decodeByteArray(d, 0, d.length); 
    } 

和讀取的圖像您看到我現在有Bitmap,並且我計劃通過讀取Bitmap像素然後處理Pixel by Pixel來確定圖像中的藍色,但同事說這種方式在某些情況下很重且很慢,並且不準確,而且和我必須將圖像中的藍色作爲墊子rix從硬件它自我,並不知道從哪裏開始(順便說一句,我的同事在iOS版本上工作),任何幫助將不勝感激。

回答

1

如果你正在使用opencv for android,你可以有一個簡單的本機調用(JNICALL)將位圖傳遞給函數jbyte *,然後在函數中使用 將其轉換爲BGR Mat myuv,mbgra; 012vcvtColor(myuv,mbgra,CV_YUV420sp2BGR,4);

然後拆分矩陣mbgra,之後發現沒有藍色像素是分割矩陣的二進制掩碼操作,因爲它的本地和你不會逐像素逐個查看它可能是快速的。

+0

我來看看,謝謝:) –