orx-kinect refactoring + new general orx-depth-camera (#257)
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
package org.openrndr.extra.kinect.v1.demo
|
||||
|
||||
import org.openrndr.Fullscreen
|
||||
import org.openrndr.application
|
||||
import org.openrndr.draw.Filter
|
||||
import org.openrndr.draw.colorBuffer
|
||||
import org.openrndr.draw.filterShaderFromCode
|
||||
import org.openrndr.extra.depth.camera.DepthMeasurement
|
||||
import org.openrndr.extra.depth.camera.calibrator.DepthCameraCalibrator
|
||||
import org.openrndr.extra.depth.camera.calibrator.isolatedWithCalibration
|
||||
import org.openrndr.extra.gui.GUI
|
||||
import org.openrndr.extra.kinect.v1.Kinect1
|
||||
|
||||
/**
|
||||
* How to use [DepthCameraCalibrator] with [Kinect1]?
|
||||
*/
|
||||
fun main() = application {
|
||||
configure {
|
||||
fullscreen = Fullscreen.CURRENT_DISPLAY_MODE
|
||||
}
|
||||
program {
|
||||
|
||||
val kinect = extend(Kinect1())
|
||||
val device = kinect.openDevice()
|
||||
val camera = device.depthCamera
|
||||
// depth measurement in meters is required by the calibrator
|
||||
camera.depthMeasurement = DepthMeasurement.METERS
|
||||
val kinectResolution = camera.resolution
|
||||
|
||||
val outputBuffer = colorBuffer(
|
||||
kinectResolution.x,
|
||||
kinectResolution.y
|
||||
)
|
||||
|
||||
// simple visual effect applied to kinect data
|
||||
val spaceRangeExtractor = SpaceRangeExtractor()
|
||||
camera.onFrameReceived { frame ->
|
||||
spaceRangeExtractor.apply(frame, outputBuffer)
|
||||
}
|
||||
val calibrator = DepthCameraCalibrator(this, camera)
|
||||
|
||||
val gui = GUI()
|
||||
calibrator.addControlsTo(gui)
|
||||
|
||||
/*
|
||||
Note: remember that extend(gui) has to be called after all the parameter
|
||||
controls are added.
|
||||
|
||||
Also extensions are rendered in reverse order, if we start with gui,
|
||||
it will not be covered by calibrator view when calibrator is enabled
|
||||
*/
|
||||
extend(gui)
|
||||
|
||||
/*
|
||||
if it's an interactive installation, probably we don't want to
|
||||
show GUI on startup. It can be shown by pressing F11.
|
||||
*/
|
||||
gui.visible = false
|
||||
|
||||
/*
|
||||
Registering this callback here after gui will prevent it from
|
||||
being triggered multiple times when GUI parameters are restored
|
||||
on startup.
|
||||
*/
|
||||
calibrator.onCalibrationChange { calibration ->
|
||||
spaceRangeExtractor.minDepth = calibration.minDepth
|
||||
spaceRangeExtractor.maxDepth = calibration.maxDepth
|
||||
}
|
||||
extend(calibrator)
|
||||
camera.enabled = true
|
||||
|
||||
extend {
|
||||
val calibration = calibrator.getCalibration(camera)
|
||||
drawer.isolatedWithCalibration(calibration) {
|
||||
image(
|
||||
colorBuffer = outputBuffer,
|
||||
position = calibration.position,
|
||||
width = calibration.width,
|
||||
height = calibration.height
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// switching calibrator view on and off with keyboard
|
||||
program.keyboard.keyDown.listen {
|
||||
if (it.name == "k") {
|
||||
calibrator.enabled = !calibrator.enabled
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A visual effect applied to kinect data in this demonstration.
|
||||
* Everything is black, except for the white pixels within the range
|
||||
* of 2 virtual walls positioned at [minDepth] at front of the
|
||||
* viewer and [maxDepth] behind the viewer.
|
||||
*/
|
||||
class SpaceRangeExtractor : Filter(filterShaderFromCode("""
|
||||
uniform sampler2D tex0; // kinect raw
|
||||
uniform float minDepth;
|
||||
uniform float maxDepth;
|
||||
out vec4 o_color;
|
||||
void main() {
|
||||
ivec2 uv = ivec2(gl_FragCoord.xy);
|
||||
float depth = texelFetch(tex0, uv, 0).r;
|
||||
float luma = ((depth >= minDepth) && (depth <= maxDepth)) ? 1.0 : 0.0;
|
||||
o_color = vec4(vec3(luma), 1.0);
|
||||
}
|
||||
""".trimIndent(),
|
||||
"space range extractor"
|
||||
)) {
|
||||
var minDepth: Double by parameters
|
||||
var maxDepth: Double by parameters
|
||||
}
|
||||
Reference in New Issue
Block a user