文章目录

  • 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

python usb摄像头 图像对比 python摄像头拍照_git


升级之后也给出了提示,因为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,进入相机应用,可以不停去切换摄像头

python usb摄像头 图像对比 python摄像头拍照_git_02


然后就知道自己的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()

rectangle()函数

python usb摄像头 图像对比 python摄像头拍照_git_03

4.2 图上添加文字cv2.putText()函数

cv2.putText()

python usb摄像头 图像对比 python摄像头拍照_python usb摄像头 图像对比_04


简单说一下:

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,字体的线条的宽度,线宽。

python usb摄像头 图像对比 python摄像头拍照_python usb摄像头 图像对比_05


字体参考:

4.3 绘制多边形polylines()

polylines()

python usb摄像头 图像对比 python摄像头拍照_opencv_06

4.2 多边形填充颜色fillPoly

fillPoly

python usb摄像头 图像对比 python摄像头拍照_python usb摄像头 图像对比_07

4.3 透明度加框函数addWeighted()

python usb摄像头 图像对比 python摄像头拍照_opencv_08

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