2013-07-22 2 views
1

가장자리 감지 기술을 사용하여 바코드 감지를위한 MATLAB 코드는 Hough tranform & 에지 감지 기술이 필요합니다.허프 변이 및 가장자리 감지를 사용하는 바코드 감지

나는 이것을 위해 MATLAB 기능을 내장 시도하지만, 에지 검출 또는 바코드 감지

그래서, 도움의 어떤 종류가 많이 감사를 Hough 변환에 대해 거의 알고 있기 때문에 결과를 가져올 수 없습니다. 지금까지 내가이 ..

a=imread('BEAN13.jpg'); 

b = rgb2gray(a); 
rotI = imrotate(b,30,'crop'); 
%figure,imshow(rotI) 

BW = edge(rotI,'sobel'); 
[H,T,R] = hough(BW); 
imshow(H,[],'XData',T,'YData',R,... 
    'InitialMagnification','fit'); 
xlabel('\theta'), ylabel('\rho'); 
axis on, axis normal, hold on; 
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:)))); 
x = T(P(:,2)); y = R(P(:,1)); 
plot(x,y,'s','color','white'); 

lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); 
figure, imshow(rotI), 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 

지금 내가 바코드 스캔/디코딩 알고리즘을 필요로했다 ... &도 허프 변환 할 수있는 더 나은 방법에 대한 제안을해야합니다.

답변

3

따라서 Hough 변환을 사용해야합니다 (MUST)? 바코드 분석은 일반적으로 모든 바코드 선이 평행하다는 선험적 정보를 알고 있기 때문에 이보다 훨씬 쉽습니다. (바코드 스캐너가 바코드 라인에 대략 직각으로 작동하고 각 방향으로 30 도씩주고받습니다) 바코드 이미지의 단일 "슬라이스"를 취할 수 있습니다. 따라서 MxN 이미지에서 1xN 이미지로 바뀝니다.

그런 다음 임계 값 또는 분할을 사용하여 이미지를 흑백으로 변환하면됩니다 (예 : K- 평균 세분화). 그런 다음 잡음 제거를 수행 할 수 있습니다 (중간 또는 모드 필터가 이상적입니다). 단일 노이즈가있는 픽셀이 단일 바코드 선을 두 개의 개별 선으로 분리하지 않습니다.

마지막 루프 번의 각 열의 폭을 계산하는데 사용될 수있다 : 일반적

pixel_color = img[0][0]; 
int i; 
int width = image_width(img); // 'N' 
unsigned bars[width] = { 0 }; 
int currentBar = 0; 

for (i=0; i<width; i++) { 
    bars[currentBar] += 1; 
    if (img[0][i] != pixel_color) { // Detected a new bar 
    currentBar++; 
    pixel_color = img[0][i]; 
    } 
} 

을, 에지 검출은 이미 평행 에지 어쨌든 때문에 바코드 유용 아니며, 에지 감지 알고리즘은 흑백 필터를 사용하여 그레이 스케일 이미지를 흑백으로 줄이기위한 기본 필터링 및 임계 값 설정이 필요합니다. 이 유형의 문제에 간단한 LaPlace/edge-detection 필터를 사용하면 문제를 해결하기가 쉽지 않고 더 많은 작업을 생성 할 수 있습니다.

또한 Hough Transforms (즉, 평범하지 않은 비 파라 메트릭 양식)은 도형을 감지하는 데 유용합니다. 일반적인 학부 문제는 그림의 연필 수, 겹침 또는 직교 연필 수를 계산하는 것입니다. 변환의보다 복잡하고/매개 변수적인 형식은 그림에서 임의의 물체를 탐지하는 데 유용합니다.


  1. 임계 화 http://en.wikipedia.org/wiki/Thresholding_%28image_processing%29
  2. K-수단은 도움을 http://en.wikipedia.org/wiki/K_means
  3. 라플라스 필터를 http://www.owlnet.rice.edu/~elec539/Projects97/morphjrks/laplacian.html
  4. 모드 필터 http://www.roborealm.com/help/Mode.php
+0

고맙습니다 세그멘테이션. 그러나 나의 프로젝트는 hough transform & sub pixel edge detection의 사용을 요구한다. 그럼 바코드 디코딩 알고리즘이 필요해. –

+0

위의 루프는 간단한 바코드 디코딩 알고리즘을 제공합니다. 'bars [] '벡터에서 합계의 크기를 조절하면됩니다. – DevNull

+0

해결 방법이 있습니다. 기본적으로 이미지를 thresholding 한 다음 Hough 변환을 사용하여 Hough 변환에서 가장 큰 피크를 검색하여 바코드 2D 이미지에서 가장 긴 단일 라인을 감지합니다. 그런 다음 주성분 분석을 사용하여 선의 방향 각을 결정한 다음 회전을 통해 이미지를 표준화 할 수 있습니다.그럼 위의 간단한 선폭 감지 루프 코드를 사용할 수 있습니다. Hough 변환의 유일한 필요는 이미지가 사전 정렬되지 않은 경우입니다. – DevNull