2017-08-07 10 views
0

私のコードから3つ以上の値が得られているようですが、3つの値、H、S、Vがあるとしますか?私は何を間違えたのですか?OpenCV Java、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])); 
      } 



     } 

が出力:

私は技術的に唯一の3つの値、Hを取得すると仮定してるにもかかわらず、Log.eを使用して印刷値の多くを得ます、 S & V.

enter image description here

答えて

1

HSV値を印刷していません。

data変数は、size変数の値が正しく計算されていないため、元の画像のピクセル数にチャンネル数を掛けたセル数の2倍の配列です。その配列を反復処理して各反復で各要素を出力するので、channels * width * height値を出力します。

あなたはセンター内の1つのピクセルのHSV値を取得したい場合は、ちょうどこの操作を行います。

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

を今すぐ配列は、あなたがしたい3つの値が含まれています。これに代えて

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

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

また、おそらくあなたはこれをやってみたかったです

関連する問題