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

时间:2019-04-18 15:47:29

标签: kinect openkinect

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

AudioClip.GetData

我想计算绿色墙壁和橙色柱子之间的距离。我只关心一个维数组,比如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>

我要解决的是如何将颜色转换为一定距离,最好以毫米为单位。

1 个答案:

答案 0 :(得分: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

  

value /(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); //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>