Преобразование существующего инфракрасного изображения Kinect RGB в массив расстояний - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть снимок экрана инфракрасного выхода Kinect, использующего OpenKinect на Mac.

Infrared test image

Я бы хотел посчитать расстояние от зеленой стены до оранжевых столбов. Меня беспокоит только один размерный массив, скажем, у = 240 (по горизонтальному центру изображения).

Я пытался использовать MarvinJ для преобразования изображения в оттенки серого и сохранения значения цвета в массив, но я быстро обнаружил, что это не тот способ, потому что целочисленные значения цвета изображения в оттенках серого очень похожи и недостаточно хорошо представляют глубину.

<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Greyscale Test</title>
</head>

<body>

    <script src="https://www.marvinj.org/releases/marvinj-0.9.js"></script>
<script>
    image = new MarvinImage();
    image.load("ir_test.png", imageLoaded);


function imageLoaded() {
    var imageOut = new MarvinImage(image.getWidth(), image.getHeight());
    var image2 = new MarvinImage(image.getWidth(), image.getHeight());
    Marvin.invertColors(image, image2);
    Marvin.invertColors(image2, imageOut);
    var y = 240;
    var colour_array = [];
    for (var x = 0; x < imageOut.getWidth(); x++) { // For loop to loop through the x-axis

        var colour = imageOut.getIntComponent0(x, y);
        colour_array.push(colour);

    }

    document.getElementById('colour_array_div').innerHTML = colour_array;
}
</script>
    <div id="colour_array_div"></div>

</body>
</html>

Я пытаюсь понять, как преобразовать цвет в расстояние, предпочтительно в миллиметрах.

1 Ответ

0 голосов
/ 20 апреля 2019

В итоге я преобразовал каждый пиксель в их шестнадцатеричные значения RGB, а затем преобразовал шестнадцатеричное значение в десятичное число.

Это дало мне диапазон значений от 0 до 16777215.

Я скопировал вывод в файл CSV, затем обработал значение каждого пикселя в Excel. Я преобразовал десятичное значение цвета в расстояние в метрах.

Я обнаружил, что диапазон датчика глубины Kinect составляет 0,8–3,5 м [https://openkinect.org/wiki/Imaging_Information]

Я преобразовал десятичное значение в значение метра, используя ответ на этот вопрос: Имя функции Excel, чтобы отобразить одно соотношение в другое

значение / (inhi-inlo) * (outhi-outlo) + outlo

Вот график вывода:

Output graph

Код, который я использовал для создания массива десятичных значений цвета:

<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Colour Test</title>
</head>

<body>

    <script src="https://www.marvinj.org/releases/marvinj-0.9.js"></script>
<script>
    image = new MarvinImage();
    image.load("ir_test.png", imageLoaded);


function imageLoaded() {
    var imageOut = new MarvinImage(image.getWidth(), image.getHeight());
    var image2 = new MarvinImage(image.getWidth(), image.getHeight());
    Marvin.invertColors(image, image2);
    Marvin.invertColors(image2, imageOut);
    var y = 240;
    var colour_array = [];
    for (var x = 0; x < imageOut.getWidth(); x++) { // For loop to loop through the x-axis

        var red = imageOut.getIntComponent0(x, y);
        var green = imageOut.getIntComponent1(x, y);
        var blue = imageOut.getIntComponent2(x, y);
        var hex_colour = rgbToHex(red,green,blue);
        var colour = parseInt(hex_colour, 16); ///87210/kak-preobrazovat-desyatichnoe-v-shestnadtsaterichnoe-v-javascript
        colour_array.push(colour);

    }

    document.getElementById('colour_array_div').innerHTML = colour_array;
}

//https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb
function componentToHex(c) {
    var hex = c.toString(16);
    return hex.length == 1 ? "0" + hex : hex;
}

function rgbToHex(r, g, b) {
    return componentToHex(r) + componentToHex(g) + componentToHex(b);
}



</script>
    <div id="colour_array_div"></div>

</body>
</html>
...