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 данной картины, но это не удобный подход ...