2013-03-20 7 views
2

현재 이미지에서 바코드를 분리하고 바코드 정보를 읽어야하는 MATLAB 프로젝트를 진행하고 있습니다. 내가 사용하는 방법은 Hough Transform입니다. 변환이 완료되면 바코드의 각 줄 사이의 거리를 확인할 수 있도록 houghpeakshoughlines을 사용하고 있습니다. 내 이미지가 가로 또는 세로 일 수 있습니다.matlab에서 hough transform/houghlines를 사용하여 특정 라인을 감지합니다.

내가 겪고있는 문제는 houghpeak 감지 및 houghline 플로팅입니다. 세로선이있는 이미지를 가지고있을 때 바코드의 모든 라인을 감지하지 못합니다. 바코드 이미지 아래에 링크가 있습니다. 아래 그림과 같이 세로 길이가 65 인치를 초과하는 모든 세로선에 선을 겹쳐서 표시하고 싶습니다. 나는이 높은 값을 지정 해달라고하면 나는 수평선 이미지의 다른 부분에 그려 얻고 있기 때문에 정보 내 'MINLENGTH'로 (65)를 선택해 내 이유

enter image description here

각 라인 사이의 거리를 측정입니다.

나는 수평/수직 방향을 지정할 수 있지만 그것을 사용하여 오류를 얻을 수 있도록 sobel 엣지 탐지를 구현하려고 시도했다. (''존재하지 않는 필드 'point1'에 대한 참조).

나는 또한 'FillGap' 매개 변수에 너무 명확하지 않다, 나는 그것에 matlab에 도움을 읽었지만 여전히 내 머리를 얻지 못하고있다. 나는 그것을 시도하고 이해하는 데 다른 가치를 가지고 놀았지만 너무 명확하지 않다.

저는 바코드 이상의 이미지를 사용하여 코드를 구현하려고했습니다. 또한 단지 무작위 houghpeaks 때문에 내가가하고자하는 무릎 선을 플로팅하지 것 같다 무엇을 따기이 이미지에서

enter image description here

.

제 질문은 실제로 코드가 이미지의 바코드의 각 '줄'에 모든 선을 그려 내지 않는 이유를 말해 줄 수 있습니다.

다음은 코드입니다.

미리 감사드립니다.

I = imread('barcode (2).jpg'); 
I = im2double(I); 
I = rgb2gray(I); 
BW = edge(I,'canny'); 
[H,T,R] = hough(BW); 
figure(1),imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); 
xlabel('\theta'), ylabel('\rho'); 
axis on, axis normal, hold on; 
P = houghpeaks(H,26,'threshold',ceil(0.5*max(H(:)))); 
x = T(P(:,2)); 
y = R(P(:,1)); 
plot(x,y,'s','color','white'); 


% Find lines and plot them 
lines = houghlines(BW,T,R,P,'FillGap',2,'MinLength',65); 
figure, imshow(BW), hold on 
max_len = 0; 
for k = 1:length(lines) 
    xy = [lines(k).point1; lines(k).point2]; 
    plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); 

    % plot beginnings and ends of lines 
    plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); 
    plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); 

    % determine the endpoints of the longest line segment 
    len = norm(lines(k).point1 - lines(k).point2); 
    if (len > max_len) 
    max_len = len; 
    xy_long = xy; 
    end 
end 

% highlight the longest line segment 
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan'); 

답변

0

대신 바코드를 계산하기 위해 라인 감지를하는, 당신은 왜 바코드의 전체 길이를 통해 프로필을 플롯되지 않습니다. 이 방법을 사용하면 검은 색과 흰색 섹션을 구별하기 위해 봉우리와 골짜기를 감지 할 수 있습니다.

컴퓨팅 성능이 떨어지고 코드가 훨씬 쉬워야합니다.