【问题标题】:Replacing cv2 face detection photo with overlayed image用叠加图像替换 cv2 人脸检测照片
【发布时间】:2021-05-24 07:19:22
【问题描述】:

我已使用 cv2 从上传的图像中检测到我的眼睛,但我想将图像粘贴到 cv2 检测到我的脸的位置。 View cv2 eye detection photo output here

但不是输出我眼睛周围的 cv2 矩形,我想用图像替换它。 有没有办法将图像粘贴到 cv2 检测到我眼睛的位置?

我的python脚本

import os
import numpy as np
import cv2
from os.path import join, dirname, realpath
from flask import Flask, render_template, request, redirect, url_for, abort
from werkzeug.utils import secure_filename

def upload_files():
    uploaded_file = request.files['file']
    filename = secure_filename(uploaded_file.filename)
    if filename != '':
        file_ext = os.path.splitext(filename)[1]
        if file_ext not in app.config['UPLOAD_EXTENSIONS'] or \
                file_ext != validate_image(uploaded_file.stream):
            abort(400)
        uploaded_file.save('new.png')
   
    face_cascade = cv2.CascadeClassifier('/haarcascade_eye.xml')
    eye_cascade = cv2.CascadeClassifier('/haarcascade_eye.xml')

    img = cv2.imread('new.png')
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
         cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
         roi_gray = gray[y:y+h, x:x+w]
         roi_color = img[y:y+h, x:x+w]
         eyes = eye_cascade.detectMultiScale(roi_gray)
         for (ex,ey,ew,eh) in eyes:
             cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
    cv2.imwrite("out.png", img)

请记住,上面的脚本会生成此photo output。我想删除矩形并使用 cv2 将图像粘贴到 cv2 检测到我的眼睛的位置。

【问题讨论】:

标签: python python-3.x cv2


【解决方案1】:

我认为这就是您要寻找的:

import os
import numpy as np
import cv2
from os.path import join, dirname, realpath

def upload_files():
   
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

    img = cv2.imread('face.jpg')
    img_to_place = cv2.imread('img.png')

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    gray_to_place = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    img_h, img_w = gray.shape
    img_to_place_h, img_to_place_w = gray_to_place.shape

    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            resized_img = cv2.resize(img_to_place, (eh, ew), interpolation = cv2.INTER_AREA)
            resized_img_h, resized_img_w, _ = resized_img.shape

            roi_color[ey:ey+resized_img_h, ex:ex+resized_img_w, :] = resized_img

    cv2.imwrite('out.png', img)

upload_files()

基本上,您加载要放入眼睛的图像,将其调整为 ROI 大小,然后将其放在矩形所在的坐标中。

例子:

【讨论】:

  • 那张图片正是我要找的,但是代码产生了这个错误:cv2.error: OpenCV(4.4.0) /private/var/folders/nz/vv4_9tw56nv9k3tkvyszvwg80000gn/T/pip-req-build-gi6lxw0x/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor 看起来是读取图片的问题,你知道我该如何解决这个问题吗?跨度>
  • 我很笨,只需要替换文件名...谢谢!快速提问,这就是它所产生的:i.imgur.com/vTRux2s.jpg 我怎样才能只输出我眼睛上的那些?像for x in range(2) 这样的东西有用吗?
  • 我认为这是一个误报,有很多方法可以解决它,比如训练一个更好的级联:learnopencv.com/…(我没有尝试过这个教程,但看起来不错)。这是一个复杂的解决方案,相反,您可以将检测到的眼睛与面部大小的比例进行比较,然后尝试消除误报。每张脸只能检测两只眼睛,但您也可以检测到错误的两只眼睛。
  • 谢谢!您是否认为在范围(0,2)中执行以下操作:if ew == top 2 largest numbers in list then paste those image only 会起作用?我怎样才能只返回只有最大宽度的图像?那有意义吗?例如,将此代码放入:pointsOnFace = []integersToAppend = ewpointsOnFace.append(integersToAppend)print(pointsOnFace) 返回[22][196][74][225][225][52][44]
  • 是的,选择最大的两只眼睛似乎是一种简单但很好的方法。您可以使用变量ehew 将它们放在一个列表中并进行另一个循环以将图像插入两个较大的位置。
猜你喜欢
  • 1970-01-01
  • 2017-07-30
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 2010-11-10
  • 2015-02-10
相关资源
最近更新 更多