Оценка 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.