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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

14240閲覧

Pythonのretってなんですか

osashimi

総合スコア26

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2017/11/14 14:07

python3

1import numpy as np 2import cv2 3 4cap = cv2.VideoCapture(0) 5 6while(True): 7 # Capture frame-by-frame 8 ret, frame = cap.read() 9 10 # Our operations on the frame come here 11 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 12 13 # Display the resulting frame 14 cv2.imshow('frame',gray) 15 if cv2.waitKey(1) & 0xFF == ord('q'): 16 break 17 18# When everything done, release the capture 19cap.release() 20cv2.destroyAllWindows()

opencvを使用したコードなのですが、ループ内で登場するretはどのような役割があるのですか?

jtmk👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

osashimiさんはCを書けるようですので、その前提で回答します。

OpenCVに関する情報を集める際は、C++のリファレンスに当たるのが一番早いです。
もちろん100%の信頼は置けませんが、かなりアタリを付けることが出来ます。
OpenCV 3.2.0: cv::VideoCapture Class Reference - § read()

read()
virtual bool cv::VideoCapture::read(OutputArray image)


Grabs, decodes and returns the next video frame.

Parameters
[out] image the video frame is returned here. If no frames has been grabbed the image will be empty.
Returns
false if no frames has been grabbed

多少インタフェースは異なりますが、retがこの戻り値に当たることはわかります。


なお、Pythonの対話環境上でも、組み込み関数helpで簡単に使い方を見られます。

Python

1>>> import cv2 2>>> help(cv2.VideoCapture().read) 3Help on built-in function read: 4 5read(...) method of cv2.VideoCapture instance 6 read([, image]) -> retval, image 7 . @brief Grabs, decodes and returns the next video frame. 8 . 9 . @param [out] image the video frame is returned here. If no frames has been grabbed the image will be empty. 10 . @return `false` if no frames has been grabbed 11 12[後略]

書いてある内容は上記のリファレンスとほぼ同一ですね。

追記

PythonとC++とでインタフェースが異なる理由
理由は主に三つです。

  • Pythonでは、タプルを利用することによって複数のオブジェクトを簡単に返せる。

C++で同様のことをしようと思うと、そのためだけに構造体などを利用せねばなりません。

  • PythonはGCを採用しており、オブジェクトの寿命について考える必要がほとんどない。

C++ではオブジェクトのスコープを意識しないでコードを書くのは不可能です。

  • Pythonでは、意識せずともオブジェクトの移行が軽量。

C++ではデフォルトの値の移行がフルコピーであり、意図せず重くなることがあります。

よって、複数のオブジェクトが返される必要がある場合...

  • C++では、引数を参照で受け取って書き換えることが多いです。
  • Pythonでは、オブジェクトをタプルで返すことが多いです。

C++も、C++11の登場以降かなり近代的なコードを書けるようになりました。
しかし、開発者間でそのような機能が完全に周知浸透しているかと言うと微妙です。

まあ、お手軽にサクサクかけるのがPythonであることは間違いないと思います。


Python寄りの意見を書いていますが、私はどちらかと言うとC++の方が好きだったりします。
もちろん上記三つの問題点はC++でも解決可能です。ちょっと難解なだけで。

投稿2017/11/14 14:22

編集2017/11/14 15:24
LouiS0616

総合スコア35668

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

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

osashimi

2017/11/14 14:31

videocaptureの部分ではなく、retが何なのかという事が現在の疑問です。 この場合、frame = だけでは行けないのでしょうか?
LouiS0616

2017/11/14 14:33

上記の戻り値がretに当たります。 `false` if no frames has been grabbed rkhsさんが回答されている内容が書かれています。 それとも、retを受け取りたくないという趣旨なのでしょうか?
osashimi

2017/11/14 15:02

ありがとうございます。 私が少し勘違いをしていました。
guest

0

python

1import cv2 2 3cap = cv2.VideoCapture(0) 4print(cap.read())

としたときに出てくる出力は下のような構造になっています。

python

1(<True or False>, <イメージデータ>)

これを二つの変数に格納する際には次のようにします。

python

1import cv2 2 3cap = cv2.VideoCapture(0) 4print(cap.read()) 5<任意の変数名1(<True or False>が代入される)>, <任意の変数名2(<イメージデータ>が代入される)> = cap.read()

以上のことを言い換えると、

python

1ret, frame = cap.read()

の"ret"と"frame"はそれぞれ変数名であることが分かります。
以上より、この変数名はopencv内で定義されたものではなく、
プログラムを書いた人が勝手に付けた変数名です。

長文大変失礼しました。

投稿2019/06/05 15:38

maru0123

総合スコア47

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

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

consomme67

2020/09/28 08:42

疑問に対してドンピシャでした ありがとうございます…!
guest

0

このコードを書いた人が付けたオブジェクト名であり、Pythonの予約語ではありません。

投稿2017/11/14 14:39

driller

総合スコア720

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

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

0

"ret"は,cap.read()でフレームが正しく読み込めたかどうかを教えてくれるフラグです。

投稿2017/11/14 14:18

編集2017/11/14 14:19
WathMorks

総合スコア1582

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

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

osashimi

2017/11/14 14:26

retはインポートしたcv2に依るものですか?
WathMorks

2017/11/14 14:34

依存しません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問