Overlay ein kleineres Bild auf einem größeren Bild Python OpenCv
Hallo, ich bin die Schaffung eines Programms, das ersetzt ein Gesicht in einem Bild mit einem anderen Gesicht. Allerdings bin ich stecken, versuchen, fügen Sie die neue Fläche in den ursprünglichen, größeren Bild. Ich habe recherchiert ROI und addWeight(muss die Bilder auf die gleiche Größe), aber ich habe noch keinen Weg gefunden, dies in python. Jede Beratung ist groß. Ich bin neu in opencv.
Ich bin mit dem folgenden test Bilder:
smaller_image:
larger_image:
Hier ist mein Code soweit... ein mixer von anderen Proben:
import cv2
import cv2.cv as cv
import sys
import numpy
def detect(img, cascade):
rects = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=3, minSize=(10, 10), flags = cv.CV_HAAR_SCALE_IMAGE)
if len(rects) == 0:
return []
rects[:,2:] += rects[:,:2]
return rects
def draw_rects(img, rects, color):
for x1, y1, x2, y2 in rects:
cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
if __name__ == '__main__':
if len(sys.argv) != 2: ## Check for error in usage syntax
print "Usage : python faces.py <image_file>"
else:
img = cv2.imread(sys.argv[1],cv2.CV_LOAD_IMAGE_COLOR) ## Read image file
if (img == None):
print "Could not open or find the image"
else:
cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
gray = cv2.cvtColor(img, cv.CV_BGR2GRAY)
gray = cv2.equalizeHist(gray)
rects = detect(gray, cascade)
## Extract face coordinates
x1 = rects[0][3]
y1 = rects[0][0]
x2 = rects[0][4]
y2 = rects[0][5]
y=y2-y1
x=x2-x1
## Extract face ROI
faceROI = gray[x1:x2, y1:y2]
## Show face ROI
cv2.imshow('Display face ROI', faceROI)
small = cv2.imread("average_face.png",cv2.CV_LOAD_IMAGE_COLOR)
print "here"
small=cv2.resize(small, (x, y))
cv2.namedWindow('Display image') ## create window for display
cv2.imshow('Display image', small) ## Show image in the window
print "size of image: ", img.shape ## print size of image
cv2.waitKey(1000)
InformationsquelleAutor der Frage kaboomfox | 2012-12-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen einfachen Weg, das zu erreichen, was Sie wollen:
Update
Ich nehme an, Sie wollen nehmen Pflege der alpha-Kanal auch. Hier ist eine schnelle und schmutzige Art und Weise, dies zu tun:
InformationsquelleAutor der Antwort fireant
Basierend auf fireant ausgezeichnete Antwort oben, hier ist das alpha blending, aber ein bisschen mehr menschliche lesbar. Sie müssen möglicherweise die swap -
1.0-alpha
undalpha
je nachdem, welche Richtung Sie Zusammenführen (bei mir ist getauscht von fireant Antwort).o* == s_img.*
b* == b_img.*
InformationsquelleAutor der Antwort Kurt
@Fireant die Idee, schrieb ich eine Funktion zum verarbeiten von overlays. Dies funktioniert gut für jede position-argument (einschließlich der negativen Positionen).
Nutzung ist:
InformationsquelleAutor der Antwort Mateen Ulhaq
Wenn jemand, so wie ich, bekommt die Fehlermeldung:
beim schreiben auf das Ziel-Bild mit einem dieser Antworten.
Einen quick dirty fix ist, das WRITEABLE flag auf true:
InformationsquelleAutor der Antwort Torantula