私は現在、画像からバーコードを分離してバーコード情報を読み取る必要があるmatlabプロジェクトを行っています。私が使用している方法はハフ変換です。変換が完了するhoughpeaks
とhoughlines
、バーコードの各行間の距離を判断できるようになります。私の画像は、水平または垂直である可能性があります。
私が抱えている問題は、houghpeak
検出とhoughline
プロットにあります。縦線のある画像がある場合、バーコードのすべての行が検出されません。線をプロットしているバーコード画像の下にリンクがあります。指定した長さ(この画像の場合は65)を超えるすべての垂直線に線を重ねて、これを取得できるようにしたいと思います情報を取得し、各線間の距離を測定します
「MinLength」として 65 を選択する理由は、この高い値を指定しないと、画像の他の部分に水平線がプロットされるためです。
水平/垂直方向を指定できるようにソーベル エッジ検出を実装しようとしましたが、それを使用するとエラーが発生しました: ('存在しないフィールド 'point1' への参照)。
また、パラメーターについても明確ではありません'FillGap'
。matlab のヘルプを読みましたが、まだ理解できていません。私はそれを理解するためにさまざまな価値観をいじってみましたが、あまり明確ではありません.
また、バーコード以上の画像を使用してコードを実装しようとしました。
この画像では、ランダムなハフピークと思われるものだけをピックアップしているため、希望するハフ線をプロットしていません。
だから私の質問は、コードが画像内のバーコードの各「行」にすべてのハフ行をプロットしていない理由を誰か教えてください。
以下はコードです。
前もって感謝します!
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');