基本思路是:
1)定位点的轮廓有三层轮廓
2)每个定位点的轮廓中心点一样的
3)三个定位点可以围成一个等腰直角三角形
补充思路:
当背景过于复杂的使用时候无法正确找到二维码位置,按以下思路尝试改进:
1)阈值分割
2)膨胀或者腐蚀
3)扣取所有正方形区域,逐一检测
4)然后再进行上面的操作
import numpy as np
import copy
def reshape_image(image):
'''归一化图片尺寸:短边400,长边不超过800,短边400,长边超过800以长边800为主'''
width,height=image.shape[1],image.shape[0]
min_len=width
scale=width*1.0/400
new_width=400
new_height=int(height/scale)
if new_height>800:
new_height=800
scale=height*1.0/800
new_width=int(width/scale)
out=cv2.resize(image,(new_width,new_height))
return out
def detecte(image):
'''提取所有轮廓'''
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
_,gray=cv2.threshold(gray,0,255,cv2.THRESH_OTSU+cv2.THRESH_BINARY_INV)
img,contours,hierachy=cv2.findContours(gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
return image,contours,hierachy
def compute_1(contours,i,j):
'''最外面的轮廓和子轮廓的比例'''
area1 = cv2.contourArea(contours[i])
area2 = cv2.contourArea(contours[j])
if area2==0:
return False
ratio = area1 * 1.0 / area2
if abs(ratio - 49.0 / 25):
return True
return False
def