2016-01-12 25 views
0

以下两幅图像中的第一幅图像rgbaMat.bmpRGBA格式的5px*5px.bmp图像。此图像从SD卡使用Highgui.imread读出,然后使用Imgproc.cvtColor(rgbaMat, hsvMat, Imgproc.COLOR_BGR2HSV);导致hsvMat.bmp(第二图像)转换为HSV尝试更改像素的HSV颜色,并因此获得意想不到的颜色。为什么?

enter image description hereenter image description here

以下是在MS放大到100px*100px相同的图像画图,用于观看的目的。

enter image description hereenter image description here

然后执行以下代码后,我得到changedMat.bmp图像给出如下,随后其放大版本。

enter image description here

enter image description here

的问题是,我所期待的,当写代码是交替的像素应该有白色H=0, S=0, V=255)和(``)色调分别如可以检查in the HSV section on this website。但是我得到的是红色和黑色。

问题是为什么?我哪里错了?

public void doProcessing(View view) { 
    Mat rgbaMat = Highgui.imread("/mnt/sdcard/DCIM/rgbaMat.bmp"); 

    Mat hsvMat = new Mat(); 
    Imgproc.cvtColor(rgbaMat, hsvMat, Imgproc.COLOR_BGR2HSV); 
    Highgui.imwrite("/mnt/sdcard/DCIM/hsvMat.bmp", hsvMat);//check 

    int counter=1; 
    for (int firstCoordinate = 0; firstCoordinate<hsvMat.rows(); firstCoordinate++) { 
     for (int secondCoordinate = 0; secondCoordinate<hsvMat.cols(); secondCoordinate++) { 
      Log.i(TAG, "HAPPY " + Arrays.toString(hsvMat.get(firstCoordinate, secondCoordinate)));//check 

      double[] pixelChannels = hsvMat.get(firstCoordinate, secondCoordinate); 

      if (counter%2 != 0) { 
       pixelChannels[0]=0; 
       pixelChannels[1]=0; 
       pixelChannels[2]=255; 
      } else { 
       pixelChannels[0]=0; 
       pixelChannels[1]=0; 
       pixelChannels[2]=0; 
      } 

      hsvMat.put(firstCoordinate, secondCoordinate, pixelChannels); 

      counter++; 
      Log.i(TAG, "HAPPY PAPPY" + Arrays.toString(hsvMat.get(firstCoordinate, secondCoordinate)));//check 
     } 
    } 
    Highgui.imwrite("/mnt/sdcard/DCIM/matChanged.bmp", hsvMat);//check 
} 

.......................................... .................................................. .................................................. .....................


编辑:

上线#11#线28打印的Log.i语句出下面的输出,whi ch很好

01-12 13:46:44.445: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.445: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.445: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.445: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.445: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.446: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.446: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.446: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.446: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.446: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.446: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.447: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.447: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.447: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.447: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.447: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.448: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.448: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.448: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.448: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.448: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.448: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.448: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.448: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.448: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.448: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.449: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.449: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.449: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.450: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.450: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.450: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.450: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.450: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.450: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.451: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.451: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.451: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.451: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.451: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.451: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.452: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.452: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.452: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.452: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.452: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 
01-12 13:46:44.452: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0] 
01-12 13:46:44.452: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0] 
01-12 13:46:44.452: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0] 
01-12 13:46:44.452: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0] 

回答

0

只是为了检查,我转换的HSV用于像素到Android Color并记录使用

//CONVERTING HSV COLOR TO ANDROID COLOR 
//Step 1: Convert double[] to float[]. Step 2: Scale the float[]. STep 3: Use Android's HSVToColor method 
float[] channelsFloatArrayScaled = new float[3]; 
for (int i = 0; i < hsvMat.get(firstCoordinate, secondCoordinate).length; i++) { 
    if (i == 0) { 
     channelsFloatArrayScaled[i] = ((float) hsvMat.get(firstCoordinate, secondCoordinate)[i]) * 2;// TODO Wrap an ArrayIndexOutOfBoundsException wrapper 
    } else if (i == 1 || i == 2) { 
     channelsFloatArrayScaled[i] = ((float) hsvMat.get(firstCoordinate, secondCoordinate)[i])/255;// TODO Wrap an ArrayIndexOutOfBoundsException wrapper 
    } 
} 
int androidColor = Color.HSVToColor(channelsFloatArrayScaled); 
Log.i(TAG, "HAPPY PAPPY FAPPY" + androidColor);//check 

结果是-1并且在替代像素,这代表白色-1777216和Android颜色的值黑色。

因此,除了我不知道OpenCV在将图像写入SD卡时(最后的imwrite)所做的是什么都很好。