だから、私はpythonスクリプトを私のLaravel 5.3。
この機能はコントローラーの中にあります。これは単にデータをmy pythonスクリプトに渡します
public function imageSearch(Request $request) {
$queryImage = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\query.png'; //queryImage
$trainImage = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\2nd.png'; //trainImage
$trainImage1 = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\3rd.png';
$trainImage2 = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\4th.jpg';
$trainImage3 = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\1st.jpg';
$data = array
(
array(0, $queryImage),
array(1, $trainImage),
array(3, $trainImage1),
array(5, $trainImage2),
array(7, $trainImage3),
);
$count= count($data);
$a = 1;
$string = "";
foreach( $data as $d){
$string .= $d[0] . '-' . $d[1];
if($a < $count){
$string .= ",";
}
$a++;
}
$result = Shell_exec("C:\Python27\python c:\xampp\htdocs\identificare_api\app\http\controllers\ORB\orb.py " . escapeshellarg($string));
echo $result;
}
My pythonスクリプトはORBアルゴリズムで、列車の画像とクエリ画像を比較した後、最小距離とそのIDを返します。つまり、これはmy python脚本:
import cv2
import sys
import json
from matplotlib import pyplot as plt
arrayString = sys.argv[1].split(",")
final = []
for i in range(len(arrayString)):
final.append(arrayString[i].split("-"))
img1 = cv2.imread(final[0][1], 0)
for i in range(1, len(arrayString)):
img2 = cv2.imread(final[i][1], 0)
# Initiate STAR detector
orb = cv2.ORB_create()
# find the keypoints and descriptors with SIFT
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
# create BFMatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# Match descriptors.
matches = bf.match(des1,des2)
# Sort them in the order of their distance.
matches = sorted(matches, key = lambda x:x.distance)
# Draw first 10 matches.
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10], None, flags=2)
if i == 1:
distance = matches[0].distance
else:
if distance > matches[0].distance:
distance = matches[0].distance
smallestID = final[i][0]
print str(smallestID) + "-" + json.dumps(distance)
Laravelを使用せずに両方のファイルを実行してみましたが、うまく機能しています。しかし、phpコードをLaravelに統合しようとすると、何も表示されません。ステータスコードは200 OKです。
[〜#〜] edit [〜#〜]:問題が解決されました。 PHP code、just change
$result = Shell_exec("C:\Python27\python c:\xampp\htdocs\identificare_api\app\http\controllers\ORB\orb.py " . escapeshellarg($string));
に
$result = Shell_exec("python " . app_path(). "\http\controllers\ORB\orb.py " . escapeshellarg($string));
次に、このようにすることもできます
$queryImage = public_path() . "\gallery\herbs\query.png";
Symfonyプロセスを使用します。 https://symfony.com/doc/current/components/process.html
インストール:
composer require symfony/process
コード:
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
$process = new Process(['python', '/path/to/your_script.py']);
$process->run();
// executes after the command finishes
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
echo $process->getOutput();
私にとってうまくいった解決策は、最後に2>&1を追加することでした。
Shell_exec("python path/to/script.py 2>&1");
私が抱えていた問題は、エラーも応答もありませんでした。スクリプトへのパスが間違っていましたが、知る方法がありませんでした。 2>&1はデバッグ情報を結果にリダイレクトします。
Symfonyプロセスを使用すると便利です。 https://symfony.com/doc/current/components/process.html
シンフォニーがプロジェクトで使用できることを確認してください
composer show symphony/process
インストールされていない場合は、composer require symfony/process
そして、次のようなことをします
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
//$process = new Process('python /path/to/your_script.py'); //This won't be handy when going to pass argument
$process = new Process(['python','/path/to/your_script.py',$arg(optional)]);
$process->run();
// executes after the command finishes
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
echo $process->getOutput();