前提・実現したいこと
関数smile_recognitionを呼び出して実行し、
smile_img.jpgを所定のパスに保存するとともに
その画像の大きさ(smile_height, smile_width)を戻り値として引き渡したいので、
引き渡し方についてアドバイス願います。
関数内である種の動作もさせているからなのか、単純には引き渡せない気がします。
発生している問題・エラーメッセージ
関数smile_recognitionを呼び出す本体プログラム側で
例えばprint(smile_recognition())としてsmile_height, smile_widthの値が出力されない。
該当のソースコード
Python3、OpencCV3 # -*- coding: utf-8 -*- import cv2 def smile_recognition(): # 定数定義 ESC_KEY = 27 # Escキー INTERVAL= 33 # 待ち時間 FRAME_RATE = 30 # fps smile_flag = 0 #笑顔検出の有無 smile_img_path ="../images/" #ORG_WINDOW_NAME = "org" GAUSSIAN_WINDOW_NAME = "gaussian" DEVICE_ID = 0 # 分類器の指定 cascade_face_file = "../etc/haarcascade_frontalface_alt2.xml" cascade_smile_file = "../etc/haarcascade_smile.xml" cascade_face = cv2.CascadeClassifier(cascade_face_file) cascade_smile = cv2.CascadeClassifier(cascade_smile_file) # カメラ映像取得 cap = cv2.VideoCapture(DEVICE_ID) # 初期フレームの読込 end_flag, c_frame = cap.read() height, width, channels = c_frame.shape # ウィンドウの準備 #cv2.namedWindow(ORG_WINDOW_NAME) cv2.namedWindow(GAUSSIAN_WINDOW_NAME) # 変換処理ループ while end_flag == True: # 画像の取得と顔の検出 img = c_frame img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) face_list = cascade_face.detectMultiScale(img_gray, minSize=(100, 100)) # 検出した顔に印を付ける for (x, y, w, h) in face_list: color = (0, 0, 225) pen_w = 3 cv2.rectangle(img_gray, (x, y), (x+w, y+h), color, thickness = pen_w) #顔の中から笑顔に印をつける roi_img_gray = img_gray [y:y+h, x:x+w] smile_list = cascade_smile .detectMultiScale(roi_img_gray, scaleFactor=1.1, minNeighbors=7, minSize=(25, 25)) if len(smile_list) > 0: print ("smile detected!") smile_flag = 1 smile_height, smile_width = roi_img_gray.shape[:2] cv2.waitKey(0) break #for (sx, sy, sw, sh) in smile_list: #color = (0, 0, 225) #pen_w = 3 #cv2.rectangle(roi_img_gray, (sx, sy), (sx+sw, sy+sh), color, thickness = pen_w) # フレーム表示 #cv2.imshow(ORG_WINDOW_NAME, c_frame) cv2.imshow(GAUSSIAN_WINDOW_NAME, img_gray) # Escキーで終了 key = cv2.waitKey(INTERVAL) if key == ESC_KEY: break if smile_flag == 1: cv2.imwrite(smile_img_path + 'smile_img.jpg', roi_img_gray) break # 次のフレーム読み込み end_flag, c_frame = cap.read() # 終了処理 cv2.destroyAllWindows() cap.release() return smile_height, smile_width if __name__ == '__main__': smile_recognition()
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー