在智能制造中,二维码、条形码的应用十分广泛,其可以应用于拆零拣选、混合码垛、仓储等多个场合,均要求摄像头对于二维码信息的精确捕捉。现提出一个在典型视觉工站下,多个二维码色块的视觉分割与识别算法。
算法需求:将含二维码色块的格子单独切割提取,读取色块上的字母与数字,读取二维码内数据。
将图片读入,并剪裁为宽1000高900的三通道图片。
img1 = cv2.imread(r'project 1 pictures/1.bmp')#目录为根目录下
img = cv2.resize(img1,(1224,1024))
img_Model=cv2.imread(r'Model/R1.png')
cv2.destroyAllWindows()
img = img[60:960,200:1200]
print(img.shape)
cv2.imshow("aa", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如图所示:
因视觉工站拍摄的图片中,放置色块为九宫格形式,故按九宫格切割为九份。
result = divided_to_9(img)
需要注意因拍摄图像两侧有畸变,故进行手动切割。
def divided_to_9(img):
result = []
img_1 = img[0:290,0:300]#因图片中两侧有畸变,故手动进行切割
img_2 = img[0:290,314:628]
img_3 = img[0:290,628:940]
img_4 = img[300:600,0:314]
img_5 = img[300:600,314:628]
img_6 = img[300:600,628:940]
img_7 = img[600:900,0:314]
img_8 = img[600:900,314:628]
img_9 = img[600:900,628:940]
result.append(img_1)
result.append(img_2)
result.append(img_3)
result.append(img_4)
result.append(img_5)
result.append(img_6)
result.append(img_7)
result.append(img_8)
result.append(img_9)
return result
for i in range(9):
tmp = result[i]
tmp = Pre_handle(tmp)
zbar_DetctAndDecode(tmp)
print("识别完毕")
h, w = img.shape[0], img.shape[1]
m = 3
n = 3
divide_image2 = divide_method2(img, m + 1, n + 1) # 该函数中m+1和n+1表示网格点个数,m和n分别表示分块的块数
fig3 = plt.figure('分块后的子图像:图像缩放法')
display_blocks(divide_image2)
def divide_method2(img, m, n): # 分割成m行n列
h, w = img.shape[0], img.shape[1]
grid_h = int(h * 1.0 / (m - 1) + 0.5) # 每个网格的高
grid_w = int(w * 1.0 / (n - 1) + 0.5) # 每个网格的宽
# 满足整除关系时的高、宽
h = grid_h * (m - 1)
w = grid_w * (n - 1)
# 图像缩放
img_re = cv2.resize(img, (w, h),
cv2.INTER_LINEAR) # 也可以用img_re=skimage.transform.resize(img, (h,w)).astype(np.uint8)
# plt.imshow(img_re)
gx, gy = np.meshgrid(np.linspace(0, w, n), np.linspace(0, h, m))
gx = gx.astype(np.int32)
gy = gy.astype(np.int32)
divide_image = np.zeros([m - 1, n - 1, grid_h, grid_w, 3],
np.uint8) # 这是一个五维的张量,前面两维表示分块后图像的位置(第m行,第n列),后面三维表示每个分块后的图像信息
for i in range(m - 1):
for j in range(n - 1):
divide_image[i, j, ...] = img_re[
gy[i][j]:gy[i + 1][j + 1], gx[i][j]:gx[i + 1][j + 1], :]
return divide_image
算法基本实现了需求,但在稳定性上还存在不足需要提升。
全代码下载地址:https://download.csdn.net/download/qq_47842513/85522715