- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个函数,该函数将获取房屋平面图的 jpg 并使用 OCR 提取图像上某处写入的平方英尺
import requests
from PIL import Image
import pytesseract
import pandas as pd
import numpy as np
import cv2
import io
def floorplan_ocr(url):
""" a row-wise function to use pytesseract to scrape the word data from the floorplan
images, requires tesseract
to be installed https://github.com/tesseract-ocr/tesseract/wiki"""
if pd.isna(url):
return np.nan
res = ''
response = requests.get(url, stream=True)
if response.status_code == 200:
img = response.raw
img = np.asarray(bytearray(img.read()), dtype="uint8")
img = cv2.imdecode(img, cv2.CV_8UC1)
img = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2)
#img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
res = pytesseract.image_to_string(img, lang='eng', config='--remove-background')
del response
del img
else:
return np.nan
#print(res)
return res
但是我并没有取得太大的成功。只有大约四分之一的图像实际输出包含平方英尺的文本。
例如目前floorplan_ocr(https://i.imgur.com/9qwozIb.jpg)
输出 'K\'Fréfiéfimmimmuuéé\n2|; apprnxx 135 max\nGArhaPpmxd1m max\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n总计 APPaux 中午区域 523,因此,我们。 a 50. M )\nav .Wzms 他 "a! m m... mi 粗心 mmnmrmm mma y“妈妈“;\n' wmduw: 令 m wuhrmmm mm“.m nanspmmmmy 3 mm :51\nmm"m mmm m ; wan wmumw- mm my 和 mm mm as m by any\nwfmw PM” rmwm mm m .pwmwm m。 mum mud ms nu mum.\n(.5 n: ma undammmw an we Ewen\nM vagw‘m Mewpkeem'
(并且需要很长时间才能完成)
floorplan_ocr(https://i.imgur.com/sjxMpVp.jpg)
输出 ' '
。
我认为我面临的一些问题是:
我陷入困境,正在努力提高我的成绩。我想要提取的是“XXX sq ft”(以及所有可能的书写方式)
有更好的方法吗?
非常感谢。
最佳答案
通过应用这几行来调整第二张图像的大小并更改对比度/亮度,在裁剪图像的底部四分之一之后:
img = cv2.imread("download.jpg")
img = cv2.resize(img, (0, 0), fx=2, fy=2)
img = cv2.convertScaleAbs(img, alpha=1.2, beta=-40)
text = pytesseract.image_to_string(img, config='-l eng --oem 1 --psm 3')
我设法得到这个结果:
TOTAL APPROX. FLOOR AREA 528 SQ.FT. (49.0 SQ.M.)
Whilst every attempt has been made to ensure the accuracy of the floor plan contained here, measurements: of doors, windows, rooms and any other items are approximate and no responsibility ts taken for any error, omission, or mis-statement. This plan is for @ustrative purposes only and should be used as such by any prospective purchaser. The services, systems and appliances shown have not been tested and no guarantee a8 to the operability or efficiency can be given Made with Metropix ©2019
我没有对图像进行阈值处理,因为您的图像结构彼此不同,并且由于图像不仅仅是文本,因此 OTSU 阈值处理找不到正确的值。
回答所有问题:Tesseract 实际上最适合灰度图像(白色背景上的黑色文本)。
关于 DPI/分辨率问题,确实存在一些争论,但也有一些经验事实:DPI 值并不重要(因为相同 DPI 的文本大小可能会有所不同)。为了使 Tesseract OCR 发挥最佳效果,您的字符需要(已编辑:)30-33 像素(高度),小几个像素可能会使 Tesseract 几乎毫无用处,而较大的字符实际上会降低准确性,尽管并不显着。 (编辑:找到来源->https://groups.google.com/forum/#!msg/tesseract-ocr/Wdh_JJwnw94/24JHDYQbBQAJ)
最后,文本格式并没有真正改变(至少在你的例子中)。所以这里的主要问题是文本大小,以及解析整个页面的事实。如果您想要的文本行始终位于图像的底部,只需提取(切片)原始图像,这样您只需向 Tesseract 提供相关数据,这也会使其速度更快。
编辑:如果您也在寻找一种从 OCR 文本中提取平方英尺的方法:
text = "some place holder text 5471 square feet some more text"
# store here all the possible way it can be written
sqft_list = ["sq ft", "square feet", "sqft"]
extracted_value = ""
for sqft in sqft_list:
if sqft in text:
start = text.index(sqft) - 1
end = start + len(sqft) + 1
while text[start - 1] != " ":
start -= 1
extracted_value = text[start:end]
break
print(extracted_value)
5471 square feet
关于python - 使用 tesseract 和 OpenCV 对平面图屏幕截图进行 OCR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58030833/
图像采集源除了显示控件(上一篇《.NET 控件转图片》有介绍从界面控件转图片),更多的是窗口以及屏幕。 窗口截图最常用的方法是GDI,直接上Demo吧: 1 private
我正在尝试编写一个程序来使用全局热键获取屏幕截图。下面是相应的代码: from datetime import datetime import os from pynput import keyboa
我正在构建一个应用程序,它应该为任何具有 Android 4 及更高版本的无根设备实现屏幕~镜像~,2 帧/秒就足够了。 我正在尝试使用 ADB“framebuffer:”命令来抓取设备屏幕截图 AD
如何使用 C++ 捕获屏幕截图?我将使用 Win32。 请不要使用 MFC 代码。 最佳答案 #include "windows.h" // should be less than and great
代码如下: import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.aw
我目前正在构建一个 Google Chrome 扩展程序,该扩展程序可以从不同页面获取多个屏幕截图并将其发布到端点上。我遇到的问题是时间不对。我的意思是,在页面停止加载之前就太早截取屏幕截图了。其次,
我有一个 View Controller ,其中导航栏是透明的。我的下一个 View 是表格 View ,其中导航栏是白色的。 为了停止不需要的动画,我在表格 View 的“viewDidDissap
我正在尝试从多个 URL 制作屏幕截图。我的代码工作正常,但结果我得到了事件窗口的图像。但我需要带有浏览器顶部的完整屏幕截图(URL) file = open('links.txt', 'r', en
我正在尝试(并实现)获取屏幕截图: robot = new Robot(); BufferedImage biScreen = robot.createScreenCapture(rectScreen
是否有任何应用程序可以拍摄 android 设备的视频/屏幕截图。我知道在桌面上捕获屏幕视频/图像的软件很少,例如 camtasia、snagit。 Android 设备有类似的东西吗? 我知道使用
想要捕获可能处于非事件状态的选项卡的图像。 问题是,当使用此处显示的方法时,选项卡通常在捕获完成之前没有时间加载,从而导致失败。 chrome.tabs.update() 回调在标签页被捕获之前执行。
我想在新的 tkinter 窗口 (TopLevel) 中显示我的屏幕截图,但我不想将其保存在电脑上。当我保存它时它工作正常但是当我尝试从内存加载屏幕截图时出现错误:图像不存在。 我的主窗口是root
我正在 try catch 我当前所在的屏幕,因此当我覆盖下一个 View Controller 时,我可以使它成为它后面的 ImageView 并使其显示为半透明。这是有效的,但现在它在中间产生了一
我正在寻找将 docx(以及后来的 excel 和 powerpoint)文档的第一页转换为图像的方法。我宁愿不手动解析文档的整个 xml,因为这看起来工作量很大;) 所以我想我只是想收集一些关于如何
好吧,碰巧我正在编写一个程序来截取一些屏幕截图,并且在处理另一个进程已经在使用的文件时遇到了一些困难,希望有人能帮助我找到一种方法来“关闭”这个进程或启发我如何继续. //Create a new b
我即将在 App Store 上发布我的应用程序,我想截取我的应用程序的屏幕截图,但状态栏中没有所有信息,例如运营商和 Debug模式等。 我知道 Marshmallow 有一个 System UI
UIGraphicsBeginImageContext(self.reportList.frame.size); CGRect tableViewFrame = self.reportList.fra
是否有任何简洁的方法来访问 android 设备的屏幕截图以编程方式。我正在寻找大约 15-20fps。 我找到了一个代码android\generic\frameworks\base\service
好的,我正在尝试为多个网站运行多个屏幕截图!我已经获得了多个站点的一个屏幕截图,我还可以获得一个站点的多个 Viewport 屏幕截图,但我有 34 个站点需要这样做!那么有人知道用 casperjs
我正在为 iOS 制作一个贴纸包,在将其提交到 App Store 之前,我需要包含至少一张来自 5.5 英寸 iPhone 和 12.9 英寸 iPad Pro 的应用截图。这些都是我没有的设备。
我是一名优秀的程序员,十分优秀!