|
楼主 |
发表于 2019-4-8 20:10:32
|
显示全部楼层
我这边想实现的是:通过video识别到人脸以后,然后将一张戴帽子的特效加载到video当中,代码如下,但诸多问题存在,还麻烦路过的大神帮忙实现一下,谢谢!!
def special_effect_deal():
video = cv.VideoCapture(0)
effImg=cv.imread("D:\\Python\Pictures\\Special_pictures\\effect9.png")
face_detector = cv.CascadeClassifier("D:\\Python\\cascadeClassifier\\haar\\haarcascade_frontalface_alt2.xml")
effRows,effCols = effImg.shape[:2]
ret,frame = video.read()
gray_frame = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
face = face_detector.detectMultiScale(gray_frame,1.1,3,minSize=(100,100),maxSize=(400,400))
while face is None:
face = face_detector.detectMultiScale(gray_frame,1.1,3,minSize=(100,100),maxSize=(400,400))
x_face = face[0][0]
y_face = face[0][1]
width_face = face[0][2]
height_face = face[0][3]
track_window=(x_face,y_face,x_face+width_face,y_face+height_face)
cv.rectangle(frame,(x_face,y_face),(x_face+width_face,y_face+height_face),(255,0,0),2)
cv.imwrite("D:\\Python\\special_effect\\rec.jpg",frame)
roi = frame[x_face:x_face+width_face,y_face:y_face+height_face]
cv.imwrite("D:\\Python\\special_effect\\roi.jpg",roi)
hsv_roi = cv.cvtColor(roi,cv.COLOR_BGR2HSV)
mask = cv.inRange(hsv_roi,(0.,60.,32.),(180.,255.,255.))
roi_hist = cv.calcHist([hsv_roi],[0],None,[180],[0,180])
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)
term_crit = (cv.TERM_CRITERIA_EPS|cv.TERM_CRITERIA_COUNT,10,1)
while(True):
ret,frame=video.read()
if ret == True:
hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)
ret,track_window = cv.CamShift(dst,track_window,term_crit)
cv.imshow("before resoize,effImg",effImg)
x ,y, w,h =track_window
print("size of track window",track_window)
effImg = cv.resize(effImg,(w,h//3))
print("resized,effImg.shape",effImg.shape)
cv.imshow("resized,effImg",effImg)
rows,cols=effImg.shape[:2]
img2 = cv.rectangle(frame,(x,y),(x+cols, y+rows),(0,0,255),1)
print("rows:%d,cols:%d"%(rows,cols))
roi = img2[x:x+rows,y:y+cols]
effGray = cv.cvtColor(effImg,cv.COLOR_BGR2GRAY)
ret,mask = cv.threshold(effGray,175,255,cv.THRESH_BINARY)
print("size of roi",roi.shape)
print("size of mask",mask.shape)
mask_inv = cv.bitwise_not(mask)
img2_bg = cv.bitwise_and(roi,roi,mask=mask)
eff_fg = cv.bitwise_and(effImg,effImg,mask=mask_inv)
dst = cv.add(img2_bg,eff_fg)
img2[x:x+rows,y:y+cols]=dst
cv.imshow("img2",img2)
k = cv.waitKey(10)&0xff
if k == 27:
break
else:
break |
|