前提
Opencvを用いたc++のプログラミングについて
動画にモザイクをかける
実現したいこと
USBカメラからの画像を顔検出で顔の部分だけ切り取り、その切り取った部分にモザイクをかけ顔にモザイクがかかるというようなことをしたいのですが、切り取った画像をモザイクにするところまでできたのですがそれを元の動画に張り付けることが出来ません。
該当のソースコード
c++
1#include <opencv2/opencv.hpp> 2#include <opencv2/imgcodecs.hpp> 3using namespace cv; 4using namespace std; 5 6int main(void) { 7 CascadeClassifier cascade, cascade2; 8 cascade.load("haarcascade_frontalface_default.xml");//正面顔情報が入っているカスケードファイル読み込み 9 VideoCapture cap(0); 10 if (!cap.isOpened())return -1; 11 Mat original, img, bg; 12 Mat roi_img; 13 while (true) { 14 cap >> original; 15 cap >> img; 16 cap >> bg; 17 if (img.empty())break; 18 cvtColor(bg, bg, COLOR_RGB2RGBA); 19 20 vector<Rect> faces; 21 cascade.detectMultiScale(bg, faces, 1.1, 4, 0, Size(20, 20)); 22 Mat wimage = original.clone(); 23 for (int i = 0; i < faces.size(); i++) //検出した顔の個数"faces.size()"分ループを行う 24 { 25 Rect roi1(faces[i].x, faces[i].y, faces[i].width, faces[i].height); 26 wimage(roi1).copyTo(roi_img); 27 double rate = (double)faces[i].width / roi_img.cols; 28 resize(roi_img, roi_img, Size(), rate, rate); 29 erode(roi_img, roi_img, Mat(), Point(-1, -1), 10); 30 dilate(roi_img,roi_img, Mat(), Point(-1, -1), 3); 31 32 Mat roi2 = bg(Rect(faces[i].x, faces[i].y, roi_img.cols, roi_img.rows)); 33 roi_img.copyTo(roi2, roi_img); 34 } 35 imshow("roi", roi_img); 36 imshow("bg", bg); 37 imshow("original", original); 38 39 waitKey(30); 40 } 41 destroyAllWindows(); 42 return 0; 43}
> 元の動画に張り付けることが出来ません
「元の動画に張り付ける」とは具体的にどういう意味ですか?
コードを見た感じでは,bg には「モザイクをかけた」状態が反映されていそうにも見えますが,実装にはそうなっていない,というような意味でしょうか?
あと,コードを示す場合,主題に関わらない部分は雑音となり得るので,現象が再現する必要最低限の状態を作って示すと良いかと思います.
例えば,常に3フレーム1組で取得するような処理は不思議に思えるし,そのうち1個しかempty()の判定をしないこと等も何か気になってしまう.
他にも wimageは不要に思えるし,resizeも意味がないのでは?とか何とか etc etc...
それらが質問で扱おうとする主題と関係ないのであれば,質問する際には取っ払った方が良い.
やりたいことが「画像のある一部を切り出して,それにモザイクをかけ,その結果を元々の画像の該当部分に反映させたい」で合っているなら,キャプチャ処理や検出器すらも不要.

あなたの回答
tips
プレビュー