使用Python OpenCV从Kinect设备获取通道

1 投票
1 回答
5770 浏览
提问于 2025-04-18 03:38

我写了一些简单的Python代码,用来从OpenNI设备获取不同的通道。我自己编译了OpenCV,并且启用了所有的PrimeSense和OpenNI支持。OpenNI的示例在Kinect传感器和PrimeSense传感器上都能完美运行,OpenCV的示例也能很好地测试OpenNI的支持(./cpp-example-openni_capture)。

这是我写的代码。

import cv2
import cv2.cv as cv

capture = cv2.VideoCapture(cv.CV_CAP_OPENNI)
capture.set(cv.CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, cv.CV_CAP_OPENNI_VGA_30HZ)

print capture.get(cv.CV_CAP_PROP_OPENNI_REGISTRATION)

while True:
    if not capture.grab():
        print "Unable to Grab Frames from camera"
        break
    okay1, depth_map = capture.retrieve(cv.CV_CAP_OPENNI_DEPTH_MAP)
    if not okay1:
        print "Unable to Retrieve Disparity Map from camera"
        break
    okay2, gray_image = capture.retrieve(cv.CV_CAP_OPENNI_GRAY_IMAGE)
    if not okay2:
        print "Unable to retrieve Gray Image from device"
        break
    cv2.imshow("depth camera", depth_map)
    cv2.imshow("rgb camera", gray_image)
    if cv2.waitKey(10) == 27:
        break
cv2.destroyAllWindows()
capture.release()

所以一切运行得很好,但显示的结果并不是正确的通道……比如说,如果我想访问灰度图像通道和深度图通道,显示的两幅图像都是深度图。

是的,我尝试过访问其他通道,并且更改了OPENNI_IMAGE_GENERATOR_MODE。不幸的是,结果一直没有变化。无论我尝试什么,我总是得到相同的深度通道。depth_map-gray_image的结果是一幅全黑的图像。

就像我说的,C++的OpenCV OpenNI示例在Kinect传感器和PrimeSense传感器上都能完美运行。看起来可能是Python模块的问题,或者我做了什么很傻的事情。

编辑:在Ubuntu 12.04 LTS上运行。

谢谢你的帮助。
Drew

1 个回答

2

获取图像的方式是这样的(可以查看这个链接了解更多:http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture-retrieve):

Python: cv2.VideoCapture.retrieve([image[, channel]]) → retval, image

所以你需要传递两个值给这个获取函数。

我不太确定这里的image应该是什么,但传入一个占位符似乎可以正常工作。


例如,okay1, depth_map = capture.retrieve(0, cv.CV_CAP_OPENNI_DEPTH_MAP)
还有okay2, gray_image = capture.retrieve(0, cv.CV_CAP_OPENNI_GRAY_IMAGE)

撰写回答