尝试更改像素的HSV颜色,并因此获得意外的颜色。为什么?

时间:2016-01-12 07:18:48

标签: android opencv opencv3.0 hsv opencv4android

以下两张图片0x7c00 through 0x7e00中的第一张是rgbaMat.bmp格式的5px*5px .bmp张图片。该图片是使用RGBA从SD卡中读取的,然后使用Highgui.imread转换为HSV,生成Imgproc.cvtColor(rgbaMat, hsvMat, Imgproc.COLOR_BGR2HSV);(第二张图片):

enter image description here enter image description here

以下是在MS Paint中放大到hsvMat.bmp的相同图像,供观看之用。

enter image description here enter image description here

然后在执行以下代码后,我得到的图像100px*100px如下,后面是放大版本。

enter image description here

enter image description here

问题在于我在编写代码时所期望的是备用像素应该具有 white changedMat.bmp)和 black (` `)色调分别,可以检查in the HSV section on this website。但我得到的是红色和黑色。

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

H=0, S=0, V=255

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

编辑:

第11行和第28行的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 } 语句打印出以下输出,这是好的

Log.i

1 个答案:

答案 0 :(得分:0)

为了检查,我将像素的HSV转换为Android Color并使用

记录了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在替代像素中,代表白色和黑色。

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