線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1470
推到 Plurk!
推到 Facebook!

Delphi與Tesseract OCR的整合問題(CMD指令的參數與變數)

答題得分者是:P.D.
y377980
一般會員


發表:1
回覆:2
積分:0
註冊:2018-06-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2018-06-12 16:24:10 IP:211.22.xxx.xxx 未訂閱
小的不才,才剛開始玩Delphi沒幾天就遇到了一些問題,在此請教各位前輩;
最近想要把Tesseract OCR與Delphi結合起來,目前可成功的透過delphi運作OCR,程式碼如下:
WinExec('cmd.exe /c cd\ &cd C:\Program Files (x86)\Tesseract-OCR &tesseract C:\Users\TempUser\Desktop\cli.jpg stdout -l eng &pause ',SW_SHOWDEFAULT);

但是若是將路徑改為變數部分,則會失敗:
FileName := FDQuery1.FieldByName('file').AsString;
sCommand := 'cmd.exe /c cd C:\Program Files (x86)\Tesseract-OCR &';
sCommands := ' tesseract' FileName 'stdout -l eng';
WinExec(PAnsiChar(AnsiString(sCommand sCommands) '&pause'), SW_SHOWDEFAULT);
*其中FileName是我去資料庫抓取路徑的變數

我希望實現的是:先從資料庫取得路徑,在透過此路徑抓出檔案做OCR;因為剛開始接觸Delphi沒幾天,Google了許久也苦思不出如何改善此問題,所以來這求教,還望各位前輩給小的一些建議,謝謝。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2018-06-12 20:25:22 IP:118.169.xxx.xxx 未訂閱
建議你改用 shellexec() 
var file : pChar;
....

file:= pChar('C:\Program Files (x86)\Tesseract-OCR.....');
ShellExecute(handle, nil, file, pChar('C:\Users\TempUser\Desktop\cli.jpg'), nil, SW_NORMAL);

不過不清楚你的 ocr 要如何帶參數或執行, 以上僅提供參考

===================引 用 y377980 文 章===================
小的不才,才剛開始玩Delphi沒幾天就遇到了一些問題,在此請教各位前輩;
最近想要把Tesseract OCR與Delphi結合起來,目前可成功的透過delphi運作OCR,程式碼如下:
WinExec('cmd.exe /c cd\ &cd C:\Program Files (x86)\Tesseract-OCR &tesseract C:\Users\TempUser\Desktop\cli.jpg stdout -l eng &pause ',SW_SHOWDEFAULT);

但是若是將路徑改為變數部分,則會失敗:
FileName := FDQuery1.FieldByName('file').AsString;
sCommand := 'cmd.exe /c cd C:\Program Files (x86)\Tesseract-OCR &';
sCommands := ' tesseract' FileName 'stdout -l eng';
WinExec(PAnsiChar(AnsiString(sCommand sCommands) '&pause'), SW_SHOWDEFAULT);
*其中FileName是我去資料庫抓取路徑的變數

我希望實現的是:先從資料庫取得路徑,在透過此路徑抓出檔案做OCR;因為剛開始接觸Delphi沒幾天,Google了許久也苦思不出如何改善此問題,所以來這求教,還望各位前輩給小的一些建議,謝謝。
y377980
一般會員


發表:1
回覆:2
積分:0
註冊:2018-06-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2018-06-13 10:07:10 IP:211.22.xxx.xxx 未訂閱
非常感謝前輩的幫助,請原諒小的沒有說清楚OCR的運作方式,抱歉。
此OCR主要是使用CMD指令的方式將圖片轉成文字後顯示出來,
於是我想要使用Delphi與Tesseract OCR做整合,
先用Delphi呼叫出CMD,並且藉由Delphi的指令傳遞方式將指令傳到CMD裡,
先進到OCR的根目錄後,使用OCR的指令,
也就是"FileName 'stdout -l eng';
WinExec(PAnsiChar(AnsiString(sCommand sCommands) '&pause'), SW_SHOWDEFAULT);
其中,FileName是我宣告的變數,也就是去資料庫抓取到的路徑。
在這裡會變成:一樣會正常進到OCR根目錄,但是在執行 ' tesseract' FileName 'stdout -l eng'; 指令則會因為沒有跟tesseract同時執行而導致指令錯誤
也就是說,我現在的情況,需要在指令當中插入一個變數,但是在delphi傳送指令時,其實是傳遞' ' 包的字串,當變數包在' '當中也同時變字串,
但我用上述分開字串的方式去傳遞指令時,他就會變成只個別的去執行我用' '包起來的字串,
導致後面那段含有變數的指令無法整段同時運作,進而變成指令錯誤,
不知道是否有方法能夠讓指令依照我的意思去傳遞,而不是單單只是遇到''包起來就直接執行,
再次向各位前輩請教這個小問題,謝謝。
===================引 用 P.D. 文 章===================
建議你改用 shellexec()
var file : pChar;
....

file:= pChar('C:\Program Files (x86)\Tesseract-OCR.....');
ShellExecute(handle, nil, file, pChar('C:\Users\TempUser\Desktop\cli.jpg'), nil, SW_NORMAL);

不過不清楚你的 ocr 要如何帶參數或執行, 以上僅提供參考
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2018-06-13 23:05:58 IP:118.169.xxx.xxx 未訂閱
tesseract 這支應該是執行檔吧!   tesseract.exe
如果是, 則 file 就是 'c:\xxxx路徑\tesseract.exe', 後面傳遞的參數就是 "c:\program filex86\xxxxxx.jpg",
這樣利用 ShellExecute() 等同 cmd 執行檔案, 不妨試試看
y377980
一般會員


發表:1
回覆:2
積分:0
註冊:2018-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2018-06-14 18:08:11 IP:211.22.xxx.xxx 未訂閱
感謝版大大的回覆,後來發現我的問題在於當我把指令分開下、中間參雜變數時,沒有注意到要打空格,所以當他執行我下的指令時,
整段沒空格都打在一起所以指令錯誤;
另外shellExecute真的很好用,感謝大大的建議,非常感謝您的幫助,謝謝。
===================引 用 P.D. 文 章===================
tesseract 這支應該是執行檔吧! tesseract.exe
如果是, 則 file 就是 'c:\xxxx路徑\tesseract.exe', 後面傳遞的參數就是 "c:\program filex86\xxxxxx.jpg",
這樣利用 ShellExecute() 等同 cmd 執行檔案, 不妨試試看
系統時間:2024-11-21 20:23:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!