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

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

ただいまの
回答率

88.93%

Pythonのretってなんですか

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 13K+

osashimi

score 26

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+7

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で簡単に使い方を見られます。

>>> import cv2
>>> help(cv2.VideoCapture().read)
Help on built-in function read:

read(...) method of cv2.VideoCapture instance
    read([, image]) -> retval, image
    .   @brief Grabs, decodes and returns the next video frame.
    .
    .   @param [out] image the video frame is returned here. If no frames has been grabbed the image will be empty.
    .   @return `false` if no frames has been grabbed

[後略]

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

追記

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

  • Pythonでは、タプルを利用することによって複数のオブジェクトを簡単に返せる。
    C++で同様のことをしようと思うと、そのためだけに構造体などを利用せねばなりません。
  • PythonはGCを採用しており、オブジェクトの寿命について考える必要がほとんどない。
    C++ではオブジェクトのスコープを意識しないでコードを書くのは不可能です。
  • Pythonでは、意識せずともオブジェクトの移行が軽量。
    C++ではデフォルトの値の移行がフルコピーであり、意図せず重くなることがあります。

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

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

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/14 23:31

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

    キャンセル

  • 2017/11/14 23:33

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

    キャンセル

  • 2017/11/15 00:02

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

    キャンセル

+2

import cv2

cap = cv2.VideoCapture(0)
print(cap.read())


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

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


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

import cv2

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


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

ret, frame = cap.read()


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

長文大変失礼しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/14 23:26

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

    キャンセル

  • 2017/11/14 23:34

    依存しません。

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る