一、实现二维码的白边框
用于二维码图片转化为视频进行播放时,黑色的定位点容易与播放器的黑色背景混淆导致定位点识别错误。所以需要对二维码增加一个白色边框对二维码进行分离。
如上图所示,是二维码增加了白边的效果。
为了实现这个功能,我的思路很简单,先创建纯白背景,在编码过程再把原二维码复制到背景上。
def combine_QR_code(img):
size = 1024 # 图片尺寸
background=np.ones((size+32,size+32),dtype=np.uint8 )*255 #创建纯白背景
background=cv2.cvtColor(background,cv2.COLOR_GRAY2BGR) #背景处理
img=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) #原二维码处理
'''进行图片复制'''
for i in range(16, 1040):
for j in range(16, 1040):
background[i, j, 0] = img[i - 16, j - 16, 0]
background[i, j, 1] = img[i - 16, j - 16, 1]
background[i, j, 2] = img[i - 16, j - 16, 2]
return background
通过这样的方法,将二维码输入,输出的是添加了白边的二维码,实现了需要的功能。
二、开始识别的标志
在解码前,我们通过对拍摄视频分解出的图片进行处理,删除了无关的图片,得到了很好的解码效果,但是我们必须考虑,如何对视频前的无关帧进行处理。
对于首次迭代的黑白图像,我们的想法是:生成一张纯白二维码和纯黑二维码,在进行解码前,对每次输入的图片进行识别,若扫出了黑色二维码的内容,则判断准备进入识别阶段,其中白色二维码的功能是与视频前的内容进行隔离,作为保护。
def decode_start(img):
if(type(img)==type(None)):
return False
size = 1024#二维码尺寸
lpsize = 192#定位点大小
cube = 16#色块大小
countx = 0
county = lpsize
while countx < size:
# print(np.sum(img[countx:countx + cube, county:county + cube]))
if np.sum(img[countx:countx + cube, county:county + cube]) > 125000: # 这里相当于是取小像素块的平均值,考虑到后面手机拍摄可能会产生色差
return False
county += cube
# 这一块的分类讨论和encode是一样的
if county == size - lpsize and countx < lpsize - cube:
county = lpsize
countx += cube # 到达下一行
elif county == size - lpsize and countx == lpsize - cube:
county = 0
countx += cube
elif county == size and countx < size - lpsize - cube:
county = 0
countx += cube
elif county == size and countx == size - lpsize - cube:
county = lpsize
countx += cube
elif county == size and countx >= size - lpsize:
county = lpsize
countx += cube
if countx == size and county == lpsize:
return True
我们默认扫出白色的色块,则认为并不是开始的标志,扫描下一张图,并通过循环实现。(前提是进行了图片的识别及裁剪,否则是无法使用的!识别和裁剪的实现在设计利用可用光传输的软件之二维码的定位识别及裁剪这篇博客中)