我有一个在Mac上使用OpenKinect的Kinect的红外输出的屏幕截图。
我想计算绿色墙壁和橙色柱子之间的距离。我只关心一个维数组,比如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>
我要解决的是如何将颜色转换为一定距离,最好以毫米为单位。
答案 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
这是输出的图形:
我用来生成十进制颜色值数组的代码是:
<!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>