我目前正在做一个matlab项目,我必须从图像中隔离条形码并读取条形码信息。
我正在使用的方法是Hough变换,一旦变换完成,我使用houghpeaks
和houghlines
,这样我就可以确定条形码上每条线之间的距离。我的图像可能是水平或垂直的。
我遇到的问题是houghpeak
检测和houghline
绘图。当我有一个有垂直线条的图像时,它没有检测到条形码的每一行。我在条形码图像下方有一个链接,我正在绘制线条,我希望我指定长度的每条垂直线(在此图像的情况下为65)都有一条线叠加在它上面,这样我就可以接受信息并测量每条线之间的距离
我选择65作为我的'MinLength'的原因是因为如果我没有指定这个高值,我会在图像的其他部分绘制水平线。
我尝试实现sobel边缘检测,以便指定水平/垂直方向,但使用它时会出错:('参考不存在的字段'point1')。
我对'FillGap'
参数也不太清楚,我已经阅读了matlab的帮助,但我仍然没有理解它。我玩过不同的价值观试图去了解它,但我不太清楚。
我还尝试使用不仅仅是条形码的图像来实现代码。
在这张图片中,它也只是拾起似乎是随机的高峰,因此没有绘制我想要的hough线。
所以我的问题是,任何人都可以告诉我为什么代码没有在图像中的条形码的每个'线'上绘制所有的hough线。
以下是代码。
提前致谢!
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 :(得分:1)
为什么不在条形码的整个长度上绘制轮廓,而不是进行线检测来计算条形码。通过这种方式,您可以检测峰和谷,以区分黑色和白色部分。
您需要更少的计算能力,而且您的代码会更容易。