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

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

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

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

Q&A

解決済

1回答

2405閲覧

パソコンのカメラに映った顔を検出するプログラムを走らせてみたい

Java_Test2019

総合スコア27

Python

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

0グッド

1クリップ

投稿2019/08/27 08:11

プログラミング初心者です。最近Pythonを勉強し始めまして、色々調べているとリアルタイムでカメラに映った映像から顔の部分を認識するプログラム、いわゆる顔検出プログラムというものを作る事が出来るらしいと知りました。
調べれば結構コード丸々書いているサイトが出てきまして、そのコードの一つを実際実行するとどうなるのか気になって、jupyter notebookにコピペして試そうと思いました。しかしエラーになりました。
下記URLの、「PCのビデオカメラでリアルタイム顔認識をやってみる」という所のコードです。
http://totech.hateblo.jp/entry/2017/10/22/100726

import numpy as np import cv2 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') cap = cv2.VideoCapture(0) while(True): ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] eyes = eye_cascade.detectMultiScale(roi_gray) for (ex,ey,ew,eh) in eyes: cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) cv2.imshow('img', img) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()

error Traceback (most recent call last)
<ipython-input-17-6e48f27e37a3> in <module>
6 while(True):
7 ret, img = cap.read()
----> 8 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
9 faces = face_cascade.detectMultiScale(gray, 1.3, 5)
10 for (x,y,w,h) in faces:

error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

実は、「OpenCVの顔認識チュートリアルをやってみる」の所でも同じgrayの文でエラーが出て、更に他のサイトの顔検出プログラムでも同様でした。
エラー文について調べていくと「パスが通ってない」?というキーワードをよく見かけました。
既に色々わからない事だらけで、少しでも助言を頂けたら助かります。お待ちしております。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因

error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

cvtColor を実行した際にこのエラーが出るということは、恐らく、画像の取得に失敗して、imgNone になっています。

ret, img = cap.read() の返り値 ret は、読み込みに失敗した場合は False になるので、この値をチェックしてください。

取得に失敗した原因として、以下が考えられます。

  • カメラが PC に認識されていない
  • cv2.VideoCapture に指定した device_id が間違っている。

→ cv2.VideoCapture(1)、cv2.VideoCapture(2) など試してみる。

画像で顔検出する場合のサンプルコード

python

1from pathlib import Path 2import cv2 3import matplotlib.patches as mpatches 4import matplotlib.pyplot as plt 5import numpy as np 6 7 8def draw_face_locations(img, locations): 9 fig, ax = plt.subplots(figsize=(7, 7)) 10 ax.imshow(img[..., ::-1]) 11 ax.set_axis_off() 12 13 for x, y, w, h in locations: 14 rect = mpatches.Rectangle((x, y), w, h, ec="orange", lw=3, fill=None) 15 ax.add_patch(rect) 16 plt.show() 17 18 19# 画像を読み込む。 20img = cv2.imread("sample.jpg") 21 22# カスケード検出器を作成する。 23cascade_path = Path(cv2.data.haarcascades) / "haarcascade_frontalface_default.xml" 24detector = cv2.CascadeClassifier(str(cascade_path)) 25 26# 検出する。 27locations = detector.detectMultiScale( 28 img, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30) 29) 30 31# 可視化する。 32draw_face_locations(img, locations)

イメージ説明

入力画像

イメージ説明

出力画像

投稿2019/08/27 08:31

tiitoi

総合スコア21954

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

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

Java_Test2019

2019/08/27 08:55 編集

回答有難う御座います。 実はこれより前にPC内蔵カメラをキャプチャするプログラムを作っていまして、その時は同様に cap = cv2.VideoCapture(0)、ret, frame = cap.read()の流れで上手く行きました。 ですので、素人の生意気な意見ですがカメラキャプチャの部分がエラーの原因ではないのかなと、おそらくですが思っています。 もう少し、回答の内容、サイトの内容から推理しようと思います。
tiitoi

2019/08/27 09:17

----> 8 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ここでエラーが起きているので、この直前に print(ret) print(img) を挿入して、出力結果を追記していただけますか。
Java_Test2019

2019/08/27 09:24

下記のような実行結果になりました。 False None --------------------------------------------------------------------------- error Traceback (most recent call last) <ipython-input-18-5669774300b0> in <module> 8 print(ret) 9 print(img) ---> 10 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 11 faces = face_cascade.detectMultiScale(gray, 1.3, 5) 12 for (x,y,w,h) in faces: error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor' ありがとうございます。そしてすみません、貴方の言うようにカメラの映像を読み取れていないらしいです。カメラキャプチャの部分がエラーの原因とみて調べてみます。
tiitoi

2019/08/27 10:22

> 実はこれより前にPC内蔵カメラをキャプチャするプログラムを作っていまして、その時は同様に > cap = cv2.VideoCapture(0)、ret, frame = cap.read()の流れで上手く行きました。 もう一度、そのプログラムを実行してみて、キャプチャ単体であれば上手くいくのか確認されてはどうでしょうか。 うまくいかない場合はカメラが正しく接続できていないか、device_id が変わった可能性があります。
Java_Test2019

2019/08/28 07:05

すみません、あれこれ試行錯誤して調べたのですがどうも解決に至らないです。 せっかく手助けを頂いたのに申し訳ありませんが保留にします。(このプログラム作りをやめるわけではありません。ただ、少しも進まないのでここに追記する事がなく、放置に見えるものと化してしまっています・・・・)
Java_Test2019

2019/08/28 07:07

誠に有難うございました。勿論解決に至るまでまだ続けますが、なにか進み次第、または調べて解決に至ればその過程をメモのためにもここに書こうと思います。
Java_Test2019

2019/09/06 05:54

ようやく解決しました。カスケードファイルがいつの間にかjupyter notebookから削除されていました。PCの中のpyファイル群と同じディレクトリにカスケードファイル入れてたのに動かない事と、カスケードファイルがないならないで顔や目に枠を作る所だけ機能せずカメラだけ動けばいいのに動かなかった事はどうもわかりませんが、ともかくjupyter notebook「に」、プログラム上の指定のカスケードファイルをUpdateしたら動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問