【VS(C#)+OpenCV(C++)】WEBカメラの映像を表示&顔認識してみる
はじめに
前回まで動画ファイルからの再生や静止画像から人の顔を認識させることをしました。
madai21.hatenablog.com
madai21.hatenablog.com
今回はWEBカメラを使ってリアルタイムにWEBカメラの映像を表示させつつ、人の顔認識もさせてみたいと思います。
環境
この記事で作成したVisualStudio2019+OpenCV4のプロジェクトがあることを前提に進めます。
madai21.hatenablog.com
WEBカメラを準備
WEBカメラはこちらを使いたいと思います。
リンク
私はYahoo!ショッピングで購入したのですが、開けたらこんな感じでした。
こちらが一緒に同梱されていた説明書です。
なぜかマスクも3枚同梱されていました^^;
子供用の給食マスクですねw
さてどこかにWebカメラを固定しようと思いましたが、ここで何かおかしいことに気づきました・・・。
ん?ラベル逆・・・?^^;
こっち向きですねww
とりあえず気にせずUSBをPCに挿します。
これだけでもうWebカメラが使えます、楽ですね^^
WEBカメラの映像をリアルタイムに表示
コードを修正してリアルタイムにWebカメラの映像を表示させてみましょう。
C++/CLI(OpenCVラッパー)プロジェクトの編集
OpenCVWrapper.hを開いて以下の内容に編集します。
#pragma once #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui_c.h> #include <msclr/marshal_cppstd.h> #include <vector> using namespace System; using namespace msclr::interop; namespace OpenCVWrapper { public ref class OpenCVWrapperCls { public: static void ShowWebCamera() { auto vc = cv::VideoCapture(0); while (vc.isOpened()) { cv::Mat mat; vc >> mat; if (mat.empty()) { continue; } cv::imshow("Show Web Camera Window", mat); auto key = cv::waitKey(1); if (key == 27) { break; } } cv::destroyAllWindows(); } }; }
動画ファイルの時は
cv::VideoCapture(動画ファイルのパス)
でしたが、今回はcv::VideoCapture(0)
としています。この数値はカメラデバイスのIDとなります。
1台しか接続していない場合は0です。
WEBカメラの映像から人物の顔認識
さぁ次はWebカメラの映像からリアルタイムに人物の顔認識させてみましょう。
C++/CLI(OpenCVラッパー)プロジェクトの編集
OpenCVWrapper.hを開いて以下の内容に編集します。
#pragma once #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui_c.h> #include <msclr/marshal_cppstd.h> #include <vector> using namespace System; using namespace msclr::interop; namespace OpenCVWrapper { public ref class OpenCVWrapperCls { public: static void ShowWebCamera() { auto vc = cv::VideoCapture(0); while (vc.isOpened()) { cv::Mat mat; vc >> mat; if (mat.empty()) { continue; } std::vector<cv::Rect> faces; cv::CascadeClassifier cc("C:\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml"); cc.detectMultiScale(mat, faces); for (int i = 0; i < faces.size(); i++) { rectangle(mat, cv::Point(faces[i].x, faces[i].y), cv::Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), cv::Scalar(0, 0, 255), 3, CV_AA); } cv::imshow("Show Web Camera Window", mat); auto key = cv::waitKey(1); if (key == 27) { break; } } cv::destroyAllWindows(); } }; }
実行すると・・・ちゃんと認識してくれてますね^^
写真なので精度は若干悪いですが、リアルな人物なら精度よく検出してくれそうですね。