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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

1250閲覧

opencv 顔検出 エラー

rairarara

総合スコア10

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/29 22:50

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
顔検出のプログラムをやっています。
自分は独学で始めたばかりで指導者がおらずまだよくわかっていません。このエラーはなぜ出たのでしょうか?
エラーの意味がよくわかっていません????
もしわかる方がおりましたら教えていただけると嬉しいです

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

OpenCV: terminate handler is called! The last OpenCV error is:
OpenCV(4.0.0-alpha) Error: Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale, file C:\build\master_winpack-build-win64-vc14\opencv\modules\objdetect\src\cascadedetect.cpp, line 1693

エラーメッセージ

該当のソースコード

ソースコード #pragma comment(lib,"opencv_world400.lib") #include <opencv2/opencv.hpp> #include <iostream> #include <opencv2/core/core.hpp> #include <cassert> #include <opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; int main(int argc, char* argv[]) { try { if (argc < 3) throw"few parameters."; UMat src, gray, equalize, dst; imread(argv[1]).copyTo(src); cvtColor(src, gray, COLOR_RGB2GRAY); equalizeHist(gray, equalize); CascadeClassifier objDetector(argv[2]); vector<Rect> objs; objDetector.detectMultiScale(equalize, objs, 1.2, 2, 0, Size(30, 30)); src.copyTo(dst); vector<Rect>::const_iterator it = objs.begin(); for (; it != objs.end(); ++it) { rectangle(dst, Point(it->x, it->y), Point(it->x + it->width, it->y + it->height), Scalar(0, 0, 200), 2, 8); } imshow("src", src); imshow("dst", dst); waitKey(0); } catch (const char* str) { cerr << str << endl; } return 0; } ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

tiitoi

2018/11/30 05:57

argv[2] にカスケード定義ファイル (.xml) を引数で渡してると思いますが、そのファイルは実際存在していますか?
rairarara

2018/12/01 12:55

回答ありがとうございます!そのxmlファイルをビルドが終わったあとの実行プログラムが存在するx64Releaseのフォルダに置いて同じソリューション内でアクセスできるようにしています。(もしかしてこれがいけないのでしょうか。。。)
rairarara

2018/12/01 12:57

すいません、xmlをつけ忘れていたみたいでつけたらnew test1.jpg haarcascade_mcs_mouth.xml OpenCV: terminate handler is called! The last OpenCV error is: OpenCV(4.0.0-alpha) Error: Unknown error code -220 (OpenCL error CL_OUT_OF_RESOURCES (-5) during call: clEnqueueReadBuffer(q, handle=000001BF3C416040, CL_TRUE, 0, sz=120004, data=000001BF3CE870C0, 0, 0, 0)) in cv::ocl::OpenCLAllocator::map, file C:\build\master_winpack-build-win64-vc14\opencv\modules\core\src\ocl.cpp, line 5007と少し進み?ました
guest

回答1

0

エラーメッセージの内容自体は簡単です。一つづつ見てみましょう。

Error: Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale,
CascadeClassifierというクラスのdetectMultiScaleメソッドでアサーションエラーを検出したという意味ですね。
アサーションとはプログラムの実行条件を満たしているかチェックするための処理で、条件が**”偽”**だった場合にエラーを報告してプログラムの実行を止めるための機能です。
この場合は、何かが空(empty)だったからエラーとして終了してしまったのでしょうね。

C:\build\master_winpack-build-win64-vc14\opencv\modules\objdetect\src\cascadedetect.cpp, line 1693
このエラーは、cascadedetect.cppの1693行目で見つかりました。

ここまで、分かればdetectMultiScaleメソッドの仕様をググって確認したり、cascadedetect.cppの中身を読むなりして、正しく動作する条件を満たさない原因を探ってください。

今回の場合は、tiitoiさんの指摘のようにカスケードが設定されていない**(空)**のが原因だと思いますが。

投稿2018/12/01 11:21

TaroToyotomi

総合スコア1430

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

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

rairarara

2018/12/01 13:00

わかりやすい回答ありがとうございます! とても勉強になり、一つ賢くなりました(`・ω・´)ゞ 一応emptyから少し進んだ?と思われるのでこのエラーもよくわかりませんが頑張って解決していきたいと思います!今回はありがとうございました
TaroToyotomi

2018/12/02 06:46

少し進んだみたいでよかったです。 ちなみに"OpenCL error CL_OUT_OF_RESOURCES (-5)"のエラーですが、OpenCVから呼び出しているOpenCLのclEnqueueReadBuffer()関数でリソースの範囲外アクセスしたためエラーとなっています。 原因は何とも言えませんが、GPU絡みのエラーの可能性もありますので、まずはGPUを無効化して試してみては。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問