問題のコード
php
1//result.php 2<!DOCTYPE html> 3<html lang="ja" dir="ltr"> 4 <head> 5 <meta charset="utf-8"> 6 <?php include '..\db_config.php'; ?> 7 <title>result</title> 8 </head> 9 <body> 10 <?php 11 12 if(isset($_POST["name"])) 13 { 14 $name = $_POST['name']; 15 $per = $_POST['per']; 16 // echo $per; 17 try 18 { 19 $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 20 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 21 22 23 $stmt = $db->query("SELECT * FROM image ORDER BY id DESC LIMIT 1"); 24 $image_detail = $stmt->fetchAll(PDO::FETCH_ASSOC); 25 26 foreach($image_detail as $img_det) 27 { 28 $image_name = $img_det['name']; 29 // $image_id = $img_det['id']; 30 //image_detailに画像の情報を格納 31 $db->query("INSERT INTO `image_detail`(`img_id`,`quantity`,`kind`) VALUES({$img_det['id']},1,'{$name}')"); 32 } 33 34 $db = null; 35 } 36 catch(PDOException $e) 37 { 38 echo $e->getMessage(); 39 exit; 40 } 41} 42echo $name; 43$command="python harvests.py ".$image_name.""; 44// $command2="python harvests.py ".$name.""; 45 46 47exec($command,$output); 48// exec($command2,$output); 49 50print ("$output[0]"); 51 52 ?> 53 54 </body> 55</html> 56
python
1#harvests.py 2import cv2 3import numpy as np 4import os 5import tkinter 6import matplotlib 7matplotlib.use('tkagg') 8import matplotlib.pyplot as plt 9from matplotlib.patches import Circle, Polygon, Rectangle 10from tkinter import filedialog 11import sys 12 13time = sys.argv[1] 14text = "../Imagefile/fruit/{}.png" 15 16 17# 計算式----------------------------------------------------- 18class harvests(): 19 def __init__(self,area): 20 per_unitarea = area 21 distance = 27330/3081 - (2*per_unitarea)/3081 22 tree_area = 98 * distance + 336 23 harv = int(553/98 * tree_area - 3512) 24 self.msg = str(harv) 25# ----------------------------------------------------------- 26 27 28# img = Image.open(text.format(time)) 29 30 31# root = tkinter.Tk() 32# root.withdraw() 33# fTyp = [("Text File",".jpg")] 34# iDir = os.path.abspath(os.path.dirname(__file__)) 35# titleText = "Select image file" 36# image = filedialog.askopenfilename(filetypes = fTyp, title = titleText, initialdir = iDir) 37image = text.format(time) 38 39# GRAY_FILE_NAME = "gray.png" 40mono_image = "photo/エッジ検出.png" 41fgmask_img = "photo/マスク画像.png" 42mask_img = "photo/マスク合成後.png" 43 44# mono_image = "エッジ検出.png" 45# fgmask_img = "マスク画像.png" 46# mask_img = "マスク合成後.png" 47 48# 元の画像を読み込む 49org_img = cv2.imread(image, cv2.IMREAD_UNCHANGED) 50 51# グレースケールに変換 52gray = cv2.imread(image, 0) 53 54# 前処理(平準化フィルターを適用) 55# 前処理が不要な場合は下記行をコメントアウト 56# blur = cv2.GaussianBlur(gray, (5, 5), 2) 57 58# エッジ抽出 59edges = cv2.Canny(blur, 225, 255) 60# cv2.imshow("edges",edges) 61# エッジ検出後の画像を保存 62cv2.imwrite(mono_image, edges) 63 64 65# HSV変換 66im = cv2.imread(mono_image) 67hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 68# cv2.imshow("hsv",hsv) 69# 赤色のHSV範囲 70hsv_min = np.array([0, 0, 0]) 71hsv_max = np.array([100, 100, 100]) 72mask = cv2.inRange(hsv, hsv_min, hsv_max) 73# 画像の黒部分の抽出 74m = cv2.countNonZero(mask) 75# 画像全体の縦横の長さの取得 76h, w = mask.shape 77 78# 画像の中心を求める 79w2 = int(w / 2) #横 80h2 = int(h / 2) #縦 81h23 = int(h / 2 * 0.9) #縦 82# 楕円の長辺短辺 83w3 = int(w * 0.33) #横 84h3 = int(h * 0.34) #縦 85 86cir_area = float(w3 * h3 * 3.1415) #楕円の面積 87# print (cir_area) 88 89im2 = cv2.imread(mono_image) 90hsv2 = cv2.cvtColor(im2, cv2.COLOR_BGR2HSV) 91# 回転角度 0°、円弧の範囲 0° ~ 360° 92# cir = cv2.ellipse(hsv, (w2,h23), (w3,h3), angle=0, startAngle=0, endAngle=360,color=(255, 0,0), thickness=-1) 93# cir = cv2.ellipse(hsv, (w2,h2), (w3,h3), angle=0, startAngle=0, endAngle=360,color=(255, 0,0), thickness=-1) 94# squ_w = (w2+150) - (w2-150) #抽出部分の 横 の長さ(でかい画像用) 95# squ_h = (h2-200) - (h2-500) #抽出部分の 縦 の長さ(でかい画像用) 96squ_w = (w2+25) - (w2-25) #抽出部分の 横 の長さ(ちっちゃい画像用) 97squ_h = (h2+20) - (h2-30) #抽出部分の 縦 の長さ(ちっちゃい画像用) 98 99# print(squ_w) 100# print(squ_h) 101# ↓でかい画像用 102# square = cv2.rectangle(hsv, (w2-150,h2-500), (w2+150, h2-200), (255, 0, 0), -1) 103square = cv2.rectangle(hsv, (w2-25,h2-30), (w2+25, h2+20), (255, 0, 0), -1) 104fill = cv2.rectangle(hsv2, (0,0), (w, h), (255, 0, 0), -1) 105# cv2.imshow("cir", cir) 106# cv2.imshow("fill", fill) 107 108#「背景差分」計算用オブジェクトの作成 109bgObj = cv2.bgsegm.createBackgroundSubtractorMOG() 110 111#差分となっている「前景領域」に対してマスクをかける 112fgmask = bgObj.apply(fill) 113fgmask = bgObj.apply(square) 114# fgmask = bgObj.apply(cir) 115# マスク画像の保存 116cv2.imwrite(fgmask_img, fgmask) 117#画面に表示 118# cv2.imshow('frame', fgmask) 119 120 121# マスク対象画像読み込み 122edges2 = cv2.imread(mono_image) 123# マスク画像読み込み 124imgMask = cv2.imread(fgmask_img, cv2.IMREAD_UNCHANGED) 125# edgesとfgmaskを合成 126edges2[imgMask==255] = [0,0,0] # マスク画像の明度 0 の画素を灰色(R:128 G:128 B:128)で塗りつぶす 127# cv2.imshow('img', edges2) 128cv2.imwrite(mask_img, edges2) 129 130# HSV変換 131hsv_mask_img = cv2.imread(mask_img) 132hsv_mask_img2 = cv2.cvtColor(hsv_mask_img, cv2.COLOR_BGR2HSV) 133# cv2.imshow("hsv",hsv) 134# 赤色のHSV範囲 135hsv_mask_img_min = np.array([0, 0, 0]) 136hsv_mask_img_max = np.array([100, 100, 100]) 137 138mask2 = cv2.inRange(hsv_mask_img2, hsv_mask_img_min, hsv_mask_img_max) 139# 画像の黒部分の抽出 140m2 = cv2.countNonZero(mask2) 141h_mask2, w_mask2 = mask2.shape 142 143# 単位面積あたりのエッジ量 --------------------------------------------- 144# エッジ量を抽出した部分の面積 145px = int(squ_h * squ_w) 146# print(px) 147# 白い部分(輪郭)のピスセル数の取得(単位面積当たりのエッジ量) 148area = round(h_mask2 * w_mask2 - m2) 149 150# 黒い部分(輪郭)の%の取得 151# per = round(100*float(area/px),3) 152# print("単位面積あたりのエッジ量[%]:",per) 153# print("単位面積内ののエッジ量[px]:",area) 154# cv2.imshow("Mask",mask) 155# ------------------------------------------------------------------ 156 157# 収穫個数計算結果の出力 158result = harvests(area) 159print result 160 161# 終了処理 162cv2.waitKey(0) 163cv2.destroyAllWindows() 164
現在しようとしていること
phpからpythonをexec関数で実行し、その実行結果をphpで受け取り表示をする。
起こっている問題
web上でresult.phpにアクセスしてもPOSTで受け取った$nameに入っている値だけが出力され、pythonの実行結果は全く帰ってこない。また、chromeのデベロッパーツールで見ても、エラーが起きているところはなく、どこがおかしいのかわからない。
何かおかしいところがあれば原因に繋がるかもしれないのでご教授いただけると幸いです。
補足
$nameなどのすべての変数に値は入っています。phpからpythonを呼び出す処理は
python
1import sys 2 3time = sys.argv[1] 4text = "../Imagefile/fruit/{}.png" 5 6print text.format(time)
のような簡単なpythonファイルを実行してみたが、ちゃんと値は返ってきていて表示もされたので、python側に問題があるのではと考えています。pythonがimportしているモジュールは、azure portalを使用しているので、その中にcv2:openCV、numpy、tkinter、matplotlibはインストールしてあります。(osとsysはインストールしなくても使えると聞きました。)
webサーバーのログ
2019-08-26 04:09:08 *** POST /app/result/result.php X-ARR-LOG-ID=c03d0b93-76b6-43b9-8b17-3e68ef83d64e 443 - 202.26.249.251 Mozilla/5.0+(iPhone;+CPU+iPhone+OS+12_3_1+like+Mac+OS+X)+AppleWebKit/605.1.15+(KHTML,+like+Gecko)+Version/12.1.1+Mobile/15E148+Safari/604.1 ARRAffinity=231057e07a83c4308bf983e7dc86c3ea07391dfcb2e933d9998a48444064ed8d https://****.azurewebsites.net/app/photo/camera.php ****.azurewebsites.net 200 0 0 642 1394 439 2019-08-26 04:09:08 *** GET /favicon.ico X-ARR-LOG-ID=bd45b987-cfb8-4c1f-8af6-c100203813f4 443 - 202.26.249.251 Mozilla/5.0+(iPhone;+CPU+iPhone+OS+12_3_1+like+Mac+OS+X)+AppleWebKit/605.1.15+(KHTML,+like+Gecko)+Version/12.1.1+Mobile/15E148+Safari/604.1 ARRAffinity=231057e07a83c4308bf983e7dc86c3ea07391dfcb2e933d9998a48444064ed8d https://****.azurewebsites.net/app/result/result.php ****.azurewebsites.net 404 0 2 418 1146 31 2019-08-26 04:09:14 *** GET /favicon.ico X-ARR-LOG-ID=563799a6-163f-4e7f-9776-5d7b89753ec8 443 - 202.26.249.251 Mozilla/5.0+(Macintosh;+Intel+Mac+OS+X+10_14_6)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/76.0.3809.100+Safari/537.36 ARRAffinity=231057e07a83c4308bf983e7dc86c3ea07391dfcb2e933d9998a48444064ed8d https://****.azurewebsites.net/app/result/result.php ****.azurewebsites.net 404 0 2 418 1236 15