基于opencv和knn的摄像头数字识别简单代码
时间: 2023-11-04 18:12:36 浏览: 110
基于opencv的数字识别
3星 · 编辑精心推荐
这是一个基于OpenCV和k-NN算法的摄像头数字识别算法的简单代码:
```python
import cv2
import numpy as np
# Load the data for the k-NN classifier
with np.load('knn_data.npz') as data:
train = data['train']
train_labels = data['train_labels']
# Setup the k-NN classifier
knn = cv2.ml.KNearest_create()
knn.train(train, cv2.ml.ROW_SAMPLE, train_labels)
# Setup the webcam
cap = cv2.VideoCapture(0)
while True:
# Grab a frame from the webcam
ret, frame = cap.read()
# Convert the frame to grayscale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Apply some preprocessing (thresholding and morphological closing)
_, gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
gray = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
# Find contours of digits in the frame
_, contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Loop over each contour
for contour in contours:
# Compute the bounding rectangle of the contour
x, y, w, h = cv2.boundingRect(contour)
# Ignore small contours
if w < 15 or h < 15:
continue
# Extract the digit from the contour and resize it
digit = gray[y:y+h, x:x+w]
digit = cv2.resize(digit, (28, 28), interpolation=cv2.INTER_AREA)
# Flatten the digit and convert it to a 1D array
digit = digit.flatten()
digit = np.float32(digit)
# Classify the digit using the k-NN classifier
_, result, _, _ = knn.findNearest(digit.reshape(1, -1), k=3)
# Draw the classification result on the frame
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(frame, str(int(result[0])), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# Show the current frame
cv2.imshow('frame', frame)
# Exit if the user presses 'q'
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Release the webcam and destroy all windows
cap.release()
cv2.destroyAllWindows()
```
在这个代码中,k-NN分类器被用来识别出数字。训练数据和标签被存储在文件knn_data.npz中。每帧从网络摄像头中得到,然后用OpenCV的函数处理,以提取出图像中的数字。对于每个数字,应用相同的预处理步骤并将其输入k-NN分类器。分类器输出一个数字,我们将它作为识别结果画在帧上并用imshow函数显示在屏幕上。
阅读全文