美文网首页
条形码瑕疵检测

条形码瑕疵检测

作者: Lemoner20 | 来源:发表于2018-04-23 21:50 被阅读0次

Detecting barcodes in images.

利用了图像处理中的膨胀、腐蚀运算,将条形码缺陷瑕疵,划痕缺口检测并框出来。

input output

实现代码如下:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on 17-12-20 7:33 PM
barcode_defect_detection.py  --检测条形码缺陷瑕疵
@author: lemoner20
"""
import numpy as np
import argparse
import cv2

# Instruction
# python barcode_defect_detection.py --image images/barcode_1.png

image = cv2.imread('./images/barcode_1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gaussianBlur = cv2.GaussianBlur(gray, (3, 3), 0)
gradX = cv2.Sobel(gaussianBlur, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)
gradY = cv2.Sobel(gaussianBlur, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=-1)
sobelX = cv2.convertScaleAbs(gradX)
sobelY = cv2.convertScaleAbs(gradY)
grad = cv2.subtract(sobelX, sobelY)
sobel = cv2.convertScaleAbs(grad)
blurred = cv2.blur(sobel, (3, 3))
_, barcodeThresh = cv2.threshold(blurred, 180, 255, cv2.THRESH_BINARY)
barcodeKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 10))
closed = cv2.morphologyEx(barcodeThresh, cv2.MORPH_CLOSE, barcodeKernel)
closed = cv2.erode(closed, None, iterations=4)
closed = cv2.dilate(closed, None, iterations=4)
_, barcodeContours, _ = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

barcodeCnt1 = sorted(barcodeContours, key=cv2.contourArea, reverse=True)[0]
barcodeCnt2 = sorted(barcodeContours, key=cv2.contourArea, reverse=True)[1]
center1, size1, angle1 = cv2.minAreaRect(barcodeCnt1)
center2, size2, angle2 = cv2.minAreaRect(barcodeCnt2)

# rect1 = cv2.minAreaRect(barcodeCnt1)
# box1 = np.int0(cv2.boxPoints(rect1))
# cv2.drawContours(image, [box1], -1, (255, 0, 0), 2)
# rect2 = cv2.minAreaRect(barcodeCnt2)
# box2 = np.int0(cv2.boxPoints(rect2))
# cv2.drawContours(image, [box2], -1, (255, 0, 0), 2)
# cv2.imshow("minRect Image", image);

rotated = cv2.getRotationMatrix2D(center2, angle2, 1)
rows, cols, _ = image.shape
rotatedImage = cv2.warpAffine(image, rotated, (cols, rows))

if abs(angle1) > 45:
    rect1 = (center1, size1, 90)
    box1 = np.int0(cv2.boxPoints(rect1))
    temp = [[0, 0]]*4
    for i in range(0, 3):
        temp[i+1] = box1[i]
    temp[0] = box1[3]
    box1 = np.array(temp)
    cv2.drawContours(rotatedImage, [box1], -1, (255, 0, 0), 2)
else:
    rect1 = (center1, size1, 0)
    box1 = np.int0(cv2.boxPoints(rect1))
    cv2.drawContours(rotatedImage, [box1], -1, (255, 0, 0), 2)

if abs(angle2) > 45:
    rect2 = (center2, size2, 90)
    box2 = np.int0(cv2.boxPoints(rect2))
    temp = [[0, 0]]*4
    for i in range(0, 3):
        temp[i+1] = box2[i]
    temp[0] = box2[3]
    box2 = np.array(temp)
    cv2.drawContours(rotatedImage, [box2], -1, (255, 0, 0), 2)
else:
    rect2 = (center2, size2, 0)
    box2 = np.int0(cv2.boxPoints(rect2))
    cv2.drawContours(rotatedImage, [box2], -1, (255, 0, 0), 2)

ROI1 = rotatedImage[box1[1][1]+5:box1[0][1]-5, box1[1][0]:box1[2][0]]
ROI2 = rotatedImage[box2[1][1]+5:box2[0][1]-5, box2[1][0]:box2[2][0]]


def detect(ROI):
    defectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 30))
    eroded = cv2.erode(ROI, defectKernel)
    defect = cv2.subtract(ROI, eroded)
    _, defectThresh = cv2.threshold(defect, 25, 255, cv2.THRESH_BINARY)
    # cv2.imshow("defectThresh Image", defectThresh);
    b, g, r = cv2.split(defectThresh)
    merged = cv2.merge([r-r, r-r, r])
    defectGray = cv2.cvtColor(merged, cv2.COLOR_BGR2GRAY)
    _, defectGray = cv2.threshold(defectGray, 50, 255, cv2.THRESH_BINARY)
    _, defectContours, _ = cv2.findContours(defectGray.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for ci in defectContours:
        if cv2.contourArea(ci) < 10:
            continue
        x, y, w, h = cv2.boundingRect(ci)
        cv2.rectangle(ROI, (x, y), (x+w, y+h), (0, 0, 255), 2)


detect(ROI1)
detect(ROI2)
cv2.imshow("ROIDetected Image", rotatedImage);

cv2.waitKey(0)
cv2.destroyAllWindows()

相关文章

  • 条形码瑕疵检测

    Detecting barcodes in images. 利用了图像处理中的膨胀、腐蚀运算,将条形码缺陷瑕疵,划...

  • 如何使用 Swift 开发简单的条形码检测器?

    【编者按】本文作者为 Matthew Maher,主要手把手地介绍如何用 Swift 构建简单的条形码检测器。文章...

  • 2.1.2 瑕疵的检测与修复 | 大圣视觉PRO

    今天,我们来学习瑕疵的检测与修复。 在照片的处理中,修瑕疵的工具并不太复杂,只要了解它们的使用方法,就可以直接上手...

  • 太阳能电池检测设备的散热解决方案

    太阳能电池检测设备是用来太阳能电池芯片瑕疵检测。是专为太阳能电池设计的桌上型应用产品,为手动上下料。通过检测太阳能...

  • 2019-07-05

    物流pda检测器,专为物流行业打造的工业级PDA,俗称物流巴枪,利用光学原理,把条形码的内容解码读取后存储,并通过...

  • 通用条形码生成 API 接口

    通用条形码生成 API 接口 通用条形码生成接口。 1. 产品功能 支持 40 种条形码; 支持生成自定义的条码尺...

  • 通用条形码生成 API 接口

    通用条形码生成 API 接口 通用条形码生成接口。 1. 产品功能 支持 40 种条形码; 支持生成自定义的条码尺...

  • 2021-03-09

    唐筛结果出来啦,今天收到了短信,只有写检测结果已经出来了,让带着母子健康手册和条形码去医院领取纸质结果。根据群里小...

  • 【iOS开发】相册选择图片识别条形码

    【iOS开发】相册选择图片识别条形码 原生识别条形码 VNDetectBarcodesRequest 只要iOS1...

  • 通用条形码生成 API 接口

    通用条形码生成 API 接口 通用条形码生成接口。 [图片上传中...(image-fabdfc-16182444...

网友评论

      本文标题:条形码瑕疵检测

      本文链接:https://www.haomeiwen.com/subject/folrlftx.html