Python - Detect a QR code from an image and crop using OpenCV

后端 未结 3 777
不思量自难忘°
不思量自难忘° 2020-12-18 13:37

I\'m working on a project using Python(3.7) and OpenCV in which I have an Image(captured using the camera) of a document with a QR code placed on it.

This QR code ha

3条回答
  •  情话喂你
    2020-12-18 13:50

    Here's a simple approach using thresholding, morphological operations, and contour filtering.

    1. Obtain binary image. Load image, grayscale, Gaussian blur, Otsu's threshold

    2. Connect individual QR contours. Create a rectangular structuring kernel with cv2.getStructuringElement then perform morphological operations with cv2.MORPH_CLOSE.

    3. Filter for QR code. Find contours and filter using contour approximation, contour area, and aspect ratio.


    Detected QR code

    Extracted QR code

    From here you can compare the QR code with your reference information

    Code

    import cv2
    import numpy as np
    
    # Load imgae, grayscale, Gaussian blur, Otsu's threshold
    image = cv2.imread('1.jpg')
    original = image.copy()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (9,9), 0)
    thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    
    # Morph close
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
    close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)
    
    # Find contours and filter for QR code
    cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
        peri = cv2.arcLength(c, True)
        approx = cv2.approxPolyDP(c, 0.04 * peri, True)
        x,y,w,h = cv2.boundingRect(approx)
        area = cv2.contourArea(c)
        ar = w / float(h)
        if len(approx) == 4 and area > 1000 and (ar > .85 and ar < 1.3):
            cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)
            ROI = original[y:y+h, x:x+w]
            cv2.imwrite('ROI.png', ROI)
    
    cv2.imshow('thresh', thresh)
    cv2.imshow('close', close)
    cv2.imshow('image', image)
    cv2.imshow('ROI', ROI)
    cv2.waitKey()     
    

提交回复
热议问题