python opencv调用摄像头识别并绘制结果
opencv
OpenCV: 开源计算机视觉库
项目地址:https://gitcode.com/gh_mirrors/opencv31/opencv
免费下载资源
·
文章目录
先看官方文档: https://docs.opencv.org/4.5.2/
速度可能会有些慢。。。
1. 调用摄像头
1.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
参考:
- CSDN博客: Python+Opencv 调用USB摄像头(一)
- 博客园博客: python 如何使用摄像头(opencv)
- 和上面的很像,互相参考:CSDN博客——通过cv2中的VideoCapture()调用电脑的摄像功能
- Python通过cv2读取多个USB摄像头
- csdn博客: python OpenCV 调用罗技摄像头方法说明
- 博客园文章:利用opencv从USB摄像头获取图片
- CSDN博客:Python+Opencv 调用USB摄像头(一)
1.2 打开摄像头很慢
不知道为什么,打开系统摄像头很快,但是打开usb摄像头就很慢。
解决1-无效
升级opencv-python
pip install --upgrade opencv-python
升级之后也给出了提示,因为paddleocr使用的是opencv-python==4.2.0.32
,直接升级到了4.5.2.52
。记录一下,放置后面出问题。
解决2-无效
参考:opencv打开摄像头慢,卡顿
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)
参考:
- opencv-python给图片添加半透明mask
- python+opencv填充图像不规则区域:fillPoly和fillConvexPoly区别、半透明填充方法
- python用opencv在图像中画矩形框,加txt,并保存
4. 函数记录
4.1 绘制矩形函数rectangle()
4.2 图上添加文字cv2.putText()函数
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
GitHub 加速计划 / opencv31 / opencv
154
15
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:4 个月前 )
4d26e16a
Speed up and reduce memory consumption for findContours 2 天前
1db98278
Add jxl (JPEG XL) codec support #26379
### Pull Request Readiness Checklist
Related CI and Docker changes:
- https://github.com/opencv/ci-gha-workflow/pull/190
- https://github.com/opencv-infrastructure/opencv-gha-dockerfile/pull/44
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work https://github.com/opencv/opencv/issues/20178
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
2 天前
更多推荐
已为社区贡献39条内容
所有评论(0)