opencv数字识别python代码(期末作业
时间: 2023-08-21 20:22:23 浏览: 94
好的,以下是一个基于OpenCV的数字识别Python代码:
```python
import cv2
import numpy as np
from keras.models import load_model
# 加载Keras模型
model = load_model('model.h5')
# 定义预处理函数
def preprocess(img):
# 将图像转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用高斯模糊以减少噪音
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# 应用阈值以将图像转换为黑白二值图像
_, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 找到图像中的轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算图像中所有轮廓的最小外接矩形
rects = [cv2.boundingRect(cnt) for cnt in contours]
# 对所有矩形进行排序
rects = sorted(rects, key=lambda x: x[0])
# 创建一个列表来存储数字
digits = []
# 遍历所有矩形
for rect in rects:
# 获取矩形的坐标和大小
x, y, w, h = rect
# 跳过太小或太大的矩形
if w < 10 or h < 10 or w > 200 or h > 200:
continue
# 提取矩形中的数字
digit = thresh[y:y+h, x:x+w]
# 调整数字大小以适应模型输入
resized_digit = cv2.resize(digit, (28, 28))
# 将数字添加到数字列表中
digits.append(resized_digit)
# 返回数字列表
return digits
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取帧
ret, frame = cap.read()
# 预处理帧以获取数字
digits = preprocess(frame)
# 遍历数字并对其进行分类
for digit in digits:
# 调整图像以适应模型输入
digit = digit.reshape(1, 28, 28, 1)
# 对数字进行分类
prediction = model.predict(digit)
# 获取预测结果并显示在图像上
digit_class = np.argmax(prediction)
cv2.putText(frame, str(digit_class), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 2)
# 显示帧
cv2.imshow('frame', frame)
# 如果用户按下q键,则退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
```
这段代码使用OpenCV和Keras库来识别摄像头中的数字。它首先将帧预处理以提取数字,并通过Keras模型对数字进行分类。最后,它在图像上显示预测结果。由于这只是一个基本的示例,您可能需要对代码进行调整以使其适合您的特定用例。
阅读全文