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

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

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

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

Python

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

Q&A

解決済

2回答

536閲覧

機械学習のための顔画像に矩形で囲む

fufufu000

総合スコア29

OpenCV

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

Python

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

0グッド

0クリップ

投稿2018/08/28 15:30

編集2018/08/29 17:25

実現したいこと

機械学習のために保存した100マイの写真の顔の部分を矩形で囲むプログラミングを組みたいのですがエラーが出てしまい実行できません。何がいけないのでしょうか?
レクチャーよろしくお願いします!

発生している問題・エラーメッセージ

File "C:/Users/saito/PycharmProjects/kenkyu/kukei.py", line 20, in <module> gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.error: OpenCV(3.4.2) c:\projects\opencv-python\opencv\modules\imgproc\src\color.hpp:253: error: (-215:Assertion failed) VScn::contains(scn) && VDcn::contains(dcn) && VDepth::contains(depth) in function 'cv::CvtHelper<struct cv::Set<3,4,-1>,struct cv::Set<1,-1,-1>,struct cv::Set<0,2,5>,2>::CvtHelper'

該当のソースコード

import cv2 import numpy as np # 先ほど集めてきた画像データのあるディレクトリ input_data_path = 'images/' # 切り抜いた画像の保存先ディレクトリ(予めディレクトリを作っておいてください) save_path = 'images111/' # OpenCVのデフォルトの分類器のpath。(https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xmlのファイルを使う) cascade_path = r"C:\Users\saito\PycharmProjects\kenkyu\venv\Lib\site-packages\cv2\data\haarcascade_frontalface_alt.xml" faceCascade = cv2.CascadeClassifier(cascade_path) # 収集した画像の枚数(任意で変更) images_count = 100 # 顔検知に成功した数(デフォルトで0を指定) face_detect_count = 0 # 集めた画像データから顔が検知されたら、切り取り、保存する。 for i in range(images_count): img = cv2.imread(input_data_path + str(i) + ".png", cv2.IMREAD_COLOR) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) face = faceCascade.detectMultiScale(gray, 1.1, 3) if len(face) > 0: for rect in face: # 顔認識部分を赤線で囲み保存(今はこの部分は必要ない) # cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0,255), thickness=1) # cv2.imwrite('detected.jpg', img) x = rect[0] y = rect[1] w = rect[2] h = rect[3] cv2.imwrite(save_path + 'images' + str(face_detect_count) + '.jpg', img[y:y+h, x:x+w]) face_detect_count = face_detect_count + 1 else: print ('image' + str(i) + ':NoFace')

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

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

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

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

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

guest

回答2

0

ここ、変じゃないですか?

Python

先ほど集めてきた画像データのあるディレクトリ

input_data_path = r"C:\Users\saito\PycharmProjects\kenkyu\images.png"

ディレクトリと書いているのに、画像パスが指定されています。
そのせいでimreadに失敗し、追随してcvtColorがコケているのかと。


imreadは読み込みに失敗しても処理を適切に中断してくれません。
読み込みに失敗したのか/そうでないのか 明確にするために、こんなコードを埋めておくと良いです。

Python

1img = cv2.imread(input_data_path + str(i) + '.jpg', cv2.IMREAD_COLOR) 2assert img is not None, 'failed to read img.'

投稿2018/08/28 15:35

編集2018/08/29 01:11
LouiS0616

総合スコア35660

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

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

fufufu000

2018/08/28 15:41

なるほど!ちなみに、ディレクトリ名ってどんな感じのやつですか?
LouiS0616

2018/08/28 15:42

ディレクトリは、いわゆるフォルダのことです。
fufufu000

2018/08/28 20:24

フォルダの名前を書くのですか?パスを書くのですか? 初心者すぎてごめんなさい!
LouiS0616

2018/08/29 01:04

フォルダのパスを書きます。
fufufu000

2018/08/29 09:24

書き換えて試してみたのですが、同じ内容のエラーが出てしまいます。何か間違っているのでしょうか?
LouiS0616

2018/08/29 13:28

input_data_path = 'imaga000/' にしてみてください。 現状のコードでは、カレントディレクトリの imaga0000.jpg を開こうとしています。
fufufu000

2018/08/29 17:27

書き換えてやってみたのですが、相変わらずできません泣泣 なんでできないんでしょう!!!!!!!!!!!!
LouiS0616

2018/08/30 01:27

パスを相対パスじゃなくて絶対パスにしてみては? Windowsの場合 Shiftを押しながらフォルダを右クリック ⇒ 『パスのコピー』で取得できます。
fufufu000

2018/08/30 03:30

1番最初のやつがそのやり方でやったやつです!何度も丁寧にありがとうございます!
LouiS0616

2018/08/30 03:45

一番最初のやつって、C:\Users\saito\PycharmProjects\kenkyu\images.png これのことですか?
guest

0

ベストアンサー

Giitaからソースコードをコピペしたんだと思いますが。

このプログラムが正しく動作するにはLouiS0616さんの指摘以外にも複数の暗黙の前提条件があり、
質問者さんはその前提条件のどれかを満たしていないのではと。

  1. 集めた画像データはpng形式ですか、jpg形式ですかどちらですか。
  2. png形式ならば、imagesフォルダ内に画像ファイルが0.png1.pngと連番で99.pngまで全部ありますか。
  3. images111のフォルダは作成済みですか。

質問文のコードを改造して、以下の2機能を追加しました。
1,保存先のフォルダを自動作成する。
2,ファイルが読み込めない時にファイル名の絶対パスを表示する。

assertで表示されるファイルパスとエクスプローラーで実際のファイル名を確認してみてくださいな。

Python

1import cv2 2import numpy as np 3from pathlib import Path # この行を追加 4 5# 切り抜いた画像の保存先ディレクトリ 6save_path = 'images111/' 7# 保存先ディレクトリを作成 ←追加 8Path(save_path).mkdir(parents=True, exist_ok=True) 9 10# 中略 11# 集めた画像データから顔が検知されたら、切り取り、保存する。 12for i in range(images_count): 13 file_name = input_data_path + str(i) + ".png" 14 img = cv2.imread(file_name, cv2.IMREAD_COLOR) 15 assert img is not None, Path(file_name).absolute() 16 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 17 # 後略

◆実行環境の構成を纏めると以下になります。

txt

1\images  ←imageフォルダではなくimagesフォルダです。 2+ +- 0.png 3+ +- 1.png 4+ +- 2.png 5+ 6\images111 7+ 8+ 質問文のスクリプト.py 9\ ←スクリプトをこの位置で実行する必要がある。※1 10

プログラムの不具合を修正したら、そのままで終わるのではなく。
修正した物+そのバグを事前に防げるコードに考えて変更してくださいな。

あと暗黙の前提を置かないようにプログラムは記述します。

投稿2018/08/30 04:08

編集2018/08/30 04:17
umyu

総合スコア5846

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

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

fufufu000

2018/08/30 10:52

出来ました!!!!ありがとうございます!!!
umyu

2018/08/30 10:57

@fufufu000さんへ 今後のために、出来たで終わるのではなく、デバックの仕方、質問の仕方も勉強してくださいな。
umyu

2018/08/30 11:10

あとベストアンサーは親身になって受け答えをしていた、LouiS0616さんなのでは。
fufufu000

2018/09/02 06:56

もちろんお世話になったのでLouiS0616さんには高評価を押させていただきました。ですが、今後この質問を誰かが見た時に、スムーズに対策できるほうはどの回答かで判断させていただいています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問