Считайте сообщения ROS 2 Изображений в Simulink® и Выполните Регистрацию с помощью Соответствия Функции

В этом примере показано, как считать ROS 2 sensor_msgs/Image сообщения в Simulink® и выполняют регистрацию изображений с помощью функции, соответствующей, чтобы оценить относительное вращение одного изображения относительно другого. Этот пример требует Computer Vision Toolbox®.

Настройте сеть ROS 2

Загрузите два демонстрационных 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)

Считайте сообщения из Сети ROS 2 в Simulink и Выполните Регистрацию Изображений

Откройте модель.

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 изображение.

Функция MATLAB для Регистрации Изображений с помощью Соответствия Функции

Эта модель использует алгоритм в ExampleHelperRegisterAndEstimateTransform Функция MATLAB, чтобы выполнить регистрацию изображений и относительную оценку преобразования, состоя из этих шагов:

  1. Обнаружьте и извлеките функции ORB и соответствующие актуальные вопросы в двух изображениях с помощью detectORBFeatures (Computer Vision Toolbox) и extractFeatures (Computer Vision Toolbox).

  2. Найдите соответствия кандидата и соберите фактические соответствующие местоположения точки от обоих изображения с помощью matchFeatures (Computer Vision Toolbox).

  3. Оцените относительное геометрическое преобразование между двумя изображениями наряду с inliers использование estimateGeometricTransform2D (Computer Vision Toolbox), который реализует демонстрационное согласие M-средства-оценки (MSAC), вариант согласия случайной выборки (RANSAC) алгоритм.

  4. Вычислите и выведите относительное вращение от предполагаемого геометрического преобразования.

Для получения дополнительной информации об обнаружении локального признака и экстракции, такой как различные виды анализаторов, смотрите Обнаружение Локального признака и Экстракцию (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
Для просмотра документации необходимо авторизоваться на сайте