【发布时间】:2020-12-29 00:54:49
【问题描述】:
考虑到这可能是一项相当容易的任务,我想截取一个 unix 终端的屏幕截图并将其转换为文本,或者就像我从终端复制该文本一样。我一直在挖掘,图像到文本的常见选择似乎是 cv2 清理和识别相关区域的然后 tesseract 用于将识别区域转换为文本。下面的代码来自各种在线资源,但我不得不说我不完全知道这些功能都在做什么或如何实现我的预期输出。
代码只是将整个屏幕截图标识为提供给 tesseract 的一个计数,它的处理似乎是以列而不是行来处理它。
有没有我可以在每条线周围绘制矩形并因此逐行传递给 tesseract 的地方?
**更新:**我在将 tesseact 配置设置为“--psm 6”方面取得了更大的成功。然而,有些字母没有被完全正确地检测到。我还需要做些什么来清理图像吗?
# Import required packages
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Users\cdoyle5\AppData\Local\Tesseract-OCR\tesseract.exe'
img = cv2.imread("term1.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 20))
dilation = cv2.dilate(thresh1, rect_kernel, iterations=1)
contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
im2 = img.copy()
with open("text_from_terminal.txt", "w+") as file:
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(im2, (x, y), (x + w, y + h), (0, 255, 0), 2)
# Cropping the text block for giving input to OCR
cropped = im2[y:y + h, x:x + w]
cv2.imshow("cropped", cropped)
cv2.waitKey(0)
text = pytesseract.image_to_string(cropped)
print("detected: ", text)
# Appending the text into file
file.write(text + "\n")
预期输出
ubuntu@vps-f116ed9f:~$ ls -lrt
total 538160
-rw-rw-r-- 1 ubuntu ubuntu 508206724 Oct 17 07:23 splunk-8.1.0-f57c09e87251-Linux-x86_64.tgz
drwxr-xr-x 3 ubuntu ubuntu 4096 Nov 1 21:17 snap
-rw-rw-r-- 1 ubuntu ubuntu 42847944 Nov 17 09:56 splunkforwarder-8.1.0-f57c09e87251-linux-2.6-x86_64.rpm
-rw-rw-r-- 1 ubuntu ubuntu 0 Nov 17 20:10 test
drwxrwxr-x 3 ubuntu ubuntu 4096 Dec 2 11:56 TM129VCE
-rw-rw-r-- 1 ubuntu ubuntu 226 Dec 8 16:34 Dockerfile
drwxrwxr-x 2 ubuntu ubuntu 4096 Dec 28 23:27 screen_to_text
实际输出
ubuntu@v'ps—f116ed9f: 5.: ls —1rt
total 5 3 B 1 6 0
—rw—rw—r——
drwxrixrix
—rw—rw—r——
—rw—rw—r——
drwxrwxrix
—rw—rw—r——
drwxrwxrix
~>—Aw>—‘>—Aw>—A
ubuntu
ubuntu
ubuntu
ubuntu
ubuntu
ubuntu
ubuntu
ubuntu 503206724
ubuntu 4 0 9 6
ubuntu 42B47944
ubuntu 0
ubuntu 4 0 9 6
ubuntu 2 2 6
4 0 9 6
ubuntu
Oct
NOV
NOV
NOV
Dec
Dec
Dec
17
17
17
2B
07:23
21:17
09:56
20:10
11:56
16:34
23:27
sp1unk—a.1.0—f57c09ea7251—Linux—xa6_64.tgz
Snap
sp1unkforwarder—a.1.0—f57c09ea7251—1inux—2.6—xa6_64.rpm
test
TM129VCE
Dockerfile
screen_to_text
【问题讨论】:
-
如果你想要一些命令的结果作为文本然后将它重定向到文件即。
ls -lrt > output.txt -
tesseract 在白色背景上的黑色文本效果更好。
-
tesseract 文档:Improving the quality of the output
-
在 linux 上你可以使用
script output.txt然后它将所有显示的文本保存在文件output.txt中 - 直到你运行exit -
谢谢,我会尝试反转文本的图像,看看是否有任何改进。这个想法的原因是由于我工作的远程环境不允许从远程终端复制/粘贴到本地机器并且没有 sftp 访问。所以想看看是否可以从远程终端的屏幕截图中提取文本。
标签: python opencv python-tesseract