def convert_opencv_to_texture(frame): if frame is None: return Texture() buf1 = cv2.flip(frame, 0) buf = buf1.tostring() image_texture = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='bgr') image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte') return image_texture
def init_camera(self): self._release_camera() self._android_camera = Camera.open(self._index) params = self._android_camera.getParameters() width, height = self._resolution zoom = self._zoom # edit by ableity focusmode = self._focusmode # edit by lilei params.setPreviewSize(width, height) params.setFocusMode(focusmode) #edit by lilei params.setZoom(zoom) # edit by ableity self._android_camera.setParameters(params) # self._android_camera.setDisplayOrientation() self.fps = 30. pf = params.getPreviewFormat() assert (pf == ImageFormat.NV21) # default format is NV21 self._bufsize = int( ImageFormat.getBitsPerPixel(pf) / 8. * width * height) self._camera_texture = Texture(width=width, height=height, target=GL_TEXTURE_EXTERNAL_OES, colorfmt='rgba') self._surface_texture = SurfaceTexture(int(self._camera_texture.id)) self._android_camera.setPreviewTexture(self._surface_texture) self._fbo = Fbo(size=self._resolution) self._fbo['resolution'] = (float(width), float(height)) self._fbo.shader.fs = ''' #extension GL_OES_EGL_image_external : require #ifdef GL_ES precision highp float; #endif /* Outputs from the vertex shader */ varying vec4 frag_color; varying vec2 tex_coord0; /* uniform texture samplers */ uniform sampler2D texture0; uniform samplerExternalOES texture1; uniform vec2 resolution; void main() { vec2 coord = vec2(tex_coord0.y * ( resolution.y / resolution.x), 1. -tex_coord0.x); gl_FragColor = texture2D(texture1, tex_coord0); } ''' with self._fbo: self._texture_cb = Callback( lambda instr: self._camera_texture.bind) Rectangle(size=self._resolution)
def start_preview(self, resolution): if self.java_camera_device is None: raise ValueError( "Camera device not yet opened, cannot create preview stream") if resolution not in self.supported_resolutions: raise ValueError( "Tried to open preview with resolution {}, not in supported resolutions {}" .format(resolution, self.supported_resolutions)) if self.preview_active: raise ValueError( "Preview already active, can't start again without stopping first" ) logger.info( "Creating capture stream with resolution {}".format(resolution)) self.preview_resolution = resolution self._prepare_preview_fbo(resolution) self.preview_texture = Texture(width=resolution[0], height=resolution[1], target=GL_TEXTURE_EXTERNAL_OES, colorfmt="rgba") logger.info("Texture id is {}".format(self.preview_texture.id)) self.java_preview_surface_texture = SurfaceTexture( int(self.preview_texture.id)) self.java_preview_surface_texture.setDefaultBufferSize(*resolution) self.java_preview_surface = Surface(self.java_preview_surface_texture) self.java_capture_request = self.java_camera_device.createCaptureRequest( CameraDevice.TEMPLATE_PREVIEW) self.java_capture_request.addTarget(self.java_preview_surface) self.java_capture_request.set( CaptureRequest.CONTROL_AF_MODE, ControlAfMode.CONTROL_AF_MODE_CONTINUOUS_PICTURE.value ) # CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE) self.java_capture_request.set(CaptureRequest.CONTROL_AE_MODE, ControlAeMode.CONTROL_AE_MODE_ON.value ) # CaptureRequest.CONTROL_AE_MODE_ON) self.java_surface_list = ArrayList() self.java_surface_list.add(self.java_preview_surface) self.java_camera_device.createCaptureSession( self.java_surface_list, self._java_capture_session_java_callback, _global_handler, ) return self.preview_fbo.texture
def new_sample(self, appsink): sample = self.appsink.emit('pull-sample') buf = sample.get_buffer() tex_id = glstuff.get_texture_id_from_buffer(ctypes.c_void_p(hash(buf))) if not tex_id == self.old_tex_id: self.old_tex_id = tex_id texture = texture_map.get(tex_id) if not texture: texture = Texture(1920, 1080, self.texture_target, colorfmt='rgba', texid=tex_id) texture.flip_vertical() texture_map[tex_id] = texture self.image.texture = texture