在Matlab中确定三角形的方向

在Matlab中确定三角形的方向,matlab,image-processing,computer-vision,matlab-cvst,Matlab,Image Processing,Computer Vision,Matlab Cvst,我正在做一个项目,通过视觉识别在目标上自动执行四旋翼机着陆。我有代码通过HOG特征检测目标。现在的想法是找到等腰三角形,然后测量直线,这样我就可以确定方向。我试过霍夫,但没能成功 这是一个拟议的目标 ,它由一个圆内的等腰三角形组成。但是如果你能想出一个更好的,请告诉我 如果有什么不清楚的地方,请提问。多谢各位 更新1: @当我仅将目标作为图像处理时,McMa的想法很有效。代码如下: clc; close all; im=imread('target.bmp'); im=rgb2gray(im);

我正在做一个项目,通过视觉识别在目标上自动执行四旋翼机着陆。我有代码通过HOG特征检测目标。现在的想法是找到等腰三角形,然后测量直线,这样我就可以确定方向。我试过霍夫,但没能成功

这是一个拟议的目标

,它由一个圆内的等腰三角形组成。但是如果你能想出一个更好的,请告诉我

如果有什么不清楚的地方,请提问。多谢各位

更新1:

@当我仅将目标作为图像处理时,McMa的想法很有效。代码如下:

clc; close all;
im=imread('target.bmp');
im=rgb2gray(im);
im2=imcrop(im,[467.51 385.51 148.98 61.98]);
im2=imcomplement(im2);
im2=imrotate(im2,0);

s=regionprops(im2,'Area','Centroid','Extrema','Orientation');

[imH,imW]=size(im2);
if imH-s(end).Centroid(2) < imH/2
    state=1;        % Upright
else
    state=2;        % Upside down
end

imshow(im2);hold on
plot(s(end).Centroid(1), s(end).Centroid(2), 'b*')

if s(end).Orientation>0
    degrees=s(end).Orientation;
else
    degrees=s(end).Orientation+180;
end

if (0<degrees)&&(degrees<89.99) && state==2
    degrees=degrees+180;
elseif (90<degrees) && (degrees<179) && state==1
    degrees=degrees+180;
end

fprintf('The orientation is %g degrees\n',degrees)

我还尝试了其他方法,如欧拉数,但没有成功,我找不到任何正确的方法。

我想到了一个非常简单的解决方案。这可能有用。实际上我还没有试过,因为没有图像可以处理。因此,如果失败,请发布错误

假设:-您已过滤图像,并获得仅包含三角形“或”且具有均匀噪声的二值图像

  • 现在您可以拍摄0度图像(图像1)。过滤后得到二值图像(bw1)

  • 所以,当您试图降落您的四旋翼机时,拍摄图像(image2),将其转换为二进制(bw2)

  • 现在找到这两个图像之间的相关性{(bw1,bw2)}。将其存储在变量中

  • 以步进角度旋转图像。角度设为5度。{(bw2,5)}

  • 现在再次找出这两幅图像之间的相关性

  • 对所有角度都这样做

  • 方向应为相关性最大的角度(旋转次数*5)

  • 术语“最大值”表示,您可能不会发现相关性为1,因为这在很大程度上取决于您的过滤技术以获得完美的二值图像

    我也承认计算所有角度的相关性需要很高的计算速度和很长的时间。如果您没有很高的计算速度,这将很难实时实现。(在本例中,您可以查看)特别是parfor

    希望这对你有用。如果遇到任何错误,请发表评论

    最后祝你好运。很好的项目


    p.S.旋转图像时,根据二进制图像填充白色或黑色像素

    我认为最简单、最快的方法是找到目标并对图像进行二值化。然后使用
    regionprops()
    并读取“Orientation”属性以读取方向

    如果您不能使用该工具箱,则可以通过计算区域的协方差矩阵非常容易地实现该函数。如果你需要这方面的建议,请告诉我

    编辑:

    我很高兴这里有一些很好的矢量化函数;)因此,如果速度是头等大事,您可以轻松编写自己的
    regionprops()
    精简到最低限度,如下所示:

    function M=ImMoment(Image,ii,jj)
    
        ImSize=size(Image);
    
        K=repmat((1:ImSize(1))',1,ImSize(2)).^ii; 
        J=repmat(1:ImSize(2),ImSize(1),1).^jj;
        M=K.*J.*Image;
    
        M=sum(M(:));
    
    end
    
    对于图像和瞬间

    function [Matrix,Centroid,Angle]=CovMat(Image)
    
        Centroid=[ImMoment(Image,0,1)/ImMoment(Image,0,0),...
             ImMoment(Image,1,0)/ImMoment(Image,0,0)];
    
         Miu20=ImMoment(Image,0,2)/ImMoment(Image,0,0)-Centroid(1)^2;
         Miu02=ImMoment(Image,2,0)/ImMoment(Image,0,0)-Centroid(2)^2;
         Miu11=ImMoment(Image,1,1)/ImMoment(Image,0,0)-Centroid(1)*Centroid(2);
    
         Matrix=[Miu20,Miu11   %Covariance Matrix in case you need it for anything...
                 Miu11,Miu02];
    
         Angle=1/2*atand(2*Miu11/(Miu20-Miu02)); %Your orientation
    
    end
    
    为您的方向和协方差矩阵。更多关于它


    画面瞬间很有可能,玩得开心

    事实上,这并不十分清楚。你能发布没有成功的代码吗?发布一个到图片的链接,我们中的一个会编辑你的文章并上传它们。很抱歉,在多次尝试但没有对代码进行任何更改后,它突然起了作用。如果我有更多的问题,我会再次发布。谢谢大家谢谢你的想法,这很好,但我有一个主要问题,参考图像和裁剪检测到的图像将永远不会有相同的精确大小,因此相关性将不起作用。请检查我的更新。简单。使用imresize()函数并将其缩放到标准大小。实际上,我已经解决了方向问题。现在我很难找到四架直升机的摄像头是看到整个目标还是只看到小目标。这应该很容易,但我找不到任何方法。如果你能想到什么,请告诉我。谢谢谢谢你,它实际上适用于图像,但我不能使它适用于实时处理。请查看我的更新。如果速度是一个非常重要的因素,您可以通过自己计算图像矩和cov矩阵来修剪区域道具,看看我的编辑。编辑的回答问题通常不会引起太多注意。这件事最好找一个新的。请随时PM一个新问题的链接,我会看一看。谢谢你的提示,@McMa,我会这样做。嗨@McMa,我在定向方面仍然有问题。我试过你的方法,但没有给我想要的方向。请看一看:谢谢
    function [Matrix,Centroid,Angle]=CovMat(Image)
    
        Centroid=[ImMoment(Image,0,1)/ImMoment(Image,0,0),...
             ImMoment(Image,1,0)/ImMoment(Image,0,0)];
    
         Miu20=ImMoment(Image,0,2)/ImMoment(Image,0,0)-Centroid(1)^2;
         Miu02=ImMoment(Image,2,0)/ImMoment(Image,0,0)-Centroid(2)^2;
         Miu11=ImMoment(Image,1,1)/ImMoment(Image,0,0)-Centroid(1)*Centroid(2);
    
         Matrix=[Miu20,Miu11   %Covariance Matrix in case you need it for anything...
                 Miu11,Miu02];
    
         Angle=1/2*atand(2*Miu11/(Miu20-Miu02)); %Your orientation
    
    end