0 引言
上一节讲了如何识别本地图像中二维码,读取数据。那么本节就讲讲如何将二维码进行框选,同时将其信息显示在界面上。主要实现效果与校园中菜鸟驿站的出库系统相似。(完整代码附于文末哦~)
1 复制上一节的代码
上一节代码通过pyzbar库,对本地图片的二维码进行解码,已经完成了对二维码信息的读取与识别。那么既然本节要实现在视频中标注,我们需要学会使用opencv的绘画功能。
import cv2 as cv
import numpy as np
from pyzbar.pyzbar import decode
img= cv.imread('C:/Users/liao/Desktop/myqrcode.jpg')
for barcode in decode(img):
print (barcode.data)
myData=barcode.data.decode('utf-8')
print(myData)
2 先调用个摄像头,再调整一下画幅大小
调用摄像头使用cv.VideoCapture()函数(函数详解戳链接https://blog.csdn.net/weixin_48623445/article/details/119192434?spm=1001.2014.3001.5501),捕获到一个摄像头。 再通过函数从cap.set(propId, value)函数,进行显示窗口的画幅调整。例:
import cv2 as cv
import numpy as np
from pyzbar.pyzbar import decode
cap=cv.VideoCapture(0)
cap.set(3,640)
cap.set(4,480)
cap.set()中有两个参数,其中的propld是cv::VideoCaptureProperties 的属性标识符,简单讲即为我们要更改视频的相关属性。如例子中的3、4,就分别对应视频流中的帧宽度与帧高度。 所以,我们如果通过函数cap.set()来改变画幅,第一个参数输入的3和4就是告诉电脑我们要改变视频的宽与高;而第二个参数即是对于前述的两个属性需要更改为多少的命令。我们这程序即为将画幅定为640x480;
3 开始给捕获到的二维码加个框框
opencv中绘制包裹住二维码的方法有很多,比如绘制矩形、绘制多边形;如果是选择矩形框框,识别时二维码存在的倾斜角度会导致添加的框框不能跟着倾斜,不是我们想要的效果,因此我们选用绘制多边形。 绘制多边形,首先要得到二维码的四个顶点坐标,再进行绘制。在这里代码主要分为三行:
pts=np.array([barcode.polygon],np.int32)
pts=pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(255,0,255),5)
第一行使用numpy库中array函数,得到一个四点数据矩阵。其中barcode.polygon作用是从轮廓中提取polygon点,作为顶点;np.int32则是对于数据的类型约束。 第二行的reshape((-1,1,2))函数,主要功能是将原有的数据形状转换为opencv中常用的形状:(x,1,y),便于使用。如将(4,2)转换为(4,1,2)。 第三行则是正式的绘画过程,使用cv.ploylines函数,绘制了一个闭合、紫色、宽度为五的四边形。该函数标准形式是:polylines(img, pts, isClosed, color, thickness, lineType, shift),括号中的参数分别是表示:显示的图像、多边形顶点数组、折线是否闭合(闭合为True、不闭合为False)、线条颜色、线条粗细、线形、顶点坐标中的小数位数。
4 在框框上写上读取的内容
在图像中写字主要使用的是cv.putText()函数,该函数参数也比较多(因为要限制那么多变量嘛,比如字体、颜色啥的),还有一个就是要对于pts点集做一定的处理,因为正与上面的情况相反,我们要保证显示的字不能倾斜呀。所以,要提取一个起点,不让字跟着二维码倾斜。例:
pts2=barcode.rect
cv.putText(img,myData,(pts2[0],pts2[1]),cv.FONT_HERSHEY_SIMPLEX,0.9,(255,0,255),2)
barcode.rect()即为处理方法,它主要功能是画一个可以包裹整个二维码的最小水平矩形,效果如图所示:
得到大矩形框后,矩形框的左上角顶点则为我们文本插入的水平基准,也就是(pts2【0】、pts2【1】)。故使用cv.putText()函数,来添加文本。该函数的标准形式为:putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin),括号中的参数分别为:插入文本的图像、插入文本的内容、图像中文本字符串的左下角(输入文本的起点)、字体类型、字体比例因子乘以字体特定的基本大小、文本颜色、用于绘制文本的线条的粗细、线型、 bottomLeftOrigin 当为真时,图像数据原点位于左下角。注:部分参数程序中未使用,大家可以去尝试尝试。
5 附上全部代码
到此为止,你也可以做一个菜鸟驿站那样的二维码识别啦!效果图如下下:
import cv2 as cv
import numpy as np
from pyzbar.pyzbar import decode
cap=cv.VideoCapture(0)
cap.set(3,640)
cap.set(4,480)
while True:
success,img=cap.read()
if not success:
print('capture the camera failed...')
break
for barcode in decode(img):
myData=barcode.data.decode('utf-8')
print(myData)
pts=np.array([barcode.polygon],np.int32)
pts=pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(255,0,255),5)
pts2=barcode.rect
cv.putText(img,myData,(pts2[0],pts2[1]),cv.FONT_HERSHEY_SIMPLEX,0.9,(255,0,255),2)
cv.imshow('Result',img)
cv.waitKey(1)
注:其中部分未讲的函数,在前几章均有讲述,有兴趣的朋友可以去康康~也欢迎对于文章内容有自己见解的朋友,留言探讨。
|