プロが教えるわが家の防犯対策術!

import cv2

if __name__ == '__main__':
# 定数定義
ESC_KEY = 27 # Escキー
INTERVAL= 33 # 待ち時間
FRAME_RATE = 30 # fps

ORG_WINDOW_NAME = "org"
GAUSSIAN_WINDOW_NAME = "gaussian"

DEVICE_ID = 0

# 分類器の指定
cascade_file = "haarcascades/cascade.xml"
cascade = cv2.CascadeClassifier(cascade_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.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)

# フレーム表示
cv2.imshow(ORG_WINDOW_NAME, c_frame)
cv2.imshow(GAUSSIAN_WINDOW_NAME, img_gray)

# Escキーで終了
key = cv2.waitKey(INTERVAL)
if key == ESC_KEY:
break

# 次のフレーム読み込み
end_flag, c_frame = cap.read()

# 終了処理
cv2.destroyAllWindows()
cap.release()
とやってもできません(昨日まで、できていた。)

エラー内容
height, width, channels = c_frame.shape
AttributeError: 'NoneType' object has no attribute 'shape'
と表示されます。どういうことなのでしょうか?

質問者からの補足コメント

  • pip list 実行結果
    Package Version
    --------------------- ---------
    altgraph 0.17
    cycler 0.10.0
    decorator 4.4.2
    future 0.18.2
    h5py 2.10.0
    imageio 2.8.0
    Keras 2.3.1
    Keras-Applications 1.0.8
    Keras-Preprocessing 1.1.0

      補足日時:2020/05/13 17:23
  • numpy 1.18.4
    opencv-contrib-python 4.2.0.34
    pefile 2019.4.18
    Pillow 7.1.2
    pip 20.1
    PyInstaller 3.6
    pyparsing 2.4.7
    python-dateutil 2.8.1
    PyWavelets 1.1.1
    pywin32-ctypes 0.2.0

      補足日時:2020/05/13 17:24
  • PyYAML 5.3.1
    scikit-image 0.16.2
    scipy 1.4.1
    six 1.14.0
    wheel 0.34.2

      補足日時:2020/05/13 17:25

A 回答 (1件)

AttributeError: 'NoneType' object has no attribute 'shape'



書いてある通りです。
None オブジェクトのshape 属性にアクセスしようとしています。

height, width, channels = c_frame.shape
なので、 c_frame = None なのでしょう。

end_flag, c_frame = cap.read()
の時点で Noneになっていると思われます。
https://docs.opencv.org/3.4/d8/dfe/classcv_1_1Vi …
によると、取り込みできなかったきにNoneになる ので、そういうことなのでしょう。


これ以上はわかりません。
故障、接続不良、待ち時間、設定が変わったなど、いろいろ考えられます。

プログラムの方を直すなら、c_frameがNoneかどうかで処理を分岐する、等の対策を入れます。
    • good
    • 0
この回答へのお礼

回答していただきありがとうございます。おかげさまでエラーを回避できました。
エラーは出ていませんが、カメラは、出たのですが止まったままです。
どうしたらよいでしょうか?

お礼日時:2020/05/18 19:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A