将现有的Kinect RGB红外图像转换为距离数组

问题描述 投票:0回答:1

我有一个在Mac上使用OpenKinect的Kinect红外输出的屏幕截图。

Infrared test image

我想计算绿墙和橙色柱子的距离。我只关心单维数组,比如说y = 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>

我正在努力解决的是如何将颜色转换为距离,最好是以毫米为单位。

kinect openkinect
1个回答
0
投票

我最终将每个像素转换为RGB十六进制值,然后将十六进制值转换为十进制数。

这给了我一系列0到16777215之间的值。

我将输出复制到CSV文件,然后处理Excel中每个像素的值。我将十进制颜色值转换为以米为单位的距离。

我发现Kinect深度传感器的范围是0.8m-3.5m [https://openkinect.org/wiki/Imaging_Information]

我使用这个问题的答案将小数值转换为米值:Excel Function name to map one ratio to another

值/(INHI-INLO)*(INHI-前景)+前景

这是输出图:

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); //https://stackoverflow.com/questions/57803/how-to-convert-decimal-to-hexadecimal-in-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>
© www.soinside.com 2019 - 2024. All rights reserved.