Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Use Kinect with OpenCV (Python)
import cv2
import sys
class Camera(object):
def __init__(self, index=0):
self.cap = cv2.VideoCapture(index)
self.openni = index in (cv2.CAP_OPENNI, cv2.CAP_OPENNI2)
self.fps = 0
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
self.release()
def release(self):
if not self.cap: return
self.cap.release()
self.cap = None
def capture(self, callback, gray=True):
if not self.cap:
sys.exit('The capture is not ready')
while True:
t = cv2.getTickCount()
if self.openni:
if not self.cap.grab():
sys.exit('Grabs the next frame failed')
ret, depth = self.cap.retrieve(cv2.CAP_OPENNI_DEPTH_MAP)
ret, frame = self.cap.retrieve(cv2.CAP_OPENNI_GRAY_IMAGE
if gray else cv2.CAP_OPENNI_BGR_IMAGE)
if callback:
callback(frame, depth, self.fps)
else:
ret, frame = self.cap.read()
if not ret:
sys.exit('Reads the next frame failed')
if gray:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
if callback:
callback(frame, self.fps)
t = cv2.getTickCount() - t
self.fps = cv2.getTickFrequency() / t
# esc, q
ch = cv2.waitKey(10) & 0xFF
if ch == 27 or ch == ord('q'):
break
def fps(self):
return self.fps
def get(self, prop_id):
return self.cap.get(prop_id)
def set(self, prop_id, value):
self.cap.set(prop_id, value)
if __name__ == '__main__':
callback = lambda gray, fps: cv2.imshow('gray', gray)
with Camera(0) as cam:
print("Camera: %dx%d, %d" % (
cam.get(cv2.CAP_PROP_FRAME_WIDTH),
cam.get(cv2.CAP_PROP_FRAME_HEIGHT),
cam.get(cv2.CAP_PROP_FPS)))
cam.capture(callback)
cv2.destroyAllWindows()
import cv2
FONT_FACE = cv2.FONT_HERSHEY_SIMPLEX
FONT_SCALE = 1
THICKNESS = 1
class Gravity:
TOP_LEFT = 1
TOP_RIGHT = 2
BOTTOM_LEFT = 3
BOTTOM_RIGHT = 4
def put_text(img, text, gravity, margin=10):
h, w = img.shape[:2]
# getTextSize, result: ((width, height), baseline)
x, y = cv2.getTextSize(text, FONT_FACE, FONT_SCALE, THICKNESS)[0];
# putText(img, text, org, fontFace, fontScale, color, thickness, lineType)
org = {
Gravity.TOP_LEFT: (margin, margin+y),
Gravity.TOP_RIGHT: (w-margin-x, margin+y),
Gravity.BOTTOM_LEFT: (margin, h-margin),
Gravity.BOTTOM_RIGHT: (w-margin-x, h-margin),
}.get(gravity, (margin, margin+y))
cv2.putText(img, text, org, FONT_FACE, FONT_SCALE,
(255,255,255), THICKNESS, cv2.LINE_AA)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import cv2
import numpy as np
from common.camera import Camera
from common.draw import Gravity, put_text
def main():
def callback(frame, depth, fps):
# Normalize the depth for representation
min, max = depth.min(), depth.max()
depth = np.uint8(255 * (depth - min) / (max - min))
# Unable to retrieve correct frame, it's still depth here
put_text(frame, "{1}x{0}".format(*frame.shape), Gravity.TOP_LEFT)
put_text(depth, "{1}x{0}".format(*depth.shape), Gravity.TOP_LEFT)
put_text(depth, "%.1f" % fps, Gravity.TOP_RIGHT)
cv2.imshow('frame', frame)
cv2.imshow('depth', depth)
with Camera(cv2.CAP_OPENNI2) as cam:
print("Camera: %dx%d, %d" % (
cam.get(cv2.CAP_OPENNI_IMAGE_GENERATOR + cv2.CAP_PROP_FRAME_WIDTH),
cam.get(cv2.CAP_OPENNI_IMAGE_GENERATOR + cv2.CAP_PROP_FRAME_HEIGHT),
cam.get(cv2.CAP_OPENNI_IMAGE_GENERATOR + cv2.CAP_PROP_FPS)))
cam.capture(callback, False)
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
# Using Kinect and other OpenNI compatible depth sensors:
# http://docs.opencv.org/master/d7/d6f/tutorial_kinect_openni.html
# OpenCV Python unable to access correct OpenNI device channels:
# https://github.com/opencv/opencv/issues/4735
@joinAero

This comment has been minimized.

Copy link
Owner Author

@joinAero joinAero commented May 19, 2017

C++ code is here.

Unable to retrieve correct image using Python code now. Please see this issue.

Extra Links:

@aradhana29

This comment has been minimized.

Copy link

@aradhana29 aradhana29 commented Sep 24, 2019

self.openni = index in (cv2.CAP_OPENNI, cv2.CAP_OPENNI2) returning false for my windows please help me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.