【问题标题】:Unix terminal screenshot to textUnix 终端屏幕截图到文本
【发布时间】: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 在白色背景上的黑色文本效果更好。
  • 在 linux 上你可以使用 script output.txt 然后它将所有显示的文本保存在文件 output.txt 中 - 直到你运行 exit
  • 谢谢,我会尝试反转文本的图像,看看是否有任何改进。这个想法的原因是由于我工作的远程环境不允许从远程终端复制/粘贴到本地机器并且没有 sftp 访问。所以想看看是否可以从远程终端的屏幕截图中提取文本。

标签: python opencv python-tesseract


【解决方案1】:

据我了解,您希望将命令的输出保存在“text_from_terminal.txt”中,如果您愿意,那么您可以通过以下代码简单地执行此操作:-

import os

output = os.popen("ls -lrt").read()

with open("text_from_terminal.txt","w+") as file:
    file.write(output)

【讨论】:

  • 不,那不是我想做的。正如我所说,我有一个 unix 终端的屏幕截图。我希望能够从该图像中提取文本。
猜你喜欢
  • 2014-03-31
  • 1970-01-01
  • 2013-08-17
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多