2015-01-30 3 views
2

타겟에서 시각적 인식을 통해 4 중주의 착륙을 자동으로 수행하는 프로젝트를 진행하고 있습니다. 호그 기능을 통해 표적을 탐지하는 코드가 있습니다. 이제 아이디어는 이등변 삼각형을 찾고 그 방향을 결정할 수 있도록 선을 측정하는 것입니다. 나는 Hough를 시도했지만 성공할 수는 없습니다.Matlab에서 삼각형의 방향을 결정합니다.

대상이 제시 한

Target이며, 원 내부 이등변 삼각형이 구성된다. 그러나 당신이 더 나은 것을 생각할 수 있다면 저에게 알려주십시오.

불명확 한 점이 있으면 언제든지 문의하십시오. 대단히 감사합니다

업데이트 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) 

업데이트 2 :

가 지금은 또 다른 문제가 : 나는 카메라가 전체 대상 또는 단지 작은 원 + 삼각형을보고 여부를 어떻게 든 알 필요가이 코드입니다. 나는 방향을 계산하기 전에 이것을 필요로한다.

많은 옵션을 사용해 보았습니다. 예를 들어, 원의 수를 계산하려고 했으므로 2 인 경우 큰 표적을, 1이 있으면 작은 표를 봅니다. 그러나 그들은 잘 감지되지 않습니다. 내가 감수성을 가지고 노는 경우에도, 그것은 강력한 방법이 될 수 없습니다.

이미지 : https://www.dropbox.com/s/7mbpna3xfquq5n7/P0016.bmp?dl=0 Classifer는 : https://www.dropbox.com/s/236vm3romw56983/Cascade1Matlab.xml?dl=0

im=imread('P0016.bmp'); 
detector = vision.CascadeObjectDetector('Cascade1Matlab.xml'); 
    bbox = step(detector, im);  % Detect the target. 
detectedImg = insertObjectAnnotation(im, 'rectangle', bbox, 'target');   % Insert bounding boxes and return marked image. 
imshow(detectedImg) 

BW=rgb2gray(im); 
BW=imcrop(BW,bbox(1,:) +[0 0 10 10]); 
[imH,imW]=size(im); 
centers = imfindcircles(im,[1 round(imH)]); 
figure;hold on; 
imshow(im); 
plot(centers(:,1),centers(:,2),'r*','LineWidth',4) 

나는 또한 오일러 번호와 같은 다른 방법으로 시도했지만 성공하지, 난 제대로 작동 아무것도 찾을 수 없습니다.

+0

실제로 이것은 분명하지 않습니다. 성공하지 못했던 코드를 게시 할 수 있습니까? – Ratbert

+0

이미지에 대한 링크를 게시하면 우리 중 하나가 귀하의 게시물을 편집하고 업로드합니다. – McMa

+0

죄송합니다. 코드를 변경하지 않고 여러 번 시도한 후 갑자기 작동했습니다. 더 많은 문제가 있으면 다시 게시 할 것입니다. 감사합니다 모두 – Zynk

답변

0

나는 가장 쉽고 빠른 방법은 목표를 찾고 이진화하는 것이라고 생각합니다. 그 후에 regionprops()을 사용하고 방향을 읽으려면 "방향"속성을 읽으십시오.

해당 도구 상자를 사용할 수 없으면 해당 지역의 공분산 행렬을 계산하여 함수를 쉽게 구현할 수 있습니다. 이것에 대한 조언이 필요하시면 알려주세요.

편집 :

난 그냥 그렇게 주위 여기에 몇 가지 잘 벡터화 기능을 가지고 무슨 일이 생긴;) 그래서 속도가 최우선 인 경우, 당신은 쉽게 이런 식으로 최소한으로 손질 자신의 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 

. 그것에 대한 자세한 내용 here.

이미지 순간이 아주 재미있을 수도 있습니다.

+0

고맙습니다. 이미지에 실제로 적용되지만 실시간 처리를 위해 작동하지 않습니다. 내 업데이트를 확인하십시오. – Zynk

+0

속도가 중요한 요소라면, 이미지 순간을 계산하고 지역 행렬을 스스로 조정하여 편집 할 수 있습니다. – McMa

+0

감사합니다. 제발, 내 새 업데이 트를 좀 봐. – Zynk

0

나는 매우 멍청한 해결책을 가지고 있습니다. 작동 할 수도 있습니다. 작업 할 이미지가 없으므로 실제로 시도하지 않았습니다. 따라서 오류가 발생하면 오류를 게시하십시오.

가정 : - 이미지를 필터링하여 균일 한 노이즈의 삼각형 "OR"만 포함 된 이진 이미지를 얻었습니다.

  1. 이제 이미지 (image1)를 0도까지 찍을 수 있습니다. 이를 필터링하고 이진 이미지 (bw1)를 얻습니다.

  2. 그래서 quadrotor를 착륙 시키려 할 때 이미지 (image2)를 가져 와서 이진 (bw2)으로 변환하십시오.

  3. 이제 두 이미지 { (bw1, bw2)} 간의 상관 관계를 찾습니다. 이것을 변수에 저장하십시오.

  4. 스텝 각으로 이미지를 회전합니다. 각도를 5 도가되게하십시오. {imrotate (bw2, 5)}

  5. 다시 두 이미지 간의 상관 관계를 찾습니다.

  6. 모든 각도에 대해 이렇게하십시오.

  7. 상관은 최대 인 각도 (회전 수 * 5)입니다.

이 용어의 최대 값은 완전한 이진 이미지를 얻기 위해 필터링 기술에 크게 의존하기 때문에 상관 관계가 1이 아닐 수 있음을 의미합니다.

또한 모든 각도에 대한 상관 관계 계산에는 장시간뿐만 아니라 높은 계산 속도가 필요하다는 것도 인정합니다. 높은 계산 속도가 없다면 실시간으로 달성하기가 정말 어려울 것입니다. (이 경우 Parallel Computing Toolbox) 특히 parfor을 볼 수 있습니다.

희망이 당신을 위해 유용했다. 오류가있을 경우 의견을 게시하십시오.

마지막 행운을 빈다. 좋은 프로젝트.

P. 이미지를 회전하는 동안 이진 이미지에 따라 흰색 또는 검은 색 픽셀을 채 웁니다.

+0

당신의 아이디어에 감사드립니다,하지만 위대한 하나의 주요 문제가, 참조 이미지와 자른 감지 된 이미지가 결코 동일한 정확한 크기를 가지지 않으므로 상관 관계가 작동하지 않습니다. 내 업데이트를 확인하십시오. – Zynk

+0

간단합니다. imresize() 함수를 사용하고 표준 크기로 크기를 조정하십시오. – Damon

+0

사실, 나는 이미 방향 문제를 해결했습니다. 이제 quadcopter의 카메라가 전체 타겟을 보는지 또는 작은 카메라 만 보는 지 문제가 있습니다. 그것은 쉬워야하지만, 나는 그것을 할 어떤 방법을 찾을 수 없습니다. 생각 나면 저에게 알려주세요. 감사합니다. – Zynk