Opencvは特殊効果を追加します(顔検出)

休暇中に間接的にopencvのことを学びました。以前はopencvライブラリのアイデアを呼び出して見たかったのですが、理解するのに少し時間がかかりました。読者が理解できる限り、メモは比較的ラフです。
私のアイデアは、opencvライブラリに付属している顔検出パッケージを使用して、市場に出回っている特殊効果ソフトウェアと同様の認識された顔を作成することです。
Opencvには、17面の機能検出パッケージが付属しています。パスは一般的に

/home/sms/opencv4.1.0/data/haarcascades

この道の下で。読者はオンラインにアクセスして、顔検出ライブラリを含むがこれに限定されないopencvのさまざまな検出パッケージについて学ぶことができます。
わかりました、言うことはあまりありません。直接開始

1.準備する資料:自分で作成した特殊効果の写真、特殊効果を追加する写真またはビデオ。opencvライブラリ
ここに画像の説明を挿入
ここに画像の説明を挿入
2を完成させてから、プログラムの作成を開始します
。1最初に、必要な画像(グレースケールレンダリングと元の画像、特殊効果のある顔画像)を読み取ります。

    src_img = imread("/home/sms/tu/1.jpg");//要加特效的图片
	src2_img = imread("/home/sms/tu/2.png");//特效图
2然后灰度图片
    cvtColor(src_img,gray_img,COLOR_RGBA2GRAY);
    equalizeHist(gray_img,gray_img);

3まず、顔認識検出器を読みます。以下は、顔検出パッケージの場所です。

string facades_path = "/home/sms/opencv4.1.0/data/haarcascades/haarcascade_frontalface_alt.xml";//opencv人脸检测xml文件,检测器
下面

4次に、通常の操作のパスを確認します

    if(!face_cascade.load(facades_path)){
    
    
        cout<<"打开xml文件路径错误"<<endl;
    }

5顔検出クラスのオブジェクトを定義します

CascadeClassifier face_cascade;

6認識された顔を保存して認識するために、個人用長方形のコンテナを定義します

    vector<Rect> faces;
    face_cascade.detectMultiScale(gray_img,faces,2.2,3,0,Size(1,1));

7認識された画像の結果を特殊効果画像と組み合わせます
。divi_imgは、ROI領域に分離される認識された顔の部分です。

        divi_img = src_img(Rect(faces[i].x,faces[i].y,faces[i].size().width,faces[i].size().height));//分离的人脸     

然后将图片合并展示,下面打DIVIWINDOW是宏定义的窗口名称,可以自行更改
        resize(src2_img,src2_img,Size(divi_img.cols,divi_img.rows*0.5));
        cvtColor(src2_img,src2_dst_img,COLOR_RGBA2GRAY);
        Mat roi = divi_img(Rect(0,src2_img.rows*0.3,src2_img.cols,src2_img.rows));
        src2_img.copyTo(roi,src2_dst_img); 
        imshow(DIVIWINDOW,divi_img);

最後に、元の画像を表示して完了です。ここに画像の説明を挿入
次に、私の魚のリースコードを提示します。

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include<opencv2/objdetect/objdetect.hpp>

#include<control.h>

using namespace std;
using namespace cv;

string facades_path = "/home/sms/opencv4.1.0/data/haarcascades/haarcascade_frontalface_alt.xml";//opencv人脸检测xml文件,检测器
CascadeClassifier face_cascade;
#define img_cap 0 //0打开图片,1打开视频(摄像头)
#define DIVIWINDOW "divi_img"
int main()
{
    
    
	Mat src_img,src2_img,src2_dst_img,gray_img,divi_img
    namedWindow(DIVIWINDOW,WINDOW_AUTOSIZE);
    if(!face_cascade.load(facades_path)){
    
    
        cout<<"打开xml文件路径错误"<<endl;
    }
#if img_cap == 0
    bool flag = false;
    src_img = imread("/home/sms/tu/3.jpg");
    // resize(src_img,src_img,Size(660,480));
    if(src_img.empty())
    {
    
    
        cout<<"未找到图片位置"<<endl;
    }
    imshow("srcImage",src_img);
    src2_img = imread("/home/sms/tu/2.png");
    if(src2_img.empty())
    {
    
    
        cout<<"图片路径错误"<<endl;
    }

    cvtColor(src_img,gray_img,COLOR_RGBA2GRAY);
    equalizeHist(gray_img,gray_img);

    face_cascade.detectMultiScale(gray_img,faces,2.2,3,0,Size(1,1));

    if(faces.size()!=0)
    {
    
    
        for (size_t i = 0; i < faces.size(); ++i)
        {
    
    
        Scalar color(rand()%255,rand()%255,rand()%255);
        rectangle(src_img,faces[i],color,3,8);
        divi_img = src_img(Rect(faces[i].x,faces[i].y,faces[i].size().width,faces[i].size().height));//分离的人脸     
        flag = true;
        }
    }
    if(flag == true)
    {
    
    
        resize(src2_img,src2_img,Size(divi_img.cols,divi_img.rows*0.5));
        cvtColor(src2_img,src2_dst_img,COLOR_RGBA2GRAY);
        Mat roi = divi_img(Rect(0,src2_img.rows*0.3,src2_img.cols,src2_img.rows));
        src2_img.copyTo(roi,src2_dst_img); 
        imshow(DIVIWINDOW,divi_img);
    }
    if(flag == true &&faces.size()<=0)
    {
    
    
        flag =false;
        destroyWindow(DIVIWINDOW);
    }
    imshow("src_img",src_img);

    cout<<"检测到的人脸个数是"<<faces.size()<<endl;
    waitKey(0);
    #endif
#if img_cap == 1
	Videocapture capture;
    bool flag = false;
    capture.open(0);
    for (;;)
    {
    
    
        src2_img = imread("/home/sms/tu/2.png");

        if(src2_img.empty())
        {
    
    
            cout<<"图片路径错误"<<endl;
         }
        capture>>src_img;
        cvtColor(src_img,gray_img,COLOR_RGBA2GRAY);
        equalizeHist(gray_img,gray_img);

        face_cascade.detectMultiScale(gray_img,faces,1.1,2,0,Size(1,1));

        if(faces.size()>0)
        {
    
    
            for (size_t i = 0; i < faces.size(); ++i)
            {
    
    
                rectangle(src_img,faces[i],Scalar(255,255,255),3,8);
                divi_img = src_img(Rect(faces[i].x,faces[i].y,faces[i].size().width,faces[i].size().height));//分离的人脸     
                resize(src2_img,src2_img,Size(divi_img.cols,divi_img.rows*0.5));
                cvtColor(src2_img,src2_dst_img,COLOR_RGB2GRAY);
                Mat roi = divi_img(Rect(0,src2_img.rows*0.3,src2_img.cols,src2_img.rows));
                src2_img.copyTo(roi,src2_dst_img); 

            flag =  true;
            }
        }
        if(flag == true)
        {
    
     
            // addWeighted(small_roi,1,src2_img,1,0.0,small_roi);
            imshow(DIVIWINDOW,divi_img);
        }
        if(faces.size()<=0&&flag == true)
        {
    
    
            flag = false;
            destroyWindow(DIVIWINDOW);
        }
        // char key = waitKey(1);//按键事件
        // if(key == 'q')
        // {
    
    
        //     destroyWindow(DIVIWINDOW);
        // }
        imshow("src_img",src_img);
        cout<<"检测到的人脸个数是"<<faces.size()<<endl;
        waitKey(15);

    }
#endif

}


おすすめ

転載: blog.csdn.net/Msyusheng/article/details/113571670