将图片插入实时摄像机 [英] Insert picture to live camera

查看:106
本文介绍了将图片插入实时摄像机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个疑问,如何将图片插入实时摄像机(特别是我有一个面部检测代码,在检测到面部之后,我希望它圈出我的脸并在其顶部显示图像).任何想法将不胜感激.

I have question how I can insert a picture into a live camera ( in particular I have an face detection code, after detect face, I want it to circled my face and display an image on top of the face). Any ideas will be appreciated.

这是我到目前为止编写的代码:

Here is the code I've written so far:

#include <cv.h>
#include <highgui.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/videoio/videoio.hpp>
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;

// These are global variables
char face_cascade_name[] = "c:\\Program Files\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml";
char eyes_cascade_name[] = "c:\\Program Files\\opencv\\build\\etc\\haarcascades\\haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;


// This is function detectAndDisplay()
// The input, or parameter, is a Mat object.
// It does not return a value, thus the return type "void".

void detectAndDisplay( Mat frame ) {
    std::vector<Rect> faces;
    Mat frame_gray;

    cvtColor( frame, frame_gray, COLOR_BGR2GRAY );
    equalizeHist( frame_gray, frame_gray );  // increase the image contrast
    //-- Detect faces
    face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) );

    // For each face in the frame. faces[i] is a Rect, so it has a
    //     top-left corner (faces[i].x,faces[i].y)
    //     and dimensions faces[i].width x faces[i].height
    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, 8, 0 )

        Mat faceROI = frame_gray( faces[i] );  // image of the face



    }
}


int main( void ) {
    VideoCapture cap(0);
    Mat frame;
    int frameCount;
    int fr=1,i=1;
      char name[20],s[20];
      Mat image;
      while(fr<=751)
      {
      sprintf(name,"Hello.jpg",i);

      image = imread(name,CV_LOAD_IMAGE_COLOR);   // Read the file

      if(! image.data )                              // Check for invalid input
      {
      cout <<  "Could not open or find the image" << std::endl ;
      return -1;
      }
      sprintf(s,"pic/img%u.jpg",i);
      imwrite(s,image);
      fr++;
      i++;
      }
    namedWindow("Faces",CV_WINDOW_FULLSCREEN);

    // 1. Load the cascades
    if( !face_cascade.load( face_cascade_name ) ) {
        printf("--(!)Error loading face cascade\n");
        return -1;
    }
    if( !eyes_cascade.load( eyes_cascade_name ) ){
        printf("--(!)Error loading eyes cascade\n");
        return -1;
    }
    // 2. Read the video stream
    if (!cap.isOpened() ) {
        printf("--(!)Error opening video capture\n");
        return -1;
    }


    for (frameCount = 0; frameCount < 1000000000; frameCount++) {

        cap >> frame;
        detectAndDisplay( frame );
        image.copyTo( frame );
        namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
        imshow( "Display window", image );
        imshow( "Faces",frame );
        int c = waitKey(10);
        if ((char)c == 27 ) {   // if the "Escape" key is pressed
            break;
        }
    }
    return 0;
}

推荐答案

以下代码段显示了如何在另一张图像的顶部绘制具有透明度的图像.对于此示例,我使用了两个图像:

The following snippet of code shows you how to draw an image with transparency on top of another image. For this sample, I used two images:

  • a picture of a face (jpg format)
  • a picture of a mustache with transparency (png format)
#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat face;
    face = imread("face.jpg", 1); // the face we want to apply an image on. This can of course be replaced by a camera's frame.

    Mat mustache;
    mustache = imread("CurlyMustache.png", IMREAD_UNCHANGED); // the image we will apply on top of the face. IMREAD_UNCHANGED allows to load an image with its transparency channel.

    Size size = Size(118, 50);
    resize(mustache, mustache, size, 0.0,0.0, INTER_AREA); // resize the mustache to the wanted size. INTER_AREA interpolation gives good results.

    Point2i draw_position(160, 275); // the position where to draw the mustache

    // blend the mustache with the face
    for (int y = 0; y < mustache.rows; ++y)
    {
        for (int x = 0; x < mustache.cols; ++x)
        {
            cv::Vec4b & pixel = mustache.at<cv::Vec4b>(y, x); // mustache's pixel
            cv::Vec3b & pixel_dst = face.at<cv::Vec3b>(y + draw_position.y - size.height / 2, x + draw_position.x - size.width / 2); // destination image's (face) pixel

            pixel_dst = (pixel[3] / 255.0f) * Vec3b(pixel[0], pixel[1], pixel[2]) + (1 - pixel[3] / 255.0f) * pixel_dst; // we blend the two pixels according to the transparency of the mustache's pixel.
        }
    }

    putText(face, "your text here", Point(draw_position.x - 20, draw_position.y - 50), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0), 2); // adds text on screen

    namedWindow("Display Image", WINDOW_AUTOSIZE);
    imshow("Display Image", face);

    waitKey(0);

    return 0;
}

这是结果:

此解决方案效率不是很高(因为我们必须遍历胡须图像的所有像素),但是由于 OpenCV transparency ,我认为这是一个不错的选择.希望对您有帮助!

This solution is not very efficient (as we have to loop over all the pixels of the mustache's image) but as OpenCV doesn't mix up too well with transparency, I think it's a decent one. Hope it helps!

这篇关于将图片插入实时摄像机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆