Как рассчитать расстояние от камеры до объекта с помощью панели инструментов CV?

Я создал собственный детектор объектов, который работает довольно хорошо, но я получаю NaN для всех значений в моей матрице. Я обнаружил это после отладки кода, и ограниченная область на моем изображении показывает метры NaN. Я использовал код из Matlab для вычисления расстояния, но я не знаю, является ли это общим методом вычисления расстояния. Ниже приведен код.

points3D = reconstructScene(disparityMapBM,stereoParams);
points3D = points3D ./ 1000;
trainingData = objectDetectorTrainingData(gTruth);
myAFCdetector = trainACFObjectDetector(trainingData,'NumStages',5, 'NegativeSamplesFactor',2);

img = imread('Right_Image.jpg');

[bboxes,scores] = detect(myAFCdetector,img);

for i = 1:length(scores)
   annotation = sprintf('Confidence = %.1f',scores(i));
   I1 = insertObjectAnnotation(img,'rectangle',bboxes(i,:),annotation);
end

figure
imshow(I1)

centroids = [round(bboxes(:, 1) + bboxes(:, 3) / 2), ...
    round(bboxes(:, 2) + bboxes(:, 4) / 2)];

% Find the 3-D world coordinates of the centroids.
centroidsIdx = sub2ind(size(disparityMapBM), centroids(:, 2), centroids(:, 1));
X = points3D(:, :, 1);
Y = points3D(:, :, 2);
Z = points3D(:, :, 3);
centroids3D = [X(centroidsIdx)'; Y(centroidsIdx)'; Z(centroidsIdx)'];

% Find the distances from the camera in meters.
dists = sqrt(sum(centroids3D .^ 2));

% Display the detected people and their distances.
labels = cell(1, numel(dists));
for i = 1:numel(dists)
    labels{i} = sprintf('%0.2f meters', dists(i));
end
figure;
imshow(insertObjectAnnotation(I1, 'rectangle', bboxes, labels));
title('Detected People');

Я обнаружил матрицу NaN в centroids3D. Может ли быть какая-то причина, по которой я заполняю эту матрицу NaN?

Centoids3D = [Nan NaN NaN NaN; Nan NaN NaN NaN; Nan NaN NaN NaN]

person Community    schedule 22.01.2020    source источник
comment
Проверяли ли вы, как выглядят ваши 3D-точки (значения внутри points3D)? Возможно, они содержат недопустимые точки. Они рассчитываются из карты несоответствий, которая может быть зашумленной (и даже содержать несколько нулей, что означало бы бесконечное расстояние). Если все ваши 3D-точки верны (без NaN), вам следует проверить индексы (centroidsIdx), которые вы используете для выбора 3D-точек из каждого 2D-центроида.   -  person sowlosc    schedule 23.01.2020
comment
centroids содержит двойную матрицу 4x2, а centroidsIdx содержит двойную матрицу 4x1, но значения довольно большие: 298760, 434672, 482956, 474044. Я до сих пор не могу понять это. Могу ли я сделать некоторую фильтрацию после карты несоответствия. Возможно, это может изменить результаты   -  person    schedule 24.01.2020


Ответы (1)


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

Вот полное руководство для справки .

person iDilip    schedule 23.01.2020