Mat Train_Data, Train_Label; for (int cnt = 0; cnt < contours.size(); cnt++) { if (contourArea(contours[cnt]) > 10) { Rect rect = boundingRect(contours[cnt]); rectangle(Train_Chars, rect, Scalar(0, 255, 0), 2); Mat ROI = binImg(rect); imshow("ROI", ROI); imshow("Training_Chars", Train_Chars); int charVal = waitKey(0); //将字符通过键盘输入给予标签 if (find(ValidChars.begin(), ValidChars.end(), charVal) != ValidChars.end()) { //如果输入的字符在字符匹配表中,则进行存储 //由于我们在识别字符时,会遇到各种尺寸的字符,故将所有的字符固定同一尺寸 Mat resizeRoi; resize(ROI, resizeRoi, Size(ImgWidth, ImgHeight)); //将图像转成浮点型,因为KNN训练数据集读取的是浮点型数据 Mat RoiFloat; resizeRoi.convertTo(RoiFloat, CV_32FC1); Train_Data.push_back(RoiFloat.reshape(0,1)); Train_Label.push_back(charVal); cout << charVal << endl; } } } 用PYTHON重写一下
时间: 2024-01-31 12:04:39 浏览: 72
以下是将上述代码翻译为 Python 代码的示例:
```python
import cv2
import numpy as np
# 定义字符匹配表
valid_chars = [ord('0'), ord('1'), ord('2'), ord('3'), ord('4'), ord('5'), ord('6'), ord('7'), ord('8'), ord('9')]
# 定义图像宽度和高度
img_width = 20
img_height = 30
# 读取图像
img = cv2.imread('image.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化图像
_, bin_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 查找轮廓
contours, _ = cv2.findContours(bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 创建训练数据集和标签
train_data = np.empty((0, img_width * img_height), dtype=np.float32)
train_label = np.empty((0, 1), dtype=np.int32)
# 循环遍历每个轮廓
for cnt in contours:
# 计算轮廓面积
area = cv2.contourArea(cnt)
if area > 10:
# 获取轮廓的边界矩形
x, y, w, h = cv2.boundingRect(cnt)
rect = (x, y, w, h)
# 在 Train_Chars 图像上绘制矩形
train_chars = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 提取ROI
roi = bin_img[y:y + h, x:x + w]
# 显示ROI图像
cv2.imshow('ROI', roi)
cv2.imshow('Training_Chars', train_chars)
# 通过键盘输入为字符打标签
char_val = cv2.waitKey(0)
# 如果输入的字符在字符匹配表中,则进行存储
if char_val in valid_chars:
# 将ROI图像固定尺寸
resize_roi = cv2.resize(roi, (img_width, img_height))
# 转换为浮点型数据
roi_float = resize_roi.astype(np.float32)
# 将图像数据添加到训练数据集中
train_data = np.append(train_data, roi_float.reshape(1, -1), axis=0)
# 将标签添加到训练标签中
train_label = np.append(train_label, char_val)
# 输出标签值
print(char_val)
# 显示结果图像
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上述代码中,我们首先读取了一张图像,然后将其转换为灰度图像,并进行二值化。接着,我们使用 `findContours` 函数找到了图像中的轮廓,并循环遍历每个轮廓。在每个轮廓上,我们通过键盘输入为字符打标签,并将其添加到训练数据集和标签中。最后,我们显示了结果图像。
阅读全文