我正在从视频流中捕获帧。在随机时刻,在恒定的位置上,红色渐变背景上有白色文本。 我想从这个框架中获取文本(我使用 pytesseract(并将其保存到数据库中,那么我如何检测该帧呢? 当框架不包含文本时,pytesseract 返回无意义的东西,我的代码将它们发送到数据库 - 这是不可接受的。框架被裁剪,因此只包含红色背景上的白色文本(只有大写字母,一行或两行(或其他随机内容。有时可能会出现裁剪不好的情况,因为红色矩形的高度像这种组合一样减小,或者不幸的是还有其他文本。在这些情况下,皮特塞拉特很弱。
import cv2
import pytesseract
import time
import mysql.connector
from difflib import SequenceMatcher
recent = ""
while True:
cap = cv2.VideoCapture(VIDEO_URL)
ret, frame = cap.read()
img = cv2.cvtColor(frame, cv2.IMREAD_COLOR)[815:970, 360:1920] #crop frame
text = pytesseract.image_to_string(img)
if SequenceMatcher(None, recent, text).ratio() < 0.5: #save only when text is new
sql = "INSERT INTO table(content, date) VALUES(%s ,%s)"
val = (text, time.localtime())
mycursor.execute(sql, val)
db.commit()
recent = text
如何改进此解决方案并仅处理在红色渐变背景上带有白色文本的裁剪帧? 对于这个解决方案,有什么比pytesseract更好的吗?
您可以使用颜色过滤来查找蒙版,然后根据蒙版占用的区域百分比来决定是否需要提取 not 的文本。 修改后的代码:
import cv2
import pytesseract
import time
import numpy as np
import mysql.connector
from difflib import SequenceMatcher
# bound for red colour
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
threshold = 35
recent = ""
while True:
cap = cv2.VideoCapture(VIDEO_URL)
ret, frame = cap.read()
img = cv2.cvtColor(frame, cv2.IMREAD_COLOR)[815:970, 360:1920] #crop frame
h, w = img.shape[:2]
# converting to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# filtering
mask = cv2.inRange(hsv, lower_red, upper_red)
# percentage of area which is red
total = h * w
count = cv2.countNonZero(mask)
percentage = (100 * count) / total
if SequenceMatcher(None, recent, text).ratio() < 0.5 and percentage >= threshold: #save only when text is new
custom_config = r'--oem 3 --psm 6'
text = pytesseract.image_to_string(mask, config=custom_config)
sql = "INSERT INTO table(content, date) VALUES(%s ,%s)"
val = (text, time.localtime())
mycursor.execute(sql, val)
db.commit()
recent = text
此外,您还可以通过找到mask
中最大的连接组件并仅考虑该部件来改善这一点