Этот пример показывает, как преобразовать модель камеры подозрительного взгляда в модель крошечного отверстия и создать соответствующую монокулярную симуляцию датчика камеры. В этом примере вы изучаете, как калибровать камеру подозрительного взгляда и сконфигурировать объект monoCamera
.
Чтобы моделировать монокулярный датчик камеры, смонтированный в автомобиле, выполните эти шаги:
Оцените внутренние параметры камеры путем калибровки камеры с помощью шахматной доски. Внутренние параметры описывают свойства самой камеры подозрительного взгляда.
Оцените внешние параметры камеры путем калибровки камеры снова, использования той же шахматной доски от предыдущего шага. Внешние параметры описывают монтирующееся положение камеры подозрительного взгляда в системе координат автомобиля.
Удалите искажение изображения путем преобразования камеры подозрительного взгляда intrinsics к камере с точечной диафрагмой intrinsics. Эти intrinsics описывают синтетическую камеру с точечной диафрагмой, которая может гипотетически сгенерировать неискаженные изображения.
Используйте внутренние параметры камеры с точечной диафрагмой и внешние параметры, чтобы сконфигурировать монокулярный датчик камеры для симуляции. Можно затем использовать этот датчик, чтобы обнаружить контуры маршрута и объекты.
Чтобы оценить внутренние параметры, используйте шахматную доску для калибровки фотоаппарата. Также, чтобы лучше визуализировать результаты, используйте приложение Camera Calibrator. Для камеры подозрительного взгляда полезно поместить шахматную доску близко к камере в порядке получить большое значимое искажение в изображении.
% Gather a set of calibration images. images = imageDatastore(fullfile(toolboxdir('vision'), 'visiondata', ... 'calibration', 'gopro')); imageFileNames = images.Files; % Detect calibration pattern. [imagePoints, boardSize] = detectCheckerboardPoints(imageFileNames); % Generate world coordinates of the corners of the squares. squareSize = 0.029; % Square size in meters worldPoints = generateCheckerboardPoints(boardSize, squareSize); % Calibrate the camera. I = readimage(images, 1); imageSize = [size(I, 1), size(I, 2)]; params = estimateFisheyeParameters(imagePoints, worldPoints, imageSize);
Чтобы оценить внешние параметры, используйте ту же шахматную доску, чтобы оценить монтирующееся положение камеры в системе координат автомобиля. Следующий шаг оценивает параметры от одного изображения. Можно также взять несколько изображений шахматной доски, чтобы получить несколько оценок и составить в среднем результаты.
% Load a different image of the same checkerboard, where the checkerboard % is placed on the flat ground. Its X-axis is pointing to the right of the % vehicle, and its Y-axis is pointing to the camera. The image includes % noticeable distortion, such as along the wall next to the checkerboard. imageFileName = fullfile(toolboxdir('driving'), 'drivingdata', 'checkerboard.png'); I = imread(imageFileName); imshow(I) title('Distorted Checkerboard Image');
[imagePoints, boardSize] = detectCheckerboardPoints(I); % Generate coordinates of the corners of the squares. squareSize = 0.029; % Square size in meters worldPoints = generateCheckerboardPoints(boardSize, squareSize); % Estimate the parameters for configuring the monoCamera object. % Height of the checkerboard is zero here, since the pattern is % directly on the ground. originHeight = 0; [pitch, yaw, roll, height] = estimateMonoCameraParameters(params.Intrinsics, ... imagePoints, worldPoints, originHeight);
% Undistort the image and extract the synthetic pinhole camera intrinsics. [J1, camIntrinsics] = undistortFisheyeImage(I, params.Intrinsics, 'Output', 'full'); imshow(J1) title('Undistorted Image');
% Set up monoCamera with the synthetic pinhole camera intrinsics. % Note that the synthetic camera has removed the distortion. sensor = monoCamera(camIntrinsics, height, 'pitch', pitch, 'yaw', yaw, 'roll', roll);
Теперь можно подтвердить monoCamera
путем графического вывода вида с высоты птичьего полета.
% Define bird's-eye-view transformation parameters distAheadOfSensor = 6; % in meters spaceToOneSide = 2.5; % look 2.5 meters to the right and 2.5 meters to the left bottomOffset = 0.2; % look 0.2 meters ahead of the sensor outView = [bottomOffset, distAheadOfSensor, -spaceToOneSide, spaceToOneSide]; outImageSize = [NaN,1000]; % output image width in pixels birdsEyeConfig = birdsEyeView(sensor, outView, outImageSize); % Transform input image to bird's-eye-view image and display it B = transformImage(birdsEyeConfig, J1); % Place a 2-meter marker ahead of the sensor in bird's-eye view imagePoint0 = vehicleToImage(birdsEyeConfig, [2, 0]); offset = 5; % offset marker from text label by 5 pixels annotatedB = insertMarker(B, imagePoint0 - offset); annotatedB = insertText(annotatedB, imagePoint0, '2 meters'); figure imshow(annotatedB) title('Bird''s-Eye View')
График выше показов, что камера измеряет расстояния точно. Теперь можно использовать монокулярную камеру для объекта и обнаружения контура маршрута. Смотрите, что Визуальное Восприятие Использует Монокулярный пример Камеры.
detectCheckerboardPoints
| estimateFisheyeParameters
| estimateMonoCameraParameters
| generateCheckerboardPoints
| undistortFisheyeImage