前言
每種語言都有每種語言的優勢,Python由于其強大的生態,很多任務通過調用包就可以實現,那么學會從C#項目中調用Python腳本完成任務就很重要。C#調用Python代碼有多種方式,如果Python那邊內容比較多,可以考慮起一個Web Api進行調用,如果只是一個簡單的腳本而且不需要頻繁調用,那么可以考慮使用Process類創建一個進程來調用,如果有幾個方法,并且需要進行數據交互,并可能會頻繁調用,那么可以考慮使用pythonnet。
今天依托PaddleOCR-GUI項目,先給大家介紹的是C#調用Python腳本的方式一:使用Process類調用Python腳本。
背景介紹
PaddleOCR是基于PaddlePaddle框架開發的開源文字識別工具,由百度團隊維護。它提供了從預處理、文字檢測、文字識別到后處理的全流程文字識別解決方案。PaddleOCR不僅性能優異,而且配置靈活、使用便捷,能夠滿足多種場景下的文字識別需求,廣泛應用于廣告檢測、圖像搜索、自動駕駛、內容安全審核等多個領域。
GitHub地址:https://github.com/PaddlePaddle/PaddleOCR
之前也介紹過C#中可以直接使用PaddleSharp進行調用:
C#使用PaddleOCR進行圖片文字識別
但是不能指望所有Python的東西都有大佬給你封裝好,讓你直接調就行。需要離開自己的舒適區,去了解更多其他語言其他生態的內容。
PaddleOCR-GUI只是給PaddleOCR提供了一個簡單的使用界面,使用效果如下所示:
GitHub地址:https://github.com/Ming-jiayou/PaddleOCR-GUI
需要先在電腦上搭建PaddleOCR的環境:
Python版本 3.12.8
創建一個Python虛擬環境,在虛擬環境中安裝好PaddleOCR,可以參考官網的快速開始:
快速開始 - PaddleOCR 文檔
C#調用Python腳本
今天演示的是通過Process類調用Python腳本,與實際項目相結合,需要思考的是如何進行參數的傳遞呢?比如這里選擇的圖片路徑以及選擇的語言。
可以通過命令行參數的方式使用,Python腳本寫好如下所示:
import sys
import logging
from paddleocr import PaddleOCR
if len(sys.argv) > 1:
imagePath = sys.argv[1]
selectedLanguage = sys.argv[2]
else:
print("請提供完整參數")
logging.basicConfig(level=logging.WARNING)
class NullHandler(logging.Handler):
def emit(self, record):
pass
ppocr_logger = logging.getLogger('ppocr')
for handler in ppocr_logger.handlers[:]:
ppocr_logger.removeHandler(handler)
ppocr_logger.addHandler(NullHandler())
ocr = PaddleOCR(use_angle_cls=True, lang=selectedLanguage)
img_path = imagePath
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
res = result[idx]
for line in res:
print(line[1][0])
需要傳遞的參數在此處通過命令行的方式傳遞:
if len(sys.argv) > 1:
imagePath = sys.argv[1]
selectedLanguage = sys.argv[2]
else:
print("請提供完整參數")
然后在C#中只需這樣使用即可:
private Task ExecuteOCRCommand()
{
return Task.Run(() =>
{
string selectedLanguage;
switch (SelectedLanguage)
{
case "中文":
selectedLanguage = "ch";
break;
case "英文":
selectedLanguage = "en";
break;
default:
selectedLanguage = "ch";
break;
}
if (PaddleOCRSettingsViewModel.PythonScriptPath == null || PaddleOCRSettingsViewModel.PythonExecutablePath == null)
{
return;
}
string pythonScriptPath = PaddleOCRSettingsViewModel.PythonScriptPath;
string pythonExecutablePath = PaddleOCRSettingsViewModel.PythonExecutablePath;
if (SelectedFilePath == null)
{
return;
}
string arguments = SelectedFilePath;
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = pythonExecutablePath;
start.Arguments = $"\"{pythonScriptPath}\" {arguments} {selectedLanguage}";
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
start.CreateNoWindow = true;
using (Process process = Process.Start(start))
{
using (System.IO.StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
OCRText = result;
}
}
});
}
需要注意的地方在這幾處:
Python解釋器路徑為虛擬環境中的Python解釋器,我這里如下所示:
在此處傳入Python腳本路徑與設置的參數。
?轉自https://www.cnblogs.com/mingupupu/p/18605737
該文章在 2024/12/14 11:33:59 編輯過