Значения пикселей различаются между OpenCV JS и python - PullRequest
0 голосов
/ 01 апреля 2020

Context

Я пытаюсь сравнить базовое c выполнение кода между OpenCV python и OpenCV JS.
Я использую версию 4.2 для обеих библиотек, и OpenCV JS скомпилирован из источника.
Я сделал несколько снимков калибровочной шахматной доски с помощью своей веб-камеры в приложении Photo Booth (OSX).

Проблема

Если я прочитал первый пиксель одного из моих изображения с использованием следующего python кода:

import cv2 as cv

img = cv.imread('icc-problem.jpg')
rgbImg = cv.cvtColor(img, cv.COLOR_BGR2RGB)
print(rgbImg[0][0])

Я получаю [84 92 77]

Теперь, если я прочитаю тот же пиксель, используя следующий код HTML / JS:

<script type="text/javascript">
    const Module = { onRuntimeInitialized: onOpenCvReady };

    async function onOpenCvReady() {
        const img = new Image();
        img.src = 'icc-problem.jpg';
        img.onload = function () {
            const cvImg = cv.imread(img);
            console.log(cvImg.data.subarray(0, 3))
        };
    }
</script>
<script async src="./opencv.js" type="text/javascript"></script>

Я получаю [95, 103, 86], и результат отличается от подхода python.

Вы можете найти изображение с одним пикселем здесь: i cc -проблема .jpg и исходный код OpenCV JS здесь: opencv. js

Вопрос

Почему это происходит? Есть ли способ получить тот же вывод, используя python и JS версию?

Некоторые исследования

После нескольких тестов кажется, что проблема вызвана I CC profile встроить в мое изображение, созданное приложением Photo Booth. Для информации, я также веду себя так же, используя функцию «скриншот» моей ма c, но не в том случае, если я создаю изображение непосредственно из OpenCV. В более общем случае, если приложение создает профиль I CC, выходные данные отличаются.

Подход python, по-видимому, не применяет профиль I CC, тогда как подход JS делает. Я думаю, что проблема не в OpenCV, а в веб-браузере, который применяет профиль I CC к изображению перед вызовом imread.

С помощью специального инструмента c я могу удалить профиль I CC данной картины, но это не удобный подход ...

...