В этом примере показано, как считать ROS 2 sensor_msgs/Image
сообщения в Simulink® и выполняют регистрацию изображений с помощью функции, соответствующей, чтобы оценить относительное вращение одного изображения относительно другого. Этот пример требует Computer Vision Toolbox®.
Загрузите два демонстрационных sensor_msgs/Image
сообщения, imageMsg1
и imageMsg2
. Создайте узел ROS 2 с двумя издателями, чтобы опубликовать сообщения по темам /image_1
и /image2
. Для издателей, набор свойство Durability
качества сервиса (QoS) к
transientlocal
. Это гарантирует, что издатели обеспечивают сообщения для любых подписчиков, которые присоединяются после того, как сообщения были уже отправлены. Опубликуйте сообщения с помощью send
функция.
load('ros2ImageMsgs.mat'); node = ros2node('/image_test'); imgPub1 = ros2publisher(node,'/image1','sensor_msgs/Image','Durability','transientlocal'); imgPub2 = ros2publisher(node,'/image2','sensor_msgs/Image','Durability','transientlocal'); send(imgPub1,imageMsg1); send(imgPub2,imageMsg2); pause(5)
Откройте модель.
modelName = 'readImageAndEstimateTransformationExampleModel.slx';
open_system(modelName);
Убедитесь, что эти два Подписываются, блоки соединяются с темами, /image1
и /image2
. Значением Длительности параметр QoS Подписать блоков является Transient
local
. Это гарантирует совместимость с настройками QoS издателей, которых вы сконфигурировали в предыдущем разделе. Сообщения от подписчиков питаются блоки Чтения Изображений, чтобы извлечь данные изображения, которые затем питаются registerAndEstimateTransform
Блок MATLAB function, чтобы выполнить регистрацию с помощью соответствия функции.
Под вкладкой Simulation выберите ROS Toolbox> Variable Size Messages. Заметьте, что пределы значения по умолчанию Использования для этого типа сообщения ясны. Затем в Максимальном столбце длины проверьте что data
свойство sensor_msgs/Image
сообщение имеет значение, больше, чем количество пикселей в изображении (921600). Запустите модель.
sim(modelName);
Модель выполняет регистрацию изображений, оценивает 2D преобразование и отображает относительное вращение (градус) изображения, опубликованного на /image2
тема, относительно этого на /image1
. Это также визуализирует два изображения наряду с совпадающими точками inlier и /image2
изображение преобразовывается в представление /image1
изображение.
Эта модель использует алгоритм в ExampleHelperRegisterAndEstimateTransform
Функция MATLAB, чтобы выполнить регистрацию изображений и относительную оценку преобразования, состоя из этих шагов:
Обнаружьте и извлеките функции ORB и соответствующие актуальные вопросы в двух изображениях с помощью detectORBFeatures
(Computer Vision Toolbox) и extractFeatures
(Computer Vision Toolbox).
Найдите соответствия кандидата и соберите фактические соответствующие местоположения точки от обоих изображения с помощью matchFeatures
(Computer Vision Toolbox).
Оцените относительное геометрическое преобразование между двумя изображениями наряду с inliers использование estimateGeometricTransform2D
(Computer Vision Toolbox), который реализует демонстрационное согласие M-средства-оценки (MSAC), вариант согласия случайной выборки (RANSAC) алгоритм.
Вычислите и выведите относительное вращение от предполагаемого геометрического преобразования.
Для получения дополнительной информации об обнаружении локального признака и экстракции, такой как различные виды анализаторов, смотрите Обнаружение Локального признака и Экстракцию (Computer Vision Toolbox). Соответствие функции является также ключевым начальным шагом в Визуальных приложениях SLAM. Для обзора Визуального рабочего процесса SLAM с помощью MATLAB™ смотрите Реализацию Визуальный SLAM в MATLAB (Computer Vision Toolbox).
function rotAngleDeg = ExampleHelperRegisterAndEstimateTransform(img1,img2) %% %#codegen % Declare functions not supported for code generation as extrinsic coder.extrinsic('extractFeatures'); coder.extrinsic('showMatchedFeatures') coder.extrinsic('imshowpair'); % Initialize the transform tform = affine2d(single(eye(3))); %% Feature Detection and Extraction % Convert images to grayscale Igray1 = rgb2gray(img1); Igray2 = rgb2gray(img2); % Detect ORB features in two images pointsImage1 = detectORBFeatures(Igray1,'ScaleFactor',1.2,'NumLevels',8); pointsImage2 = detectORBFeatures(Igray2,'ScaleFactor',1.2,'NumLevels',8); % Select 1500 uniformly distributed points pointsImage1 = selectUniform(pointsImage1,1500,size(Igray1,1:2)); pointsImage2 = selectUniform(pointsImage2,1500,size(Igray2,1:2)); % Extract features from the two images [featuresImage1, validPointsImage1] = extractFeatures(Igray1,pointsImage1); [featuresImage2, validPointsImage2] = extractFeatures(Igray2,pointsImage2); %% Feature Matching % Find candidate matches indexPairs = matchFeatures(featuresImage1,featuresImage2,'Unique',true,'MaxRatio',0.6,'MatchThreshold',40); sz = size(indexPairs); % Find the matched feature point locations in both images matchedPointsImage1 = validPointsImage1(indexPairs(1:sz(1),1)); matchedPointsImage2 = validPointsImage2(indexPairs(1:sz(1),2)); %% Transform estimation % Estimate the transformation matrixbetween the two images based on matched points [tform,inlierIdx] = estimateGeometricTransform2D(matchedPointsImage2,matchedPointsImage1,'similarity'); % Compute the rotation angle from the transformation matrix cosVal = tform.T(1,1); sinVal = tform.T(2,1); rotAngleDeg = atan2d(sinVal,cosVal); % Remove all the outliers inliersImage1 = matchedPointsImage1(inlierIdx); inliersImage2 = matchedPointsImage2(inlierIdx); %% Visualize matched inliers and transformed image figure % subplot(2,1,1) showMatchedFeatures(img1,img2,inliersImage1,inliersImage2,'montage'); title('Matching points in Image 1 (left) and Image 2 (inliers only)') figure % subplot(2,1,2) outputView = imref2d(size(img1)); img3 = imwarp(img2,tform,'OutputView',outputView); imshowpair(img1,img3,'montage'); title('Image 2 (right) transformed to the view of Image 1') end