2013-07-25 171 views
0

我不能解決該問題,下面的代碼被表示...條形碼掃描算法

clear 
I=imread('barcode.jpg');%read image from drive; 
I=im2bw(I);    
imshow(I); 
hold on; 
[x,y]=ginput(2);  %get data from click mouse 
u1=x(1); 
u2=y(1); 
v1=x(2); 
v2=y(2); 
line(x,y);    %paint the line between 2 point at click mouse 
a = [u1:1:v1];   %find out function line between 2 point 
if (u1~=v1) & (u2~=v2) 
    g = round(((v2-u2)/(v1-u1))*a + u2 -(u1/(v1-u1))); 
elseif (u1==v1) 
    a = u1; 
end      
i=1;     %find the value each pixel that the line go through 
h=v1-u1+1; 
b=[1:1:h]; 
for a=u1:v1 
    if (I(g,a)==0) 
     b(i)=1; 
     i=i+1; 
    elseif (I(g,a)==1) 
     b(i)=0; 
     i=i+1; 
    end 
end 
c=b 
i=1;    %find number pixels of each line in barcode picture; 
s=[1:1:60]; 
for k=1:60 
    j=0; 
    if c(i)==0 
     while (c(i)==0)&(i<=h) 
      j=j+1; 
      i=i+1; 
      s(k)=j; 
     end 
    elseif c(i)==1 
     while (c(i)==1)&(i<=h) 
      j=j+1; 
      i=i+1; 
      s(k)=j; 
     end 
    end 
end 
mau=s(2);  %the first line is the sample for barcode,in another line is ratio with this 
q=s./mau; 
p=round(q);  
doc1=[1:1:6]; %decode 
k=1; 
for i=5:4:25 
    if (p(i)==3)& (p(i+1)==2) &(p(i+2)==1) &(p(i+3)==1) 
     doc1(k)=0 
    elseif (p(i)==2)& (p(i+1)==2) &(p(i+2)==2) &(p(i+3)==1) 
     doc1(k)=1 
    elseif (p(i)==2)& (p(i+1)==1) &(p(i+2)==2) &(p(i+3)==2) 
     doc1(k)=2 
    elseif (p(i)==1)& (p(i+1)==4) &(p(i+2)==1) &(p(i+3)==1) 
     doc1(k)=3 
    elseif (p(i)==1)& (p(i+1)==1) &(p(i+2)==3) &(p(i+3)==2) 
     doc1(k)=4 
    elseif (p(i)==1)& (p(i+1)==2) &(p(i+2)==3) &(p(i+3)==1) 
     doc1(k)=5 
    elseif (p(i)==1)& (p(i+1)==1) &(p(i+2)==1) &(p(i+3)==4) 
     doc1(k)=6 
    elseif (p(i)==1)& (p(i+1)==3) &(p(i+2)==1) &(p(i+3)==2) 
     doc1(k)=7 
    elseif (p(i)==1)& (p(i+1)==2) &(p(i+2)==1) &(p(i+3)==3) 
     doc1(k)=8 
    elseif (p(i)==3)& (p(i+1)==1) &(p(i+2)==1) &(p(i+3)==2) 
     doc1(k)=9 
    end 
    k=k+1; 
end 
doc2=[1:1:6]; 
k=1; 
for i=34:4:54 
    if (p(i)==3)& (p(i+1)==2) &(p(i+2)==1) &(p(i+3)==1) 
     doc2(k)=0 
    elseif (p(i)==2)& (p(i+1)==2) &(p(i+2)==2) &(p(i+3)==1) 
     doc2(k)=1 
    elseif (p(i)==2)& (p(i+1)==1) &(p(i+2)==2) &(p(i+3)==2) 
     doc2(k)=2 
    elseif (p(i)==1)& (p(i+1)==4) &(p(i+2)==1) &(p(i+3)==1) 
     doc2(k)=3 
    elseif (p(i)==1)& (p(i+1)==1) &(p(i+2)==3) &(p(i+3)==2) 
     doc2(k)=4 
    elseif (p(i)==1)& (p(i+1)==2) &(p(i+2)==3) &(p(i+3)==1) 
     doc2(k)=5 
    elseif (p(i)==1)& (p(i+1)==1) &(p(i+2)==1) &(p(i+3)==4) 
     doc2(k)=6 
    elseif (p(i)==1)& (p(i+1)==3) &(p(i+2)==1) &(p(i+3)==2) 
     doc2(k)=7 
    elseif (p(i)==1)& (p(i+1)==2) &(p(i+2)==1) &(p(i+3)==3) 
     doc2(k)=8 
    elseif (p(i)==3)& (p(i+1)==1) &(p(i+2)==1) &(p(i+3)==2) 
     doc2(k)=9 
    end 
    k=k+1; 
end 

該錯誤消息是...

下標索引必須是真實的正整數或邏輯值。

Error in runprogram (line 22) 
if (I(g,a)==0) 

還有簡化條形碼檢測代碼的建議嗎?

+1

在第22行的id語句之前,打印g和a的值。其中一個可能不到1,或者不是一個整數。 –

回答

0

更改以下行的程序

u1=x(1); 
u2=y(1); 
v1=x(2); 
v2=y(2); 

的開頭是:

u1=round(x(1)); 
u2=round(y(1)); 
v1=round(x(2)); 
v2=round(y(2)); 

事情應該現在的工作。

HT @arr_sea

一個次要的簡化是改變K = 1:60迴路如下:

for k=1:60   % can have up to 60 lines? 
    j=0; 
    curr = c(i); 
    while (c(i)==curr)&(i<=h) % h is x length of barcode 
     j=j+1; 
     i=i+1; 
    end 
    s(k)=j; 
end 

編輯:

(1)數字翻譯的條形碼是[doc1 doc2]

+0

謝謝你的幫助.... 你也可以告訴我應該做些什麼來顯示只有條碼數字的輸出。這裏的輸出顯示所有的doc1(k)&doc2(k)數字,但我只需要顯示條碼數字。 如果Hough變換和子像素邊緣檢測應用於圖像(輸入)處理,該算法也將起作用。 –

+0

請參閱我的附加評論,瞭解如何檢索從條形碼派生的數字代碼。我認爲邊緣檢測在轉換成黑白圖像之前在特定情況下可能是有用的,但我不是該領域的專家。我會參考你以前的帖子http://stackoverflow.com/questions/17783752/barcode-detection-using-hough-transform-edge-detection?rq=1或者在你嘗試過這些之後發佈一個更具體的新問題技術 –