«Цвет» должен соответствовать количеству точек ввода при использовании pointCloud в MATLAB - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу создать 3D-карту из стереокамеры, чтобы проверить это, я использую два приведенных примера MATLAB:

  1. https://de.mathworks.com/help/vision/ref/estimatecameraparameters.html («Калибровка стереокамеры»)
  2. https://de.mathworks.com/help/vision/examples/depth-estimation-from-stereo-video.html

Я объединил эти два сценария в следующий:

% load left and right images
leftImages = imageDatastore(fullfile(toolboxdir('vision'),'visiondata', ...
    'calibration','stereo','left'));
rightImages = imageDatastore(fullfile(toolboxdir('vision'),'visiondata', ...
    'calibration','stereo','right'));

% calculate image points
[imagePoints,boardSize] = ...
  detectCheckerboardPoints(leftImages.Files,rightImages.Files);

% calculate world points
squareSize = 108;
worldPoints = generateCheckerboardPoints(boardSize,squareSize);


% calculate camera paramters
I = readimage(leftImages,1); 
imageSize = [size(I,1),size(I,2)];
stereoParams = estimateCameraParameters(imagePoints,worldPoints, ...
                                  'ImageSize',imageSize);


% get left and right image
frameLeftGray = imread(leftImages.Files{1});
frameRightGray = imread(rightImages.Files{1});
[frameLeftRect, frameRightRect] = ...
    rectifyStereoImages(frameLeftGray, frameRightGray, stereoParams);


% get disparity map    
disparityMap = disparity(frameLeftRect, frameRightRect);
figure;
imshow(disparityMap, [0, 128]);
title('Disparity Map');
colormap jet
colorbar

% create 3D Bar 
points3D = reconstructScene(disparityMap, stereoParams);

% Convert to meters and create a pointCloud object
points3D = points3D ./ 1000;

% This will fail
ptCloud = pointCloud(points3D, 'Color', frameLeftRect);

% Create a streaming point cloud viewer
player3D = pcplayer([-3, 3], [-3, 3], [0, 8], 'VerticalAxis', 'y', ...
    'VerticalAxisDir', 'down');

% Visualize the point cloud
view(player3D, ptCloud);

Однако, при выполнении, я буду встречен со следующей ошибкойсообщение:

Ошибка при использовании pointCloud / set.Color (строка 545) «Цвет» должен соответствовать количеству входных точек.

Ошибка в pointCloud (строка 151) this.Color= C;

Ошибка при оценке глубины (строка 45)просто хорошо.Я думаю, что это как-то связано с размерами изображения.Однако изменение его размера приведет к неправильным параметрам камеры.

Так есть ли другой способ исправить ошибку при наличии параметра "Цвет"?

Заранее спасибо

1 Ответ

0 голосов
/ 13 февраля 2019

Вы используете изображение в градациях серого в качестве входных данных, поэтому оно не совпадает с точками RGB.Создайте изображение RGB из изображения в оттенках серого и затем используйте его.

rgb = cat(3,frameRightRect,frameRightRect,frameRightRect);
ptCloud = pointCloud(points3D, 'Color', rgb);
...