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

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

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

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

C++

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

Q&A

1回答

1243閲覧

OpenCv 顔検出数

water28

総合スコア5

OpenCV

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

C++

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

0グッド

0クリップ

投稿2020/07/14 15:30

編集2020/07/15 02:30

OpenCvについてです。
c++で顔を検出して人数をカウントしたいです。
顔を検出するプログラムはopencvの公式ホームページのものを参考にしました。
このプログラムを使って検出数を出したいのですがどうすればいいですか?
教えていただきたいです。よろしくお願いします

さまざまな変数をprintf で表示して調べてみましたがどうしてもできません。
顔検出が丸く出るのでサークルのところを中心に見ています。
例えばサークルの座標を検出数分表示しようと思ったのですができませんでした。可能でしょうか?
どのように考えれば良いのでしょうか?

using namespace cv; /** Function Headers */ void detectAndDisplay(Mat frame); /** Global variables */ CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; /** @function main */ int main(int argc, const char** argv) { CommandLineParser parser(argc, argv, "{help h||}""{face_cascade|data/haarcascades/haarcascade_frontalface_alt.xml|Path to face cascade.}""{eyes_cascade|data/haarcascades/haarcascade_eye_tree_eyeglasses.xml|Path to eyes cascade.}""{camera|0|Camera device number.}"); parser.about("\nThis program demonstrates using the cv::CascadeClassifier class to detect objects (Face + eyes) in a video stream.\n""You can use Haar or LBP features.\n\n"); parser.printMessage(); String face_cascade_name = samples::findFile(parser.get<String>("face_cascade")); String eyes_cascade_name = samples::findFile(parser.get<String>("eyes_cascade")); //-- 1. Load the cascades if (!face_cascade.load(face_cascade_name)) { cout <<"--(!)Error loading face cascade\n"; return -1; }; if (!eyes_cascade.load(eyes_cascade_name)) { cout <<"--(!)Error loading eyes cascade\n"; return -1; }; int camera_device = parser.get<int>("camera"); VideoCapture capture; //-- 2. Read the video stream capture.open(camera_device); if (!capture.isOpened()) { cout <<"--(!)Error opening video capture\n"; return -1; } Mat frame; while (capture.read(frame)) { if (frame.empty()) { cout <<"--(!) No captured frame -- Break!\n"; break; } //-- 3. Apply the classifier to the frame detectAndDisplay(frame); if (waitKey(10) == 27) { break; // escape } } return 0; } /** @function detectAndDisplay */ void detectAndDisplay(Mat frame) { Mat frame_gray; cvtColor(frame, frame_gray, COLOR_BGR2GRAY); equalizeHist(frame_gray, frame_gray); //-- Detect faces std::vector<Rect>faces; face_cascade.detectMultiScale(frame_gray, faces); for (size_t i = 0; i <faces.size(); i++) { Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4); Mat faceROI = frame_gray(faces[i]); //-- In each face, detect eyes std::vector<Rect>eyes; eyes_cascade.detectMultiScale(faceROI, eyes); for (size_t j = 0; j <eyes.size(); j++) { Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2); int radius = cvRound((eyes[j].width + eyes[j].height) * 0.25); circle(frame, eye_center, radius, Scalar(255, 0, 0), 4); } } //-- Show what you got imshow("Capture - Face detection", frame); }

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

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

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

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

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

can110

2020/07/15 01:18

提示コードにおいて「faces」および「faces.size()」が名を表しているかを記載ください。
tiitoi

2020/07/15 02:41

faces.size() がそのまま検出数ではないですか
water28

2020/07/15 02:47

ありがとうございます。 できました。
guest

回答1

0

顔検出が丸く出る

のであれば,丸を描いている箇所を何回通るか(通ることになっているのか)を見れば良いのではないでしょうか.

投稿2020/07/15 01:24

fana

総合スコア11654

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

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

water28

2020/07/15 01:34

回答ありがとうございます。 すみません自分の力不足でそのやり方がわかりません。 どのようにすれば表示できますか? 教えていただきたいです。
fana

2020/07/15 01:55

えっと…「顔の場所に円を描くプログラムを作った」んですよね? 円を描く処理を実装している時点で,個数を知る方法は既知ですよね? 円を描くには,当然,円の座標がわかっているハズですよね? …つまり,そのプログラムはご自身で書いたわけではないのですよね. そのような場合は, > プログラムは以下のようにしました とは表現しないように思います.
fana

2020/07/15 01:57

で,まぁ, > ellipse( ... ) の行が,その円を描いている箇所ではないかと見えるので, 「そこが何回通るのか」&「円を描画する座標の値と言うのはどれか」というのをそこから読み取ればよいでしょう. それができないようだと,C/C++の基礎文法のレベルの話になります. (こんなコードをどこかからパクっている場合では無い)
water28

2020/07/15 02:31

すみません。修正しました。 まだ初心者ですがこのコードを使って作りたいものがあるので質問しました。 すみません。
fana

2020/07/15 02:36

> ellipse > center なんていう,【いかにもな】名前も見えてるのですから,そこらへんで使われている値を片っ端から表示してみたら(値を結果の絵のpixel座標と見比べたら),どれが何なのかわかるのでは.
water28

2020/07/15 02:49

たくさん教えていただきありがとうございます。 指摘のなどもありがとうございました。 以後気をつけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問