mirror of
https://github.com/nizhangdaye/TLD_Code.git
synced 2024-11-23 20:39:06 +08:00
90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
|
import cv2 as cv
|
|||
|
import numpy as np
|
|||
|
from matplotlib import pyplot as plt
|
|||
|
import number_processing
|
|||
|
|
|||
|
|
|||
|
def cv_show(name, img):
|
|||
|
"""定义cv_show函数,用于显示图像"""
|
|||
|
cv.namedWindow(name, cv.WINDOW_NORMAL) # 窗口大小可调
|
|||
|
cv.resizeWindow(name, img.shape[1], img.shape[0]) # 窗口大小可调
|
|||
|
cv.imshow(name, img)
|
|||
|
cv.waitKey(0)
|
|||
|
cv.destroyAllWindows()
|
|||
|
|
|||
|
|
|||
|
def cv_info(name, img):
|
|||
|
"""
|
|||
|
定义cv_info函数,确认图像是否成功读取,并且打印图像的基本信息
|
|||
|
"""
|
|||
|
print(f"图像 {name} 信息如下:")
|
|||
|
if img is None:
|
|||
|
print("无法读取图像")
|
|||
|
else:
|
|||
|
print("图像数据类型:", img.dtype)
|
|||
|
print("图像类型:", type(img))
|
|||
|
print("图像尺寸:", img.shape)
|
|||
|
print("图像行数:", img.shape[0])
|
|||
|
print("图像列数:", img.shape[1])
|
|||
|
print()
|
|||
|
|
|||
|
|
|||
|
def find_line(img):
|
|||
|
"""
|
|||
|
定义find_line函数,用于寻找分界线
|
|||
|
返回一段图像的宽度
|
|||
|
"""
|
|||
|
for i in range(img.shape[1]): # 遍历 a 列
|
|||
|
if np.all(img[0, i] >= [230, 230, 230]):
|
|||
|
# 求该列像素均值,判断是否为白色
|
|||
|
mean = np.mean(img[:, i])
|
|||
|
if mean >= 240: # 像素均值大于 230 判断为白色
|
|||
|
print(f"分界线位置:{i}, 像素均值:{mean}", end="\n\n")
|
|||
|
return i
|
|||
|
return -1 # 如果没有找到符合条件的分界线,则返回图像的宽度
|
|||
|
|
|||
|
|
|||
|
def split_img(img):
|
|||
|
"""
|
|||
|
定义split_img函数,用于将图像分割并保存
|
|||
|
无返回值
|
|||
|
"""
|
|||
|
img_width = find_line(img) # 返回图像的宽度
|
|||
|
n = 0 # 用于计数分割得到的图像数
|
|||
|
for i in range(0, img.shape[1], img_width + 1): # 遍历 img 的每一列
|
|||
|
image = img[:, i: i + img_width]
|
|||
|
n += 1
|
|||
|
cv.imwrite(f"data/saved_img/image_{n}.PNG", image) # 保存图片 无损压缩格式 PNG
|
|||
|
|
|||
|
|
|||
|
def split_num(img):
|
|||
|
"""
|
|||
|
定义split_num函数,用于分割数字并保存
|
|||
|
返回数字
|
|||
|
"""
|
|||
|
# 将彩色图像转化为灰度图像
|
|||
|
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
|
|||
|
# 二值化处理,你可以根据需要调整阈值
|
|||
|
_, thresh = cv.threshold(img_gray, 128, 255, cv.THRESH_BINARY_INV)
|
|||
|
# 查找轮廓
|
|||
|
contours, _ = cv.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
|
|||
|
# 对轮廓进行排序,以便从左到右处理数字(可选)
|
|||
|
contours = sorted(contours, key=lambda x: cv.boundingRect(x)[0])
|
|||
|
|
|||
|
# 用于存储识别出的数字字符串
|
|||
|
recognized_digits = []
|
|||
|
|
|||
|
# 遍历每个轮廓,并保存每个数字的图片
|
|||
|
for i, contour in enumerate(contours):
|
|||
|
x, y, w, h = cv.boundingRect(contour)
|
|||
|
digit = thresh[y:y + h, x:x + w]
|
|||
|
# print(f"第{i+1}个数字的尺寸:{digit.shape[0]}")
|
|||
|
if digit.shape[0] < 5: # 小数点的轮廓太小,跳过
|
|||
|
break
|
|||
|
|
|||
|
recognized_digits.append(str(number_processing.num_list.index(digit.tolist())))
|
|||
|
|
|||
|
# # 保存数字图片
|
|||
|
# cv.imwrite(f'data/saved_img/digit_{i}.png', digit)
|
|||
|
return int("".join(recognized_digits))
|