最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python基于OCR實(shí)現(xiàn)圖片識(shí)別翻譯工具功能(附源碼)

 更新時(shí)間:2025年11月04日 09:49:13   作者:PythonFun  
這篇文章主要為大家詳細(xì)介紹了Python如何通過(guò)智能OCR文字識(shí)別和精準(zhǔn)翻譯技術(shù),實(shí)現(xiàn)一鍵截圖翻譯,大幅提升跨語(yǔ)言閱讀效率,讓語(yǔ)言不再成為信息獲取的障礙,感興趣的可以了解下

一、軟件名稱

OCR圖片識(shí)別翻譯工具

二、軟件簡(jiǎn)介

本軟件主要解決用戶在閱讀外文圖片、截圖或界面文字時(shí)遇到的語(yǔ)言障礙痛點(diǎn)。通過(guò)智能OCR文字識(shí)別和精準(zhǔn)翻譯技術(shù),實(shí)現(xiàn)一鍵截圖翻譯,大幅提升跨語(yǔ)言閱讀效率,讓語(yǔ)言不再成為信息獲取的障礙。

三、軟件功能

本軟件是一款基于AI技術(shù)的智能OCR識(shí)別翻譯工具,主要功能包括:

1. 智能區(qū)域截圖:支持自定義框選截圖區(qū)域,精準(zhǔn)捕獲需要翻譯的內(nèi)容

2. AI文字識(shí)別:采用先進(jìn)的AI OCR技術(shù),準(zhǔn)確提取圖片中的文字信息

3. 智能翻譯引擎:集成小牛翻譯API,支持英漢互譯

4. 自動(dòng)語(yǔ)言檢測(cè):智能識(shí)別原文語(yǔ)種,自動(dòng)選擇翻譯方向

5. 結(jié)果展示窗口:提供獨(dú)立的懸浮窗口顯示識(shí)別和翻譯結(jié)果

6. 文本復(fù)制功能:支持一鍵復(fù)制原文和譯文到剪貼板

7. 字體縮放:提供文本放大顯示功能,便于閱讀長(zhǎng)文本內(nèi)容

四、使用方法和操作步驟

運(yùn)行程序后,桌面會(huì)出現(xiàn)一個(gè)懸浮翻譯窗口

按下快捷鍵 Ctrl+Alt+A 激活截圖功能,或者點(diǎn)界面上的截圖鍵開(kāi)始截圖

用鼠標(biāo)框選需要識(shí)別翻譯的屏幕區(qū)域

程序自動(dòng)識(shí)別區(qū)域內(nèi)的文字并顯示"識(shí)別中..."提示

識(shí)別完成后自動(dòng)進(jìn)行翻譯并顯示"翻譯中..."提示

在懸浮窗口中同時(shí)顯示原文和譯文結(jié)果

可點(diǎn)擊"復(fù)制"按鈕將內(nèi)容復(fù)制到剪貼板

五、運(yùn)行環(huán)境

系統(tǒng)要求:Windows操作系統(tǒng)

Python環(huán)境:需要安裝相關(guān)依賴庫(kù)(PIL、tkinter、keyboard、mss等)

運(yùn)行方式:直接運(yùn)行Python腳本

六、技術(shù)特點(diǎn)說(shuō)明

1. OCR識(shí)別技術(shù)

主方案:基于智譜AI的GLM-4V視覺(jué)模型,準(zhǔn)確率高

備用方案:集成Tesseract OCR引擎,確保服務(wù)穩(wěn)定性

精準(zhǔn)提?。簢?yán)格保持原文內(nèi)容,不增刪改寫(xiě)

2. 翻譯服務(wù)

翻譯引擎:小牛翻譯API,專業(yè)翻譯服務(wù)

語(yǔ)言支持:支持中英文互譯,可擴(kuò)展其他語(yǔ)言

自動(dòng)檢測(cè):智能判斷原文語(yǔ)種,自動(dòng)選擇翻譯方向

3. 截圖技術(shù)

使用mss庫(kù)進(jìn)行高效屏幕捕獲

支持高DPI屏幕顯示

區(qū)域選擇精準(zhǔn),操作流暢

七、特色亮點(diǎn)

操作便捷:快捷鍵一鍵觸發(fā),簡(jiǎn)單易用

識(shí)別準(zhǔn)確:AI OCR技術(shù),文字識(shí)別精度高

翻譯專業(yè):專業(yè)翻譯引擎,譯文質(zhì)量可靠

實(shí)時(shí)顯示:獨(dú)立懸浮窗口,結(jié)果展示清晰

雙重保障:主備OCR方案,確保服務(wù)穩(wěn)定

界面美觀:深色主題設(shè)計(jì),視覺(jué)效果舒適

代碼開(kāi)源:可自定義修改,滿足個(gè)性化需求

八、注意事項(xiàng)

1. 使用前請(qǐng)確保網(wǎng)絡(luò)連接正常,OCR和翻譯服務(wù)需要聯(lián)網(wǎng)

2. 首次使用可能需要配置相關(guān)API密鑰

3. 截圖時(shí)請(qǐng)確保目標(biāo)區(qū)域文字清晰可見(jiàn)

4. 對(duì)于特殊字體或復(fù)雜背景的圖片,識(shí)別準(zhǔn)確率可能受影響

5. 本工具僅適用于一般圖片翻譯,專業(yè)領(lǐng)域翻譯建議人工校對(duì)

九、界面展示

十、源碼展示

import os
import tkinter as tk
from urllib import parse, request
import json
import keyboard  # 監(jiān)聽(tīng)快捷鍵
import base64
from io import BytesIO
from zai import ZhipuAiClient  # 取消注釋
import ctypes
import mss
import mss.tools
from PIL import Image
 
# ================== 小牛翻譯 ==================
apikey = "d99fc0600b16efa6e310f53579593c57"
 
def niutrans_translate(sentence, src_lan="auto", tgt_lan="zh"):
    try:
        url = 'http://api.niutrans.com/NiuTransServer/translation?'
        data = {"from": src_lan, "to": tgt_lan, "apikey": apikey, "src_text": sentence}
        data_en = parse.urlencode(data)
        req = url + "&" + data_en
        res = request.urlopen(req, timeout=5)
        res_dict = json.loads(res.read())
        if "tgt_text" in res_dict:
            return res_dict['tgt_text']
        else:
            return f"翻譯失敗: {res_dict}"
    except Exception as e:
        return f"翻譯接口錯(cuò)誤: {str(e)}"
 
# ================== 框選截圖區(qū)域 ==================
def select_area():
    # 預(yù)初始化Tkinter,避免第一次創(chuàng)建窗口時(shí)的跳動(dòng)
    root = tk.Tk()
    root.withdraw()  # 隱藏預(yù)初始化窗口
    root.update_idletasks()
     
    # 創(chuàng)建實(shí)際的全屏窗口
    root = tk.Tk()
    root.attributes("-fullscreen", True)
    root.attributes("-alpha", 0.3)
    # 設(shè)置窗口位置確保不會(huì)影響主界面
    root.geometry("0x0+0+0")
    root.update_idletasks()
     
    canvas = tk.Canvas(root, cursor="cross")
    canvas.pack(fill="both", expand=True)
 
    rect = None
    start_x = start_y = 0
    area = [0, 0, 0, 0]
 
    # 設(shè)置DPI感知
    try:
        ctypes.windll.user32.SetProcessDPIAware()
    except:
        pass
 
    def on_mouse_down(event):
        nonlocal start_x, start_y, rect
        start_x, start_y = event.x, event.y
        rect = canvas.create_rectangle(start_x, start_y, start_x, start_y, outline="red", width=3)
 
    def on_mouse_move(event):
        nonlocal rect
        if rect:
            canvas.coords(rect, start_x, start_y, event.x, event.y)
 
    def on_mouse_up(event):
        nonlocal area
        x1, y1, x2, y2 = start_x, start_y, event.x, event.y
         
        # 直接使用坐標(biāo),不進(jìn)行縮放轉(zhuǎn)換
        # MSS會(huì)自動(dòng)處理DPI縮放
        area = [int(min(x1, x2)), int(min(y1, y2)),
                int(max(x1, x2)), int(max(y1, y2))]
         
        #print(f"Selected area: {area}")
        root.withdraw()
        root.quit()
 
    canvas.bind("<ButtonPress-1>", on_mouse_down)
    canvas.bind("<B1-Motion>", on_mouse_move)
    canvas.bind("<ButtonRelease-1>", on_mouse_up)
 
    root.mainloop()
    root.destroy()
    return tuple(area)
 
def capture_region(region):
    """用 mss 按區(qū)域截圖,返回 PIL.Image"""
    with mss.mss() as sct:
        # 確保區(qū)域坐標(biāo)正確
        left, top, right, bottom = region
        width = max(1, right - left)
        height = max(1, bottom - top)
         
        monitor = {
            "top": top, 
            "left": left,
            "width": width,
            "height": height
        }
         
        #print(f"Capturing region: {monitor}")
        sct_img = sct.grab(monitor)
         
        # 保存截圖用于調(diào)試
        #mss.tools.to_png(sct_img.rgb, sct_img.size, output="debug_mss_screenshot.png")
        #print("MSS screenshot saved as debug_mss_screenshot.png")
         
        return Image.frombytes("RGB", sct_img.size, sct_img.bgra, "raw", "BGRX")
 
# ================== 主應(yīng)用 ==================
class TranslationApp:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("OCR翻譯器")
        self.root.overrideredirect(False)
        self.root.attributes('-topmost', True)
        self.root.geometry("400x200")
        self.font_size = 12
        self.is_zoomed = False
        self.frame = tk.Frame(self.root, bg='#2C3E50')
        self.frame.pack(padx=5, pady=5, fill="both", expand=True)
 
        self.label = tk.Label(self.frame, text="按 Ctrl+Alt+A 截圖翻譯",
                              font=('微軟雅黑', 12),
                              bg='#2C3E50', fg='#ECF0F1',
                              wraplength=400, justify='left',
                              padx=10, pady=5)
        self.label.pack(fill="both", expand=True)
 
        self.running = True
        self.last_text = ""
 
        self.setup_ui()
 
        # 注冊(cè)截圖快捷鍵
        keyboard.add_hotkey("ctrl+alt+a", self.capture_and_translate)
 
    def translate_text(self, text):
        is_chinese = any('\u4e00' <= c <= '\u9fa5' for c in text)
        from_lang = "zh" if is_chinese else "en"
        to_lang = "en" if is_chinese else "zh"
        return niutrans_translate(text, from_lang, to_lang)
 
    def process_image_with_ai(self, pil_image):
        # 把 PIL 圖片轉(zhuǎn)為 base64
        buffered = BytesIO()
        pil_image.save(buffered, format="JPEG")
        encoded_string = base64.b64encode(buffered.getvalue()).decode('utf-8')
 
        try:
            client = ZhipuAiClient(api_key="101fb0dca2d148cc937a73dc61f73368.HfIMCncTJPNibjYl")
 
            response = client.chat.completions.create(
                model="glm-4.1v-thinking-flash",
                messages=[{
                    "role": "user",
                    "content": [
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": f"data:image/jpeg;base64,{encoded_string}"
                            }
                        },
                        {
                            "type": "text",
                            "text": "請(qǐng)準(zhǔn)確提取圖片中的文字信息,不增加、刪除或改寫(xiě)其它文本內(nèi)容。"
                        }
                    ]
                }]
            )
 
            content = response.choices[0].message.content
            if content:
                content = content.replace("<|begin_of_box|>", "").replace("<|end_of_box|>", "")
                return content
            else:
                return "未識(shí)別到文字"
                 
        except Exception as e:
            print(f"AI OCR錯(cuò)誤: {str(e)}")
            # 如果AI OCR失敗,嘗試使用Tesseract作為備用方案
            return self.fallback_ocr(pil_image)
 
    def fallback_ocr(self, pil_image):
        """備用OCR方案(如果AI OCR失敗)"""
        try:
            import pytesseract
            # 如果安裝了Tesseract
            text = pytesseract.image_to_string(pil_image, lang='chi_sim+eng')
            return text.strip() if text.strip() else "未識(shí)別到文字(備用OCR)"
        except:
            return "OCR服務(wù)不可用,請(qǐng)檢查網(wǎng)絡(luò)連接或AI密鑰"
 
    def capture_and_translate(self):
        try:
            #print("開(kāi)始截圖...")
            # 選擇截圖區(qū)域
            region = select_area()
            #print(f"選擇的區(qū)域: {region}")
             
            if region[0] == region[2] or region[1] == region[3]:
                self.update_display("無(wú)效的截圖區(qū)域")
                return
 
            # 使用 mss 截圖
            screenshot = capture_region(region)
 
            # 保存截圖用于調(diào)試
            #screenshot.save("debug_pil_screenshot.png")
            #print("PIL screenshot saved as debug_pil_screenshot.png")
 
            # 顯示"識(shí)別中..."提示
            self.update_display("識(shí)別中...")
 
            # 調(diào)用 AI OCR,直接傳 PIL.Image
            text = self.process_image_with_ai(screenshot).strip()
            #print(f"識(shí)別結(jié)果: {text}")
 
            if text and text != "未識(shí)別到文字":
                self.last_text = text
                # 顯示"翻譯中..."提示
                self.update_display(f"原文: {text}\n翻譯中...")
                 
                # 翻譯文本
                translation = self.translate_text(text)
                #print(f"翻譯結(jié)果: {translation}")
                 
                self.update_display(f"原文: {text}\n\n譯文: {translation}")
            else:
                self.update_display("未識(shí)別到文字")
                 
        except Exception as e:
            import traceback
            error_msg = f"錯(cuò)誤: {str(e)}\n{traceback.format_exc()}"
            print(error_msg)
            self.update_display(f"處理錯(cuò)誤:\n{str(e)}")
 
    def update_display(self, text):
        self.label.config(text=text)
        self.root.update_idletasks()
    def copy_to_clipboard(self):
        """復(fù)制原文和譯文到剪貼板"""
        if self.last_text:
            try:
                # 獲取當(dāng)前顯示的文本
                current_text = self.label.cget("text")
                self.root.clipboard_clear()
                self.root.clipboard_append(current_text)
                # 臨時(shí)顯示復(fù)制成功提示
                original_text = self.label.cget("text")
                self.label.config(text="已復(fù)制到剪貼板!")
                self.root.after(1500, lambda: self.label.config(text=original_text))
            except Exception as e:
                print(f"復(fù)制失敗: {e}")
 
    def zoom_text(self):
        """放大/恢復(fù)文本字體"""
        if not self.is_zoomed:
            # 放大字體
            self.font_size = 16
            self.label.config(font=('微軟雅黑', self.font_size, 'bold'))
            self.is_zoomed = True
        else:
            # 恢復(fù)原字體
            self.font_size = 12
            self.label.config(font=('微軟雅黑', self.font_size))
            self.is_zoomed = False
    def setup_ui(self):
        control_frame = tk.Frame(self.frame, bg='#2C3E50')
        control_frame.pack(fill='x', pady=(5,0))
         
        # 左上角放大按鈕
        zoom_btn = tk.Button(control_frame, text="放大",
                            command=self.zoom_text,
                            bg='#27AE60', fg='white', relief='flat', width=6, font=(10))
        zoom_btn.pack(side='left', padx=2)
         
        # 左下角截圖按鈕
        capture_btn = tk.Button(control_frame, text="截圖",
                               command=self.capture_and_translate,
                               bg='#3498DB', fg='white', relief='flat', width=6, font=(10))
        capture_btn.pack(side='left', padx=2)
     
        exit_btn = tk.Button(control_frame, text="退出",
                             command=self.exit_app,
                             bg='#E74C3C', fg='white', relief='flat', width=6, font=(10))
        exit_btn.pack(side='right', padx=2)
 
 
        # 右上角復(fù)制按鈕
        copy_btn = tk.Button(control_frame, text="復(fù)制",
                            command=self.copy_to_clipboard,
                            bg='#9B59B6', fg='white', relief='flat', width=6, font=(10))
        copy_btn.pack(side='right', padx=2)
         
         
        # 快捷鍵退出
        self.root.bind("<Control-Shift-Q>", lambda e: self.exit_app())
 
    def exit_app(self):
        self.running = False
        self.root.destroy()
 
    def run(self):
        self.root.mainloop()
 
if __name__ == "__main__":
    app = TranslationApp()
    app.run()

以上就是Python基于OCR實(shí)現(xiàn)圖片識(shí)別翻譯工具功能(附源碼)的詳細(xì)內(nèi)容,更多關(guān)于Python OCR圖片識(shí)別翻譯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python處理xls文件openpyxl基礎(chǔ)操作

    python處理xls文件openpyxl基礎(chǔ)操作

    這篇文章主要為大家介紹了python處理xls文件openpyxl基礎(chǔ)操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • simple-pytest?框架使用教程

    simple-pytest?框架使用教程

    simple-pytest框架主要參考了httprunner的yaml數(shù)據(jù)驅(qū)動(dòng)部分設(shè)計(jì)思路,是基于Pytest?+?Pytest-html+?Log?+?Yaml?+?Mysql?實(shí)現(xiàn)的簡(jiǎn)易版接口自動(dòng)化框架,這篇文章主要介紹了simple-pytest?框架使用指南,需要的朋友可以參考下
    2024-02-02
  • pandas數(shù)據(jù)的合并concat()和merge()方式

    pandas數(shù)據(jù)的合并concat()和merge()方式

    Pandas中concat沿軸合并數(shù)據(jù)框(行或列),merge基于鍵連接(內(nèi)/外/左/右),concat用于縱向或橫向拼接,merge用于關(guān)聯(lián)數(shù)據(jù),如合并訂單與客戶信息
    2025-08-08
  • Python通過(guò)BeautifulSoup抓取網(wǎng)頁(yè)數(shù)據(jù)并解析

    Python通過(guò)BeautifulSoup抓取網(wǎng)頁(yè)數(shù)據(jù)并解析

    這篇文章主要為大家介紹了如何使用Python的異步爬蟲(chóng)技術(shù)抓取網(wǎng)頁(yè)內(nèi)容,并使用BeautifulSoup解析特定div中的文本,感興趣的小伙伴可以了解下
    2025-08-08
  • 基于Django實(shí)現(xiàn)日志記錄報(bào)錯(cuò)信息

    基于Django實(shí)現(xiàn)日志記錄報(bào)錯(cuò)信息

    這篇文章主要介紹了基于Django實(shí)現(xiàn)日志記錄報(bào)錯(cuò)信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • numpy matrix和array的乘和加實(shí)例

    numpy matrix和array的乘和加實(shí)例

    今天小編就為大家分享一篇numpy matrix和array的乘和加實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 使用Python抓取模板之家的CSS模板

    使用Python抓取模板之家的CSS模板

    本文給大家介紹的是使用Python抓取模板之家的CSS模板并打包成zip文件的代碼,使用的是單線程,非常簡(jiǎn)單實(shí)用,這里分享給大家,有相同需求的小伙伴參考下吧。
    2015-03-03
  • Python文件多線程/多進(jìn)程機(jī)制詳解

    Python文件多線程/多進(jìn)程機(jī)制詳解

    文章主要介紹了Python程序在運(yùn)行時(shí)可能會(huì)自動(dòng)創(chuàng)建多個(gè)線程的情況,包括Python內(nèi)部的線程池、異步庫(kù)、第三方庫(kù)以及調(diào)試器自身的線程,文章還提供了判斷線程來(lái)源的方法,并總結(jié)了手動(dòng)創(chuàng)建線程的常見(jiàn)方式
    2026-01-01
  • 使用seaborn繪制強(qiáng)化學(xué)習(xí)中的圖片問(wèn)題

    使用seaborn繪制強(qiáng)化學(xué)習(xí)中的圖片問(wèn)題

    這篇文章主要介紹了使用seaborn繪制強(qiáng)化學(xué)習(xí)中的圖片問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python性能提升之延遲初始化

    Python性能提升之延遲初始化

    本文給大家分享的是在Python中使用延遲計(jì)算來(lái)提升性能的方法,非常的實(shí)用,有需要的小伙伴可以參考下
    2016-12-12

最新評(píng)論

普洱| 九龙城区| 尼勒克县| 资源县| 同德县| 开平市| 家居| 惠安县| 双柏县| 巴楚县| 娄底市| 柳林县| 邹城市| 洞口县| 息烽县| 德州市| 江陵县| 梨树县| 柞水县| 东乡族自治县| 齐齐哈尔市| 洪泽县| 奉贤区| 额济纳旗| 临江市| 苏尼特右旗| 马边| 浦城县| 大方县| 吉安县| 甘肃省| 大连市| 瑞金市| 通化县| 酉阳| 蒲江县| 电白县| 博乐市| 甘孜县| 广昌县| 新晃|