ライブカメラに画像を挿入する方法について質問があります(特に、顔を検出した後、顔検出コードを持っています。顔を丸くして、画像を上に表示したい面)。任意のアイデアをいただければ幸いです。ここでライブカメラに画像を挿入する
私がこれまでに書いたコードです:
#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;
}
あなたはこれまで何をしていますか?いくつかのコードを投稿してください。すでに顔検出コードが機能している場合は、検出された顔の上に画像を表示するのは簡単です。 –
これはこれまでの私のコードですが、イメージをコピーしてフレームに貼り付けていますが、それはすべてのフレームをカバーしています。https://bugs.vn/6015 –
私の答えをご覧ください。それはあなたを始めることができるはずです。もしそうでなければ、私はそれをさらに改善することができますか? –