我正在编写一个用于在MATLAB中检测基本形状的程序。 当我检测到形状时,我会评估它的方向,然后我旋转形状使其方向为零,然后我可以评估它的投影并指定它是什么。
问题是MATLAB函数:regionprops()
没有正确评估三角形的方向。
I = zeros(256,256);
pos_triangle = [64 64 128 192 128 128];
Is = insertShape(I, 'FilledPolygon', pos_triangle);
imshow(Is)
original = Is;
originalBW = im2bw(original);
figure; imshow(originalBW);
S = regionprops(originalBW,'All');
bwr=imrotate(originalBW,S.Orientation);
S2 = regionprops(bwr,'Centroid','Orientation');
figure;imshow(bwr);
我使用imrotate fnc旋转图像,我没有旋转问题,imrotate运行良好。问题在于计算方向[使用' regionprps()' fnc]的形象!例如:我想从这个位置转动三角形
http://postimg.org/image/4un4sc7pn/
取向值:-28.9621 所以我把它旋转28.9621度来改变它的位置到这个
http://postimg.org/image/x68opdrm3/
但输出是这样的:
http://postimg.org/image/yf15or8y3/
使用他们的方向(或图像的其他可能属性)
另一个例子:将位置从左上第二个三角形改为左上第一个三角形
答案 0 :(得分:2)
这是一种解决方法。请注意:
1)我没有计算机视觉系统工具箱,因此我无法使用insertShape
;相反,我使用fill
函数在图像中创建三角形,然后使用getframe
来获取实际图像。我想这与使用insertShape
相同。
2)我使用FilledArea
的'regionprops
'属性来检测三角形。当有一个形状时,这很容易,但如果有很多形状,你将不得不修改一些代码。
3)我执行的旋转等于-1 * regionprops给出的方向,使其恢复为0.你当然可以改变它。旋转的图像更大,以解释旋转。
以下是代码:
clear
clc
close all
I = zeros(256,256);
pos_triangle = [64 64 128 192 128 128];
xt = [64 128 128];
yt = [64 192 128];
%// Since I don't have the Computer Vision System Toolbox I use 'fill'.
%//Is = insertShape(I, 'FilledPolygon', pos_triangle);
imshow(I)
hold on
fill(xt,yt,'w')
hold off
原始三角形:
%// Create image using getframe.
hFrame = getframe(gca);
original = hFrame.cdata;
originalBW = im2bw(original(:,:,1));
%// Remove border of the image.
originalBW = imclearborder(originalBW);
figure;
imshow(originalBW);
S = regionprops(originalBW,'FilledArea','Orientation');
%// Find region filled with the most pixels: that's the shape.
[a,b] =max([S.FilledArea]);
%// Get corresponding orientation
Orientation = S(b).Orientation;
%// Rotate by the inverse of the orientation; I'm not sur that's what you
%// want but it looks OK.
bwr=imrotate(originalBW,-1*Orientation);
S2 = regionprops(bwr,'Centroid','Orientation');
figure;imshow(bwr);
旋转的三角形看起来像它的方向是0。:
希望有所帮助!
答案 1 :(得分:0)
我不是图像处理方面的专家,但实现轮换并不难。您唯一需要知道图像中心的东西。在Matlab中,左上角的图像中心。要围绕中心旋转对象,需要将每个点乘以旋转矩阵。让我们围绕图像中心旋转三角形。
clear
clc
close all
I = zeros(256,256);
pos_triangle = [64 64 128 192 128 128];
xt = [64 128 128];
yt = [64 192 128];
a = deg2rad(20);
R = [cos(a) -sin(a);
sin(a) cos(a)];
p1 = R*[64; 64]
p2 = R*[128; 192]
p3 = R*[128; 128]
% the rotated points
x1 = [p1(1) p2(1) p3(1)];
y1 = [p1(2) p2(2) p3(2)];
imshow(I)
hold on
fill(x1,y1,'r')
fill(xt,yt,'w')
hold off
结果现在
如果您想将其自身旋转,则需要将图像的中心转换为三角形的中心。这不是一个完整的解决方案,但我希望它有所帮助。