文章目录
- 1. 调用摄像头
- 2.1 打开摄像头很慢
- 2. 判断usb摄像头是否可用
- 3. 在图片上绘制四边形/矩形,加文字
- 4. 函数记录
- 4.1 绘制矩形函数rectangle()
- 4.2 图上添加文字cv2.putText()函数
- 4.3 绘制多边形polylines()
- 4.2 多边形填充颜色fillPoly
- 4.3 透明度加框函数addWeighted()
- 5. 获取当前文件的绝对路径
- 6. 将识别和绘制后的结果绘制在视频流上显示
- 7. 最终代码
先看官方文档:
https://docs.opencv.org/4.5.2/
速度可能会有些慢。。。
1. 调用摄像头
import cv2
# from ZNKJdigit import DigitalRecognizer,RecogniztionResult
cap=cv2.VideoCapture(2)
# 如果笔记本有前置和后置两个摄像头,一般0是后置,1是前置
# 每额外插一个usb摄像头,序号就会加1,多试试,就知道是几了。
cap.set(3,900)
cap.set(4,900)
# cap.set()设置摄像头参数:3:宽 4:高
# cap.isOpened()返回布尔值,来查看是否摄像头初始化成功
while(cap.isOpened()):
ret,frame = cap.read()
# cap.read()返回两个值,第一个值为布尔值,如果视频正确,那么就返回true, 第二个值代表图像三维像素矩阵
cv2.imshow('Capture', frame)
# 保持画面的持续显示
k=cv2.waitKey(1)
# 等待1毫秒,没有继续刷新 如果是0 则是无限等待 cv2.waitKey(0)一般用于销魂窗口
if k==ord('s'):
print('222222')
print(cap.get(3))
print(cap.get(4))
elif k==ord('q'):
print('完成')
cap.release()
# 释放资源
cv2.destroyAllWindows()
# 删除窗口 注意英文单词 是destroy 不是destory
break
参考:
2.1 打开摄像头很慢
不知道为什么,打开系统摄像头很快,但是打开usb摄像头就很慢。
解决1-无效
升级opencv-python
pip install --upgrade opencv-python
升级之后也给出了提示,因为paddleocr使用的是opencv-pythnotallow==4.2.0.32
,直接升级到了4.5.2.52
。记录一下,放置后面出问题。
解决2-无效
cap.set(6, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'))
解决3-
参考:从OpenCV 3切换到OpenCV 4会导致网络摄像头以最高5帧的速度记录,而不是通常的30帧。 有可能是因为本机就有两个摄像头导致的,暂时没有解决
2. 判断usb摄像头是否可用
windows下,直接在搜索框输入camera
,进入相机应用,可以不停去切换摄像头
然后就知道自己的usb摄像头有没有被系统识别了
3. 在图片上绘制四边形/矩形,加文字
由于我这里四个点的坐标并不是矩形那么对称,所以只能使用多边形绘制的方式来进行。
记录一下绘制矩形并显示输出识别结果的txt
import cv2
fname = '/path/xxx.jpg'
img = cv2.imread(fname)
# 如果是四边形,左上和右下角定点,(0,255,0) 绘制矩形的颜色,4表示线宽度
cv2.rectangle(img, (10,50), (50,100), (0,255,0), 4)
font = cv2.FONT_HERSHEY_SIMPLEX
text = '001'
cv2.putText(img, text, (50, 50), font, 1, (0,0,255), 1)
# cv2.putText(img,text,开始坐标,字体font,字体大小,color,字体粗细)
cv2.imwrite('/path/001_new.jpg', img)
绘制四边形并进行半透明填充的代码
lineImg=cv2.polylines(img, boxes, 1, 255)
font = cv2.FONT_HERSHEY_SIMPLEX
txtImg=cv2.putText(lineImg, text[0], (50, 50), font, 1, (0, 0, 255), 1)
alpha = 1
# beta 为第二张图片的透明度
beta = 0.5
gamma = 0
# 创造蒙版
zero = np.zeros((img.shape), dtype=np.uint8)
mask=cv2.fillPoly(zero, boxes, (0,0,255))
rs_img = cv2.addWeighted(txtImg, alpha, mask, beta, gamma)
# 合并原图和蒙版图
cv2.imwrite('./test/001.jpg', rs_img)
4. 函数记录
4.1 绘制矩形函数rectangle()
4.2 图上添加文字cv2.putText()函数
简单说一下:
txtImg = cv2.putText(lineImg, text[0], (leftLoc, topLoc), font, 2, (255, 255, 255), 3)
# lineImg是要放字的背景图
# text[0] 是要放置的文字内容
# (leftLoc, topLoc)放置文字的左上角开始位置
# font 字体类型
# 2 字体的fontscale,相对于字体默认大小(基础文字大小),一般2/3就够了
# (255,255,255) 字体颜色,比如白色
# 3,字体的线条的宽度,线宽。
字体参考:
4.3 绘制多边形polylines()
4.2 多边形填充颜色fillPoly
4.3 透明度加框函数addWeighted()
5. 获取当前文件的绝对路径
要把截取的图像放到当前文件的同级目录下,有以下几种方式:
import sys
print(sys.argv[0])
> C:\software\PyCharm Community Edition 2020.3.2\plugins\python-ce\helpers\pydev\pydevconsole.py
# 和这个配套使用的还有两个函数,分别是:
# basename 返回当前文件名
# dirname 返回当前文件所在文件夹的路径
import os
print(os.path.basename(cwd))
> pydevconsole.py
print(os.path.dirname(cwd))
> C:\software\PyCharm Community Edition 2020.3.2\plugins\python-ce\helpers\pydev
参考:
6. 将识别和绘制后的结果绘制在视频流上显示
使用VideoWriter
7. 最终代码
import cv2
from ZNKJdigit import DigitalRecognizer,DigitalConfig
import numpy as np
import sys
import os
def DrawAndSave(img):
rs = digitalRecognizer.recognize(image=img, digitBoxNum=1)
if rs.code!=0:
return img
boxes = np.array(rs.boxes, dtype=np.int32)
text = rs.result
print(f"code:{rs.code},result:{rs.result},boxes:{boxes},scores:{rs.scores},message:{rs.messsage}")
lineImg = cv2.polylines(img, boxes, 1, 255)
font = cv2.FONT_HERSHEY_SIMPLEX
leftLoc=boxes[0][0][0]-20
topLoc=boxes[0][0][1]-20
txtImg = cv2.putText(lineImg, text[0], (leftLoc, topLoc), font, 2, (255, 255, 255), 3)
alpha = 1
# beta 为第二张图片的透明度
beta = 0.3
gamma = 0
# 创造蒙版
zero = np.zeros((img.shape), dtype=np.uint8)
mask = cv2.fillPoly(zero, boxes, (0, 0, 255))
rs_img = cv2.addWeighted(txtImg, alpha, mask, beta, gamma)
return rs_img
cap=cv2.VideoCapture(2)
# 如果笔记本有前置和后置两个摄像头,一般0是后置,1是前置
# 每额外插一个usb摄像头,序号就会加1,多试试,就知道是几了。
cap.set(3,900)
cap.set(4,900)
# cap.set()设置摄像头参数:3:宽 4:高
# cap.isOpened()返回布尔值,来查看是否摄像头初始化成功
cwd=os.path.dirname(sys.argv[0])
print(cwd)
saveNum=0
while(cap.isOpened()):
ret,frame = cap.read()
# cap.read()返回两个值,第一个值为布尔值,如果视频正确,那么就返回true, 第二个值代表图像三维像素矩阵
# cv2.imshow('Capture', frame)
# 保持画面的持续显示
k=cv2.waitKey(1)
# 等待1毫秒,没有继续刷新 如果是0 则是无限等待 cv2.waitKey(0)一般用于销毁窗口
digitalRecognizer = DigitalRecognizer(config=DigitalConfig())
rsimg = DrawAndSave(frame)
cv2.imshow("Windows",frame)
if k==ord('s'):
saveNum += 1
savepath = os.path.join(cwd, str(saveNum) + ".jpg")
cv2.imwrite(savepath, rsimg)
print(f"img has been saved as {savepath}")
elif k==ord('q'):
print('完成')
cap.release()
cv2.destroyAllWindows()
break