Как синхронизировать датчики цвета и глубины Kinect с помощью Matlab? - PullRequest
0 голосов
/ 04 июня 2019

Мой образовательный проект посвящен распознаванию жестов рук с использованием Kinect. Я использую Kinect для XBox One & адаптер.

Я записал видео цвета и глубины из kinect, используя следующий код: (По аналогии с тем, чтосказал здесь )

clc
clear all
close all

imaqreset

%Call up dicertory containing utility functions
utilpath = fullfile(matlabroot, 'toolbox', 'imaq', 'imaqdemos', 'html', 'KinectForWindows');
addpath(utilpath);

%Create the videoinput objects for the colour and depth streams
colourVid = videoinput('kinect', 1, 'BGR_1920x1080');
depthVid = videoinput('kinect', 2, 'Depth_512x424');


depthSource = getselectedsource(depthVid);
depthSource.EnableBodyTracking = 'on';

%------------------------------------------------
%setting up record
%------------------------------------------------

% set the data streams to logging mode and to disk
set(colourVid, 'LoggingMode', 'Disk&Memory');
set(depthVid, 'LoggingMode', 'Disk&Memory');

%Set a video timeout property limit to 50 seconds 
set(colourVid, 'Timeout',50);
set(depthVid, 'Timeout',50);

%Creat a VideoReader object
colourLogfile = VideoWriter('colourTrial5.avi', 'Uncompressed AVI');
depthLogfile = VideoWriter('depthTrial5.mj2', 'Archival');

%configure the video input object to use the VideoWriter object
colourVid.DiskLogger = colourLogfile;
depthVid.DiskLogger = depthLogfile;

%set the triggering mode to 'manual'
triggerconfig([colourVid depthVid], 'manual');

%set the FramePerTrigger property of the VIDEOINPUT objects to 100 to
%acquire 100 frames per trigger.
set([colourVid depthVid], 'FramesPerTrigger', 100);


%------------------------------------------------
%Initiating the aquisition
%------------------------------------------------

%Start the colour and depth device. This begins acquisition, but does not
%start logging of acquired data
start([colourVid depthVid]);

pause(20); %allow time for both streams to start

%Trigger the devices to start logging of data.
trigger([colourVid depthVid]);

%Retrieve the acquired data
[colourFrameData, colourTimeData, colourMetaData] = getdata(colourVid);
[depthFrameData, depthTimeData, depthMetaData] = getdata(depthVid);


skeletonData = depthMetaData; %making copy of data 
save('skeletonData.mat','skeletonData')


stop([colourVid depthVid])

Но когда я воспроизводю видео, совершенно очевидно, что два видео цвета и глубины записываются не точно одновременно.моя текущая реализация имеет задержку между двумя датчиками (почти 1 секунду!) Кажется, что датчик цвета начал работать, перед датчиком глубины, а затем, после 100 кадров, он перестает работать перед датчиком глубины.Я хотел бы, чтобы оба датчика были синхронизированы так, чтобы видео с каждого датчика было в один и тот же момент.

Почему это происходит ??Кто-нибудь может предложить решение?

любые решения будут оценены.спасибо.

1 Ответ

0 голосов
/ 06 июня 2019

Глядя на ваш код, я думаю, что он правильно захватывает, но захватывает несколько кадров и запускает их воспроизведение? Это может быть проверено, если вы сохраняете изображения с временными метками вместо видео напрямую (чтобы увидеть, есть ли повторяющиеся кадры). Поэтому вы должны установить FramePerTrigger следующим образом:

set([colourVid depthVid], 'FramesPerTrigger', 1);

В качестве альтернативы, вы можете использовать небольшую утилиту , которую я сделал некоторое время назад; но это сохраняет изображения с метками времени. Вы можете изменить сохранение видео в соответствии с приложенным кодом. Надеюсь, это поможет.

...