Оценка GeometricTransform не возвращает статус

В справочной системе Matlab об оценке AsseticsTransform говорится, что эта функция может возвращать статус, если у нее есть какая-либо ошибка (например, входы matchedPoints1 и matchedPoints2 не содержат достаточного количества точек.) Это должно быть написано так:

[___,status] = estimateGeometricTransform(matchedPoints1,matchedPoints2,transformType) 

Но в моем случае это не работает.

 [tform, status] = estimateGeometricTransform(matchedBoxPoints, matchedScenePoints, ...
     'projective');

После этой команды я использую оператор IF для проверки статуса, и если он не равен единице, мне нужно выполнить несколько команд. Но я просто получаю сообщение об ошибке в консоли:MATCHED_POINTS1 и MATCHED_POINTS2 не имеют достаточно очков. и программа останавливается.

В чем дело?

video = 'sample.avi';
hVideoSource = vision.VideoFileReader(video, 'ImageColorSpace', 'Intensity');
hVideoOut = vision.VideoPlayer('Name', 'Detected Box');     

boxImage = imread('cross2.jpg');
boxImage = rgb2gray(boxImage);

boxPoints = detectSURFFeatures(boxImage, 'NumOctaves', 10, 'NumScaleLevels', 15);
figure; imshow(boxImage);
title('100 Strongest Feature');
hold on;
plot(boxPoints.selectStrongest(100));

while ~isDone(hVideoSource)
    sceneImage = step(hVideoSource);
    sceneImage = imadjust(sceneImage);
bw = edge(sceneImage,'canny', 0.15, 2);
bw = imfill(bw,'holes');
se = strel('disk',1); 
bw = imopen(bw,se);
[B,L] = bwboundaries(bw);
stats = regionprops(L,'Centroid','EquivDiameter');
for k = 1:length(B)
 boundary = B{k};
 radius = stats(k).EquivDiameter/2;
 xc = stats(k).Centroid(1);
 yc = stats(k).Centroid(2);
 theta = 0:0.01:2*pi;
 Xfit = radius*cos(theta) + xc;
 Yfit = radius*sin(theta) + yc;

 if (radius > 10)
     rect = [xc-radius yc-radius radius*2 radius*2];
     croppedImage = imcrop(sceneImage, rect);
     rgbImage = cat(3,sceneImage,sceneImage,sceneImage);
     rgbImage = insertShape(rgbImage, 'Circle', [xc yc radius], 'Color', 'green');
     rgbImage = insertShape(rgbImage, 'Rectangle', rect, 'Color', 'yellow');    
 end

end
scenePoints = detectSURFFeatures(croppedImage, 'NumOctaves', 10, 'NumScaleLevels', 15);


    [boxFeatures, boxPoints] = extractFeatures(boxImage, boxPoints);
    [sceneFeatures, scenePoints] = extractFeatures(croppedImage, scenePoints);
    boxPairs = matchFeatures(boxFeatures, sceneFeatures);
    matchedBoxPoints = boxPoints(boxPairs(:, 1), :);
    matchedScenePoints = scenePoints(boxPairs(:, 2), :);


[tform, ~, ~, status] = estimateGeometricTransform(matchedBoxPoints, matchedScenePoints, ...
     'affine');
if (status ~= 1)
boxPolygon = [1, 1;...                           % top-left
        size(boxImage, 2), 1;...                 % top-right
        size(boxImage, 2), size(boxImage, 1);... % bottom-right
        1, size(boxImage, 1);...                 % bottom-left
        1, 1];                   % top-left again to close the polygon
    newBoxPolygon = transformPointsForward(tform, boxPolygon);

Poly = [newBoxPolygon(1,1) newBoxPolygon(1,2) newBoxPolygon(2,1) newBoxPolygon(2,2) ...
        newBoxPolygon(3,1) newBoxPolygon(3,2) newBoxPolygon(4,1) newBoxPolygon(4,2)...
        newBoxPolygon(5,1) newBoxPolygon(5,2)];

croppedImage = cat(3,croppedImage,croppedImage,croppedImage);
croppedImage = insertShape(croppedImage, 'Polygon', Poly, 'Color', 'green');
imshow(croppedImage);
else
croppedImage = cat(3,croppedImage,croppedImage,croppedImage);
croppedImage = insertText(croppedImage, [0 0], 'NO', 'TextColor', 'red');
imshow(croppedImage);
end

step(hVideoOut, rgbImage);
croppedImage = rgb2gray(croppedImage);
end
release(hVideoSource);
release(hVideoOut);

1 ответ

Решение

Есть другие дополнительные выходы до status:

[tform,inlierpoints1,inlierpoints2]  = estimateGeometricTransform(...)

То, как вы вызываете функцию, status на самом деле содержит inlierPoints1,

Что нужно сделать, чтобы получить статус и не дать функции выдать ошибку, это:

[tform, ~, ~, status] = estimateGeometricTransform(matchedBoxPoints, matchedScenePoints, ...
     'projective');

Лучше проверить количество очков перед звонком estimateGeometricTransform,

if size(boxPairs, 1) >= 3
   tform = estimateGeometricTransform(..., 'affine')
else
   % skip this frame
end

Для проективного, используйте 4 вместо 3.

Другие вопросы по тегам