我在windows中使用带有OpenCV的PyKinect来保存RGB和kinect深度图像。它可以很好地同时显示RGB和深度图像。RGB和深度图像的帧率均为30FPS。
我想保存.jpg格式的RGB图像和.xml格式的深度图像。这也很好用。
但我的问题是,当我开始保存RGB和深度图像时,我得不到相同的帧率。例如,如果我将图像保存10秒,我会得到300个XML文件,但同时我会得到100个JPG图像。
但是如果我执行相同的程序只保存RGB图像(注释掉深度图像部分) 10秒,我会得到300个JPG文件。所以我相信这是一个可以改进的性能问题。任何改善性能的建议都是值得赞赏的。
以下是我的方法:
from pykinect import nui
from pykinect.nui import JointId
import numpy
from numpy import *
import cv2
import datetime
import os
import os.path
from os.path import join as pjoin
from pykinect.nui import SkeletonTrackingState
current_directory = os.getcwd()
kinect = nui.Runtime()
save_image = False
def getColorImage(frame):
height,width = frame.image.height,frame.image.width #get width and height of the images
rgb = numpy.empty((height,width,4),numpy.uint8)
frame.image.copy_bits(rgb.ctypes.data) #copy the bit of the image to the aray
cv2.imshow('KINECT Video Stream', rgb) # display the image
# save to Folder
folder = 'RGB_images'+'\\s'+ subject_id +'_a' +activity_id
if not os.path.exists(folder):
os.makedirs(folder)
path = current_directory+str('\\')+folder
image_name = 'color_image_'+str(frame.frame_number)+'.jpg'
if save_image:
cv2.imwrite(os.path.join(path,image_name), rgb)
def getDepthImage(frame):
height,width = frame.image.height,frame.image.width #get frame height and width
depth_frame = saveDepthImageData(frame.frame_number)
depth = numpy.empty((height,width,1),numpy.uint8)
arr2d = (depth >> 3) & 4095
arr2d >>= 4
frame.image.copy_bits(arr2d.ctypes.data)
cv2.imshow('KINECT depth Stream', arr2d)
folder = 'Depth_data'+'\\s'+ subject_id +'_a' +activity_id
if not os.path.exists(folder):
os.makedirs(folder)
path = current_directory+str('\\')+folder
file_name = 'depth_image_'+str(frame.frame_number)+'.xml'
file_to_save = os.path.join(path,file_name)
if save_image:
f = cv2.FileStorage(file_to_save,flags=1)
f.write("depthImg",arr2d)
f.release() #close the file
def main():
global save_image
global subject_id
global activity_id
subject_id = raw_input("Subject id : ")
activity_id = raw_input("Activity id : ")
print "Press t to start saving"
print "Press Esc to quit"
kinect.video_frame_ready += getColorImage
kinect.video_stream.open(nui.ImageStreamType.Video, 2,nui.ImageResolution.Resolution640x480,nui.ImageType.Color)
cv2.namedWindow('KINECT Video Stream', cv2.WINDOW_AUTOSIZE)
kinect.depth_frame_ready += getDepthImage
kinect.depth_stream.open(nui.ImageStreamType.Depth, 2, nui.ImageResolution.Resolution320x240, nui.ImageType.Depth)
cv2.namedWindow('KINECT depth Stream', cv2.WINDOW_AUTOSIZE)
while True:
key = cv2.waitKey(0)
if key == 116:
save_image = not save_image
if key == 27:
cv2.destroyAllWindows()
kinect.close()
break
if __name__ == '__main__':
main()发布于 2018-11-15 18:42:54
将深度图像转换为XML将大大增加其大小。Kinect深度图像是640x480 IIRC,而不是为每个像素指定一个11位的值,XML将平均使用每像素10个字节,这意味着每帧大约3.5MB,然后仅就磁盘I/O而言,您的代码就必须写出接近100MB/s的值(不包括整个XML转换)。
我建议使用另一种格式来保存深度图像,可能像PGM这样的简单格式会是一个好主意。
https://stackoverflow.com/questions/53316667
复制相似问题