{"id":455,"date":"2025-03-11T16:52:00","date_gmt":"2025-03-11T08:52:00","guid":{"rendered":"https:\/\/zechs.taipei\/?p=455"},"modified":"2025-03-20T13:38:09","modified_gmt":"2025-03-20T05:38:09","slug":"python-%e5%89%aa%e8%b2%bc%e7%b0%bf-ocr-%e5%b7%a5%e5%85%b7%e4%bd%bf%e7%94%a8%e6%95%99%e5%ad%b8","status":"publish","type":"post","link":"https:\/\/zechs.taipei\/?p=455","title":{"rendered":"[Python]\u526a\u8cbc\u7c3f OCR \u5de5\u5177\u4f7f\u7528\u6559\u5b78"},"content":{"rendered":"<p>\u9019\u662f\u4e00\u500b\u7c21\u55ae\u6613\u7528\u7684\u526a\u8cbc\u7c3f OCR \u5de5\u5177\uff0c\u53ef\u4ee5\u81ea\u52d5\u8b58\u5225\u5f9e Snipaste \u7b49\u622a\u5716\u5de5\u5177\u8907\u88fd\u5230\u526a\u8cbc\u7c3f\u7684\u5716\u7247\u5167\u5bb9\uff0c\u4e26\u8f49\u63db\u70ba\u6587\u5b57\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5fc5\u8981\u5b89\u88dd\u9805\u76ee<\/h2>\n\n\n\n<p>\u5728\u958b\u59cb\u4f7f\u7528\u524d\uff0c\u60a8\u9700\u8981\u5b89\u88dd\u4ee5\u4e0b\u9805\u76ee\uff1a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u5b89\u88dd Python<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f9e <a href=\"https:\/\/www.python.org\/downloads\/\" target=\"_blank\" rel=\"noreferrer noopener\">Python \u5b98\u7db2<\/a> \u4e0b\u8f09\u4e26\u5b89\u88dd Python 3.7 \u6216\u66f4\u9ad8\u7248\u672c<\/li>\n\n\n\n<li>\u5b89\u88dd\u6642\u52fe\u9078\u300cAdd Python to PATH\u300d\u9078\u9805<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u5b89\u88dd Tesseract OCR<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f9e <a href=\"https:\/\/github.com\/UB-Mannheim\/tesseract\/wiki\" target=\"_blank\" rel=\"noreferrer noopener\">Tesseract \u5b98\u65b9<\/a> \u4e0b\u8f09\u4e26\u5b89\u88dd Tesseract OCR<\/li>\n\n\n\n<li>\u5efa\u8b70\u9078\u64c7\u5e36\u6709\u4e2d\u6587\u548c\u82f1\u6587\u8a9e\u8a00\u5305\u7684\u5b89\u88dd\u9078\u9805<\/li>\n\n\n\n<li>\u8a18\u4f4f\u5b89\u88dd\u8def\u5f91\uff0c\u9810\u8a2d\u70ba <code>C:\\Program Files\\Tesseract-OCR<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u5b89\u88dd\u5fc5\u8981\u7684 Python \u5957\u4ef6<\/h3>\n\n\n\n<p>\u6253\u958b\u547d\u4ee4\u63d0\u793a\u5b57\u5143(CMD)\u6216 PowerShell\uff0c\u57f7\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install pyperclip pillow pytesseract<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. \u5b89\u88dd Snipaste<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f9e <a href=\"https:\/\/www.snipaste.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Snipaste \u5b98\u7db2<\/a> \u4e0b\u8f09\u4e26\u5b89\u88dd Snipaste<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u622a\u5716\u5feb\u6377\u9375\uff0c\u65b9\u4fbf\u4f7f\u7528<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u5de5\u5177\u8a2d\u7f6e\u8207\u4f7f\u7528<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u6b65\u9a5f\u4e00\uff1a\u4e0b\u8f09 OCR \u5de5\u5177\u7a0b\u5f0f\u78bc<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5efa\u7acb\u4e00\u500b\u65b0\u8cc7\u6599\u593e\u7528\u65bc\u5b58\u653e OCR \u5de5\u5177<\/li>\n\n\n\n<li>\u5728\u8cc7\u6599\u593e\u4e2d\u5275\u5efa\u4e00\u500b\u540d\u70ba <code>ocr_tool.py<\/code> \u7684\u6a94\u6848<\/li>\n\n\n\n<li>\u5c07\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u8907\u88fd\u5230\u6a94\u6848\u4e2d\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import tkinter as tk\nfrom tkinter import scrolledtext, messagebox, ttk\nimport pyperclip\nfrom PIL import ImageGrab, Image\nimport pytesseract\nimport threading\nimport os\nimport sys\n\ndef get_tesseract_path():\n    \"\"\"\u7372\u53d6 Tesseract \u53ef\u57f7\u884c\u6a94\u7684\u8def\u5f91\"\"\"\n    # \u9996\u5148\u6aa2\u67e5\u6a19\u6e96\u5b89\u88dd\u8def\u5f91\n    standard_paths = [\n        r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe',\n        r'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe'\n    ]\n\n    # \u6aa2\u67e5\u76f8\u5c0d\u8def\u5f91\n    script_dir = os.path.dirname(os.path.abspath(__file__))\n    relative_path = os.path.join(script_dir, 'Tesseract-OCR', 'tesseract.exe')\n\n    # \u6aa2\u67e5\u6240\u6709\u53ef\u80fd\u7684\u8def\u5f91\n    for path in standard_paths + [relative_path]:\n        if os.path.exists(path):\n            return path\n\n    # \u8fd4\u56de\u9810\u8a2d\u8def\u5f91\n    return r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'\n\nclass OCRApp:\n    def __init__(self, root):\n        self.root = root\n        self.root.title(\"\u526a\u8cbc\u7c3fOCR\u5de5\u5177\")\n        self.root.geometry(\"600x400\")\n\n        # \u8a2d\u5b9a Tesseract \u8def\u5f91\n        self.tesseract_path = get_tesseract_path()\n\n        # \u6aa2\u67e5 Tesseract \u662f\u5426\u53ef\u7528\n        if not os.path.exists(self.tesseract_path):\n            messagebox.showwarning(\n                \"\u627e\u4e0d\u5230Tesseract\", \n                f\"\u627e\u4e0d\u5230Tesseract OCR\u7a0b\u5f0f\u65bc: {self.tesseract_path}\\n\"\n                \"\u8acb\u78ba\u8a8d\u5df2\u6b63\u78ba\u5b89\u88ddTesseract OCR\u3002\"\n            )\n        else:\n            pytesseract.pytesseract.tesseract_cmd = self.tesseract_path\n\n        # \u53ef\u7528\u8a9e\u8a00\uff08\u9700\u8981\u78ba\u4fdd\u8a9e\u8a00\u6587\u4ef6\u5728 Tesseract \u8def\u5f91\u5167\uff09\n        self.languages = {\n            \"\u7e41\u9ad4\u4e2d\u6587+\u82f1\u6587\": \"chi_tra+eng\",\n            \"\u7c21\u9ad4\u4e2d\u6587+\u82f1\u6587\": \"chi_sim+eng\",\n            \"\u82f1\u6587\": \"eng\",\n            \"\u65e5\u6587+\u82f1\u6587\": \"jpn+eng\",\n            \"\u97d3\u6587+\u82f1\u6587\": \"kor+eng\"\n        }\n\n        # \u5275\u5efaGUI\u5143\u7d20\n        self.create_widgets()\n\n        # \u958b\u59cb\u6301\u7e8c\u6aa2\u67e5\u526a\u8cbc\u7c3f\n        self.check_clipboard()\n\n    def create_widgets(self):\n        # \u9802\u90e8\u6309\u9215\u6846\u67b6\n        button_frame = tk.Frame(self.root)\n        button_frame.pack(fill=tk.X, padx=10, pady=5)\n\n        # \u8cbc\u4e0a\u6309\u9215\n        self.paste_btn = tk.Button(button_frame, text=\"\u5f9e\u526a\u8cbc\u7c3f\u8b80\u53d6\u5716\u7247\", command=self.process_clipboard)\n        self.paste_btn.pack(side=tk.LEFT, padx=5)\n\n        # \u8907\u88fd\u6309\u9215\n        self.copy_btn = tk.Button(button_frame, text=\"\u8907\u88fd\u6587\u5b57\u5230\u526a\u8cbc\u7c3f\", command=self.copy_to_clipboard)\n        self.copy_btn.pack(side=tk.LEFT, padx=5)\n\n        # \u8a9e\u8a00\u9078\u64c7\n        lang_frame = tk.Frame(self.root)\n        lang_frame.pack(fill=tk.X, padx=10, pady=5)\n\n        tk.Label(lang_frame, text=\"OCR\u8a9e\u8a00:\").pack(side=tk.LEFT, padx=5)\n        self.lang_var = tk.StringVar()\n        self.lang_var.set(\"\u7e41\u9ad4\u4e2d\u6587+\u82f1\u6587\")  # \u9810\u8a2d\n\n        lang_dropdown = ttk.Combobox(lang_frame, textvariable=self.lang_var)\n        lang_dropdown['values'] = list(self.languages.keys())\n        lang_dropdown['state'] = 'readonly'\n        lang_dropdown.pack(side=tk.LEFT, padx=5)\n\n        # \u72c0\u614b\u6a19\u7c64\n        self.status_var = tk.StringVar()\n        self.status_var.set(\"\u5c31\u7dd2\")\n        self.status_label = tk.Label(lang_frame, textvariable=self.status_var)\n        self.status_label.pack(side=tk.RIGHT, padx=5)\n\n        # \u6587\u5b57\u5340\u57df\n        text_frame = tk.Frame(self.root)\n        text_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)\n\n        self.text_area = scrolledtext.ScrolledText(text_frame, wrap=tk.WORD)\n        self.text_area.pack(fill=tk.BOTH, expand=True)\n\n    def check_clipboard(self):\n        \"\"\"\u6301\u7e8c\u6aa2\u67e5\u526a\u8cbc\u7c3f\u4e2d\u7684\u5716\u7247\"\"\"\n        try:\n            # \u6aa2\u67e5\u526a\u8cbc\u7c3f\u662f\u5426\u5305\u542b\u5716\u7247\n            img = ImageGrab.grabclipboard()\n            if isinstance(img, Image.Image) and not hasattr(self, 'last_image'):\n                # \u6709\u65b0\u5716\u7247\n                self.last_image = img\n                # \u81ea\u52d5\u8655\u7406\u5716\u7247\n                self.process_clipboard()\n            elif isinstance(img, Image.Image) and hasattr(self, 'last_image'):\n                # \u8207\u4e0a\u4e00\u5f35\u5716\u7247\u6bd4\u8f03\uff08\u7c21\u5316\u6aa2\u67e5\uff09\n                if img.size != self.last_image.size:\n                    self.last_image = img\n                    self.process_clipboard()\n            elif not isinstance(img, Image.Image) and hasattr(self, 'last_image'):\n                # \u526a\u8cbc\u7c3f\u4e0d\u518d\u5305\u542b\u5716\u7247\n                delattr(self, 'last_image')\n\n        except Exception as e:\n            print(f\"\u6aa2\u67e5\u526a\u8cbc\u7c3f\u6642\u51fa\u932f: {e}\")\n\n        # 1\u79d2\u5f8c\u5b89\u6392\u4e0b\u4e00\u6b21\u6aa2\u67e5\n        self.root.after(1000, self.check_clipboard)\n\n    def process_clipboard(self):\n        \"\"\"\u4f7f\u7528OCR\u8655\u7406\u526a\u8cbc\u7c3f\u4e2d\u7684\u5716\u7247\"\"\"\n        try:\n            self.status_var.set(\"\u8655\u7406\u4e2d...\")\n            self.root.update()\n\n            # \u5f9e\u526a\u8cbc\u7c3f\u7372\u53d6\u5716\u7247\n            img = ImageGrab.grabclipboard()\n\n            if img is None or not isinstance(img, Image.Image):\n                self.status_var.set(\"\u526a\u8cbc\u7c3f\u4e2d\u6c92\u6709\u5716\u7247\")\n                return\n\n            # \u5728\u55ae\u7368\u7684\u7dda\u7a0b\u4e2d\u904b\u884cOCR\uff0c\u907f\u514dGUI\u51cd\u7d50\n            threading.Thread(target=self.perform_ocr, args=(img,), daemon=True).start()\n\n        except Exception as e:\n            self.status_var.set(f\"\u932f\u8aa4: {str(e)}\")\n\n    def perform_ocr(self, img):\n        \"\"\"\u5c0d\u5716\u7247\u57f7\u884cOCR\"\"\"\n        try:\n            # \u7372\u53d6\u9078\u5b9a\u7684\u8a9e\u8a00\n            lang_key = self.lang_var.get()\n            lang_code = self.languages.get(lang_key, \"chi_tra+eng\")\n\n            # \u78ba\u4fdd\u5716\u7247\u662f RGB \u6a21\u5f0f\n            if img.mode != 'RGB':\n                img = img.convert('RGB')\n\n            # \u5275\u5efa\u81e8\u6642\u76ee\u9304\uff08\u5982\u679c\u4e0d\u5b58\u5728\uff09\n            temp_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'temp')\n            os.makedirs(temp_dir, exist_ok=True)\n\n            # \u4fdd\u5b58\u70ba\u81e8\u6642\u6587\u4ef6\n            temp_path = os.path.join(temp_dir, 'temp_ocr_image.png')\n            img.save(temp_path, format='PNG')\n\n            # \u5f9e\u6587\u4ef6\u8b80\u53d6\u4e26\u57f7\u884c OCR\n            text = pytesseract.image_to_string(Image.open(temp_path), lang=lang_code)\n\n            # \u522a\u9664\u81e8\u6642\u6587\u4ef6\n            try:\n                os.remove(temp_path)\n            except:\n                pass\n\n            # \u5728\u4e3b\u7dda\u7a0b\u4e2d\u66f4\u65b0\u6587\u5b57\u5340\u57df\n            self.root.after(0, self.update_text_area, text)\n\n        except Exception as e:\n            self.root.after(0, self.update_status, f\"OCR\u932f\u8aa4: {str(e)}\")\n\n    def update_text_area(self, text):\n        \"\"\"\u4f7f\u7528OCR\u7d50\u679c\u66f4\u65b0\u6587\u5b57\u5340\u57df\"\"\"\n        self.text_area.delete(1.0, tk.END)\n        self.text_area.insert(tk.INSERT, text)\n        self.status_var.set(\"OCR\u5b8c\u6210\")\n\n    def update_status(self, message):\n        \"\"\"\u66f4\u65b0\u72c0\u614b\u6a19\u7c64\"\"\"\n        self.status_var.set(message)\n\n    def copy_to_clipboard(self):\n        \"\"\"\u5c07\u6587\u5b57\u8907\u88fd\u5230\u526a\u8cbc\u7c3f\"\"\"\n        text = self.text_area.get(1.0, tk.END).strip()\n        if text:\n            pyperclip.copy(text)\n            self.status_var.set(\"\u5df2\u8907\u88fd\u5230\u526a\u8cbc\u7c3f\")\n        else:\n            self.status_var.set(\"\u6c92\u6709\u6587\u5b57\u53ef\u8907\u88fd\")\n\nif __name__ == \"__main__\":\n    root = tk.Tk()\n    app = OCRApp(root)\n    root.mainloop()<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6b65\u9a5f\u4e8c\uff1a\u904b\u884c OCR \u5de5\u5177<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6253\u958b\u547d\u4ee4\u63d0\u793a\u5b57\u5143\u6216 PowerShell<\/li>\n\n\n\n<li>\u5c0e\u822a\u5230\u5305\u542b <code>ocr_tool.py<\/code> \u7684\u8cc7\u6599\u593e<\/li>\n\n\n\n<li>\u57f7\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python ocr_tool.py<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>OCR \u5de5\u5177\u8996\u7a97\u5c07\u6703\u555f\u52d5<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u5982\u4f55\u4f7f\u7528 OCR \u5de5\u5177<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u57fa\u672c\u529f\u80fd<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u81ea\u52d5\u8b58\u5225<\/strong>\uff1a\u5de5\u5177\u6703\u81ea\u52d5\u76e3\u8996\u526a\u8cbc\u7c3f\uff0c\u7576\u6709\u65b0\u5716\u7247\u8907\u88fd\u5230\u526a\u8cbc\u7c3f\u6642\u81ea\u52d5\u57f7\u884c OCR<\/li>\n\n\n\n<li><strong>\u624b\u52d5\u89f8\u767c<\/strong>\uff1a\u9ede\u64ca\u300c\u5f9e\u526a\u8cbc\u7c3f\u8b80\u53d6\u5716\u7247\u300d\u6309\u9215\u53ef\u624b\u52d5\u89f8\u767c\u8b58\u5225<\/li>\n\n\n\n<li><strong>\u8907\u88fd\u7d50\u679c<\/strong>\uff1a\u9ede\u64ca\u300c\u8907\u88fd\u6587\u5b57\u5230\u526a\u8cbc\u7c3f\u300d\u6309\u9215\u53ef\u8907\u88fd\u8b58\u5225\u7d50\u679c\u5230\u526a\u8cbc\u7c3f<\/li>\n\n\n\n<li><strong>\u591a\u8a9e\u8a00\u652f\u63f4<\/strong>\uff1a\u53ef\u5f9e\u4e0b\u62c9\u9078\u55ae\u9078\u64c7\u8b58\u5225\u8a9e\u8a00\uff08\u9700\u8981\u5b89\u88dd\u5c0d\u61c9\u7684\u8a9e\u8a00\u5305\uff09<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u7d50\u5408 Snipaste \u4f7f\u7528\u7684\u6d41\u7a0b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6309\u4e0b Snipaste \u8a2d\u5b9a\u7684\u622a\u5716\u5feb\u6377\u9375\uff08\u9810\u8a2d\u70ba F1\uff09<\/li>\n\n\n\n<li>\u622a\u53d6\u5305\u542b\u6587\u5b57\u7684\u5340\u57df<\/li>\n\n\n\n<li>\u6309\u4e0b F3 \u81ea\u52d5\u8907\u88fd\u622a\u5716\u5230\u526a\u8cbc\u7c3f<\/li>\n\n\n\n<li>OCR \u5de5\u5177\u5c07\u81ea\u52d5\u6aa2\u6e2c\u5230\u65b0\u5716\u7247\u4e26\u57f7\u884c\u6587\u5b57\u8b58\u5225<\/li>\n\n\n\n<li>\u8b58\u5225\u5b8c\u6210\u5f8c\uff0c\u53ef\u4ee5\u9ede\u64ca\u300c\u8907\u88fd\u6587\u5b57\u5230\u526a\u8cbc\u7c3f\u300d\u6309\u9215\u5c07\u7d50\u679c\u8907\u88fd\u51fa\u4f86<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u63d0\u9ad8\u8b58\u5225\u51c6\u78ba\u7387\u7684\u6280\u5de7<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4fdd\u6301\u6587\u5b57\u6e05\u6670<\/strong>\uff1a\u622a\u5716\u6642\u78ba\u4fdd\u6587\u5b57\u6e05\u6670\u53ef\u898b<\/li>\n\n\n\n<li><strong>\u88c1\u526a\u7cbe\u6e96<\/strong>\uff1a\u53ea\u622a\u53d6\u5305\u542b\u6587\u5b57\u7684\u5340\u57df\uff0c\u6e1b\u5c11\u80cc\u666f\u5e72\u64fe<\/li>\n\n\n\n<li><strong>\u9078\u64c7\u6b63\u78ba\u8a9e\u8a00<\/strong>\uff1a\u6839\u64da\u5716\u7247\u4e2d\u7684\u6587\u5b57\u9078\u64c7\u9069\u7576\u7684\u8b58\u5225\u8a9e\u8a00<\/li>\n\n\n\n<li><strong>\u8abf\u6574\u5c0d\u6bd4\u5ea6<\/strong>\uff1a\u5982\u679c\u6587\u5b57\u8207\u80cc\u666f\u5c0d\u6bd4\u5ea6\u4e0d\u9ad8\uff0c\u53ef\u4ee5\u4f7f\u7528 Snipaste \u7684\u6a19\u8a18\u5de5\u5177\u8abf\u6574<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u5e38\u898b\u554f\u984c\u89e3\u6c7a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u5982\u4f55\u66f4\u65b0 OCR \u8a9e\u8a00\u652f\u6301\uff1f<\/h3>\n\n\n\n<p>\u5982\u9700\u6dfb\u52a0\u66f4\u591a\u8a9e\u8a00\u652f\u6301\uff0c\u8acb\u5728 Tesseract \u5b89\u88dd\u76ee\u9304\u7684 <code>tessdata<\/code> \u6587\u4ef6\u593e\u4e2d\u6dfb\u52a0\u5c0d\u61c9\u7684\u8a9e\u8a00\u6587\u4ef6\uff08.traineddata\uff09\u3002\u8a9e\u8a00\u6587\u4ef6\u53ef\u5f9e <a href=\"https:\/\/github.com\/tesseract-ocr\/tessdata\" target=\"_blank\" rel=\"noreferrer noopener\">Tesseract GitHub<\/a> \u4e0b\u8f09\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5982\u4f55\u5275\u5efa\u684c\u9762\u6377\u5f91\uff1f<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5275\u5efa\u4e00\u500b\u65b0\u7684\u6587\u672c\u6587\u4ef6\uff0c\u547d\u540d\u70ba <code>\u555f\u52d5OCR\u5de5\u5177.bat<\/code><\/li>\n\n\n\n<li>\u7de8\u8f2f\u6587\u4ef6\uff0c\u6dfb\u52a0\u4ee5\u4e0b\u5167\u5bb9\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@echo off\ncd \/d \"\u5b8c\u6574\u8def\u5f91\u5230\u60a8\u7684OCR\u5de5\u5177\u8cc7\u6599\u593e\"\npython ocr_tool.py<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u5c07\u6b64\u6279\u8655\u7406\u6587\u4ef6\u4fdd\u5b58\u5728\u684c\u9762\u6216\u5176\u4ed6\u65b9\u4fbf\u8a2a\u554f\u7684\u4f4d\u7f6e<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u7d50\u8a9e<\/h2>\n\n\n\n<p>\u9019\u500b\u7c21\u55ae\u7684 OCR \u5de5\u5177\u53ef\u4ee5\u5e6b\u52a9\u60a8\u5feb\u901f\u8b58\u5225\u526a\u8cbc\u7c3f\u4e2d\u7684\u5716\u7247\u6587\u5b57\u3002\u7d50\u5408 Snipaste \u4f7f\u7528\uff0c\u80fd\u986f\u8457\u63d0\u9ad8\u6587\u5b57\u63a1\u96c6\u548c\u8655\u7406\u7684\u6548\u7387\u3002\u53ea\u8981\u6309\u7167\u4e0a\u8ff0\u6b65\u9a5f\u8a2d\u7f6e\uff0c\u60a8\u5c31\u53ef\u4ee5\u4eab\u53d7\u4fbf\u6377\u7684\u6587\u5b57\u8b58\u5225\u9ad4\u9a57\u3002<\/p>\n\n\n\n<p>\u5e0c\u671b\u9019\u500b\u5de5\u5177\u80fd\u5e6b\u52a9\u5230\u60a8\u7684\u65e5\u5e38\u5de5\u4f5c\uff01<\/p>","protected":false},"excerpt":{"rendered":"<p>\u9019\u662f\u4e00\u500b\u7c21\u55ae\u6613\u7528\u7684\u526a\u8cbc\u7c3f OCR \u5de5\u5177\uff0c\u53ef\u4ee5\u81ea\u52d5\u8b58\u5225\u5f9e Snipaste \u7b49\u622a\u5716\u5de5\u5177\u8907\u88fd\u5230\u526a\u8cbc\u7c3f\u7684\u5716\u7247\u5167\u5bb9\uff0c\u4e26 &#8230; <a title=\"[Python]\u526a\u8cbc\u7c3f OCR \u5de5\u5177\u4f7f\u7528\u6559\u5b78\" class=\"read-more\" href=\"https:\/\/zechs.taipei\/?p=455\" aria-label=\"\u95b1\u8b80\u3008[Python]\u526a\u8cbc\u7c3f OCR \u5de5\u5177\u4f7f\u7528\u6559\u5b78\u3009\u5168\u6587\">\u95b1\u8b80\u5168\u6587<\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-455","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/posts\/455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zechs.taipei\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=455"}],"version-history":[{"count":2,"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/posts\/455\/revisions"}],"predecessor-version":[{"id":462,"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/posts\/455\/revisions\/462"}],"wp:attachment":[{"href":"https:\/\/zechs.taipei\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zechs.taipei\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zechs.taipei\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}