Spaces:
Runtime error
Runtime error
| import cv2 | |
| import base64 | |
| import numpy as np | |
| _viewer_html = ''' | |
| <html> | |
| <head> | |
| <style> | |
| body { | |
| overflow: hidden; | |
| margin: 0; | |
| } | |
| </style> | |
| <script> | |
| var image_url = "{{{image_url_marker}}}"; | |
| var depth_url = "{{{depth_url_marker}}}"; | |
| var blah; | |
| function getImageData( image ) { | |
| var canvas = document.createElement( 'canvas' ); | |
| canvas.width = image.width; | |
| canvas.height = image.height; | |
| var context = canvas.getContext( '2d' ); | |
| context.drawImage( image, 0, 0 ); | |
| return context.getImageData( 0, 0, image.width, image.height ); | |
| } | |
| window.onload = (e) => { | |
| var scene = new THREE.Scene(); | |
| scene.background = new THREE.Color( 0xffffff ); | |
| var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000); | |
| camera.position.set(0, 0, 2); | |
| var renderer = new THREE.WebGLRenderer({ | |
| antialias: true | |
| }); | |
| renderer.setSize(window.innerWidth, window.innerHeight); | |
| document.body.appendChild(renderer.domElement); | |
| //var controls = new THREE.OrbitControls(camera, renderer.domElement); | |
| var controls = new THREE.OrbitControls(camera, renderer.domElement); | |
| var reset = document.getElementById('reset') | |
| reset.addEventListener('click', e => controls.reset()) | |
| function vertexShader() { | |
| return document.getElementById("vshader").text | |
| } | |
| function fragmentShader() { | |
| return document.getElementById("fshader").text | |
| } | |
| var texture = new THREE.TextureLoader().load(image_url, t => { | |
| var w = t.image.width; | |
| var h = t.image.height; | |
| var max = Math.max(w, h); | |
| var ar = w / h; | |
| blah = getImageData(t.image); | |
| console.log('texture:', getImageData(t.image).data) | |
| var planeGeometry = new THREE.PlaneGeometry(w / max, h / max, w, h); | |
| var depth = new THREE.TextureLoader().load(depth_url); | |
| uniforms = { | |
| image: { type: "t", value: texture }, | |
| depth: { type: "t", value: depth }, | |
| ar: { type: 'f', value: ar } | |
| } | |
| let planeMaterial = new THREE.ShaderMaterial({ | |
| uniforms: uniforms, | |
| fragmentShader: fragmentShader(), | |
| vertexShader: vertexShader(), | |
| side: THREE.DoubleSide | |
| }); | |
| var points = new THREE.Points(planeGeometry, planeMaterial) | |
| points.position.set(0, 0, 0) | |
| scene.add(points) | |
| render(); | |
| }); | |
| function render() { | |
| requestAnimationFrame(render); | |
| renderer.render(scene, camera); | |
| } | |
| } | |
| </script> | |
| </head> | |
| <body> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/three@0.132.2/examples/js/controls/OrbitControls.js"></script> | |
| <!--script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script--> | |
| <script id="vshader" type="x-shader/x-vertex"> | |
| uniform sampler2D depth; | |
| uniform float ar; | |
| varying vec3 vUv; | |
| vec3 pos; | |
| void main() { | |
| vUv = position; | |
| pos = position; | |
| pos.z = texture2D(depth,(vec2(vUv.x,vUv.y*ar)+0.5)).r; | |
| float s = 2.0 - pos.z; | |
| pos.x = pos.x * s; | |
| pos.y = pos.y * s; | |
| vec4 modelViewPosition = modelViewMatrix * vec4(pos, 1.0); | |
| gl_Position = projectionMatrix * modelViewPosition; | |
| gl_PointSize = 2.0; | |
| } | |
| </script> | |
| <script id="fshader" type="x-shader/x-fragment"> | |
| uniform sampler2D image; | |
| uniform float ar; | |
| varying vec3 vUv; | |
| void main() { | |
| gl_FragColor = texture2D(image,(vec2(vUv.x,vUv.y*ar)+0.5)); | |
| } | |
| </script> | |
| <div style="position:absolute"> | |
| <button id="reset">Reset</button> | |
| </div> | |
| </body> | |
| </html> | |
| ''' | |
| image_url_marker = '{{{image_url_marker}}}' | |
| depth_url_marker = '{{{depth_url_marker}}}' | |
| def depthviewer2html(image,depth): | |
| image_rgb = cv2.cvtColor(np.array(image), cv2.COLOR_BGR2RGB) | |
| _, buffer = cv2.imencode('.jpg',image_rgb) | |
| image_data_url = 'data:image/jpeg;base64,'+base64.b64encode(buffer).decode('utf-8') | |
| _, buffer = cv2.imencode('.png',np.array(depth)) | |
| mask_data_url = 'data:image/png;base64,'+base64.b64encode(buffer).decode('utf-8') | |
| vhtml = str(_viewer_html).replace(image_url_marker,image_data_url).replace(depth_url_marker,mask_data_url) | |
| e = base64.b64encode(bytes(vhtml,'utf-8')).decode('utf-8') | |
| url = f'data:text/html;base64,{e}' | |
| h = f'<iframe src="{url}" height="600" width="100%"></iframe>' | |
| return h |