从垫子上读取时像素颜色的错误值

Wrong value of pixels color when reading from a mat

我最近在使用 Open CV 和 java 获取像素颜色时遇到了一些问题。这就是我所做的。

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    Mat a = Imgcodecs.imread("C:\Users\User\workspace\OpenCv\color.png",Imgcodecs.CV_LOAD_IMAGE_COLOR);
    System.out.println(Arrays.toString(getPixelColor(0, 0, a))); //top left
    System.out.println(Arrays.toString(getPixelColor(9, 0, a))); //top right
    System.out.println(Arrays.toString(getPixelColor(0, 9, a))); // bottom left 
    System.out.println(Arrays.toString(getPixelColor(9, 9, a))); // bottom right

所以这段代码returns下面

[255.0, 255.0, 0.0] //top left
[0.0, 0.0, 255.0] //top right
[255.0, 0.0, 0.0] // bottom left 
[0.0, 255.0, 255.0]// bottom right

这张图片是一张 10*10 的图片。

这是 photoshop 中每种颜色的正确值。

[0, 255.0, 255.0] Cyan //top left
[0.0, 0.0, 255.0] Blue //top right
[255.0, 0.0, 0.0] Red // bottom left 
[255.0, 255.0, 0] Yellow // bottom right

图像加载为 CV_8UC3 类型的垫子,所以它是 rbg。

有人知道为什么会这样吗? 此外,如果我使用 cvtColor 从 bgr -> rbg 进行更改,我仍然无法获得正确的输出

[0.0, 255.0, 255.0] Cyan ok //top left
[255.0, 0.0, 0.0] Should be blue  , is red //top right
[0.0, 0.0, 255.0] Should be red , is blue // bottom left
[255.0, 255.0, 0.0] Yellow ok // bottom right

首先,如果未指定顺序,OpenCV 倾向于使用 BGR 而不是 RGB。使用cvtColor将其从BGR更改为RGB是准确的。

其次,getPixelColor的调用参数不是(x, y),而是(row, column),相当于(y, x)。这意味着看似右上角的实际上是左下角,反之亦然。