質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

1529閲覧

関数内である種の動作(メソッド?)もさせているときの戻り値の引き渡し方

suhsuu

総合スコア15

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2018/08/29 11:34

前提・実現したいこと

関数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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tachikoma

2018/08/29 11:48

print(smile_recognition())表示される結果を教えて下さい。
suhsuu

2018/08/29 11:53

もう一度画像取得の動作が起こります
LouiS0616

2018/08/29 13:33

エスケープキーをちゃんと押していますか?
suhsuu

2018/08/29 22:31

押しているんですが…
umyu

2018/08/30 11:55

@suhsuuさんへ OSはmacとかですかー?
suhsuu

2018/08/31 11:19

ラズパイ、Raspbian(Strech)です。Jessieからのアップグレードです。
guest

回答2

0

自己解決

今回のコードはRaspberry Pi 3B上にて走らせているのですが、
問題が発生しているときは全てThonny内で動かしていました。

試しにTerminalで走らせたところ、
問題なく戻り値が引き渡され(print(smile_recognition())とすると、smile_height, smile_widthの値が出力される)ました。

Thonny内で今回のコードを走らせるに当たってのみ、print分が機能していないのだと思われます。
(関数smile_recognition()内で、別途、print文を加えても機能しない)
別のコードでは確かに機能してました。

原因は不明です。
気になる点は、今回のコードをThonnyで”Debug current script”させると、
以下のエラーメッセージが出ることです。
このエラーはデバッグの時しか発生しません。
今回の問題発生と関係あるかもしれません。

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/thonny/shared/thonny/ast_utils.py", line 120, in get_last_child
and hasattr(node.slice, "step"))
AssertionError

投稿2018/08/30 11:38

suhsuu

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

戻り値として引き渡したいのはわかりますが、
その戻り値をどこに引き渡してるんでしょうか。

あなたの提示のコードには、
smile_recognition()
としかありません

投稿2018/08/29 14:36

編集2018/08/29 14:43
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suhsuu

2018/08/29 22:31

上記コードの欄には書きませんでしたが、「発生している問題」の欄に書きましたように、 例えばprint(smile_recognition())としてもsmile_height, smile_widthの値が出力されませんでした。
y_waiwai

2018/08/29 22:37

どういう値が出力されたんでしょうか。 また、そのときのsmile_flagの値、roi_img_gray.shapeの値はどうなってるんでしょうか
suhsuu

2018/08/30 11:26

何も出力されませんでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問