2017-08-07 108 views
0

我似乎從下面的代碼中獲得了超過3個值,只有假設是3個值,H,S和V?我做錯了什麼?OpenCV Java,Read HSV中心像素的值

代碼:

if (getIntent().hasExtra("byteArray")) { 

      bitmap = BitmapFactory.decodeByteArray(getIntent().getByteArrayExtra("byteArray"), 0, getIntent().getByteArrayExtra("byteArray").length); 

      int width= bitmap.getWidth(); 
      int height=bitmap.getHeight(); 

      int centerX=width/2; 
      int centerY=height/2; 
      srcMat = new Mat(); 
      Utils.bitmapToMat(bitmap, srcMat); 
      //Imgproc.cvtColor(srcMat, matHSV, Imgproc.COLOR_BGR2HSV); 
      srcMat.convertTo(srcMat, CvType.CV_64FC3); //http://answers.opencv.org/question/14961/using-get-and-put-to-access-pixel-values-in-java/ 
      int size = (int) (srcMat.total() * srcMat.channels()); 
      Mat matHSV = new Mat(); 
      Utils.bitmapToMat(bitmap, matHSV); 
      double[] data = new double[size]; 

      srcMat.get(centerX, centerY, data); 
      for (int i = 0; i < size; i++){ 
       data[i] = (data[i]/2); // no more casting required. 
       Log.e("HSV Values:", String.valueOf(data[i])); 
      } 



     } 

輸出:

我得到了很多使用Log.e打印值的,即使我在技術上想只得到3個值,H,小號&五

enter image description here

回答

1

您未打印HSV值。

您的data變量是一個雙精度數組,其單元的數量等於原始圖像的像素數乘以通道數,因爲您已經錯誤地計算出size變量的值。您正在遍歷該數組並在每次迭代中打印其每個元素,因此您正在打印channels * width * height值。

如果你想在中心的單一像素的HSV值,只是這樣做:

double[] data = srcMat.get(centerX, centerY); 

現在數組包含你想要的3個值。

或者,也許你想做到這一點:

int size = (int) (srcMat.channels()); 

取而代之的是:

int size = (int) (srcMat.total() * srcMat.channels());