def main2D_3D_2D_LR_Hair(): '''1. read origin obj and image''' objPath = '../../github/vrn-07231340/obj/trump-12.obj' objLines, vLines, fLines = readObj(objPath) imgPath = '../../github/vrn-07231340/examples/scaled/trump-12.jpg' img = cv2.imread(imgPath) imgHRPath = '../../github/vrn-07231340/examples/trump-12.jpg' imgHR = cv2.imread(imgHRPath) '''2. origin 2D landmark --> origin 3D landmark''' ''' BUT ONE 2D LANDMARK --> MORE THAN ONE 3D LANDMARK''' ''' HOW TO CHOOSE THE BEST ONE ?''' ''' OPTION 1: 选Z最大的3D landmark''' '''2.1 origin 2D landmark [x, y]''' originLandmark2DList = getLandmark2D(img) '''2.2 origin 3D landmark list [[[x, y], [(line1, vLine1), (line2, vLine2)]], ... ]''' originLandmark3DList = getLandmark3D(originLandmark2DList, vLines) '''2.3 OPTION 1: 选Z最大的3D landmark''' originLandmark3DList = optionChooseZMax(originLandmark3DList) '''3. nod''' nodAngle = 15 nodCenterMode = 'maxY' nodObjLines = nod(objPath, nodAngle, nodCenterMode) '''4. nod 3D landmark list''' '''nodLandmark3DList: [[x0, y0], [x0, y0, z0], [x1, y1], [x1, y1, z1], (line, vLine)]''' '''len(nodLandmark3DList): number of landmarks both on 2D and 3D''' '''[x0, y0]: original landmark on 2D img''' '''[x0, y0, z0]: original landmark on 3D model''' '''[x1, y1]: nod landmark on 2D img''' '''[x1, y1, z1]: nod landmark on 3D model''' '''(line, vLine): the line(th) nod vLine''' nodVLines = objLines2vLines(nodObjLines) nodLandmark3DList = getNodLandmark3D(nodVLines, originLandmark3DList) '''5. nod 3D landmark --> nod 2D landmark''' nodLandmark2D = [] for nodLandmark3D in nodLandmark3DList: nodLandmark2D.append(nodLandmark3D[2]) '''6. origin 2D landmarks''' originLandmark2D = [] for nodLandmark3D in nodLandmark3DList: originLandmark2D.append((nodLandmark3D[0][0], nodLandmark3D[0][1])) assert len(originLandmark2D) == len(nodLandmark2D) '''7. face 2D landmarks + hair 2D landmarks''' # hairLandmark2DList, nodHairLandmark2DList = main2D_3D_2D_ManuallySelectHair() hairLandmark2DList, nodHairLandmark2DList, edgePoints, ellipseVerts, outerEllipseVerts = main2D_3D_2D_LR_MeshHair( ) assert len(hairLandmark2DList) == len(nodHairLandmark2DList) '''7.1 origin face 2D landmarks + origin hair 2D landmarks''' originLandmark2D = originLandmark2D + hairLandmark2DList '''7.2 nod face 2D landmarks + nod hair 2D landmarks''' nodLandmark2D = nodLandmark2D + nodHairLandmark2DList '''7.3 save origin and nod 2D landmarks txt''' # originLandmark2DTxtPath = './originLandmark2D.txt' # originLandmark2DTxt = open(originLandmark2DTxtPath, 'w') # for i in originLandmark2D: # originLandmark2DTxt.write('{} {}\n'.format(i[0], i[1])) # originLandmark2DTxt.close() # nodLandmark2DTxtPath = './nodLandmark2D.txt' # nodLandmark2DTxt = open(nodLandmark2DTxtPath, 'w') # for i in nodLandmark2D: # nodLandmark2DTxt.write('{} {}\n'.format(i[0], i[1])) # nodLandmark2DTxt.close() '''8. add edge points''' '''8.1 OPTION1: 8 IMAGE EDGE POINTS''' ''' 如果在加头发关键点之前加8个edge points,第7个edge point(图像最上面那个)会被往下warp一点''' ''' 如果在加头发关键点之后加8个edge points,第7个edge point经过warp后仍在原处,形成一个小三角''' # originLandmark2D = addEdgeLandmark(originLandmark2D, img) # nodLandmark2D = addEdgeLandmark(nodLandmark2D, img) '''8.2 OPTION2: OUTER ELLIPSE''' # a = copy.copy(originLandmark2D) originLandmark2D = originLandmark2D + edgePoints nodLandmark2D = nodLandmark2D + edgePoints # drawPointsOnImg(originLandmark2D, img, 'b') # drawPointsOnImg(a, img, 'r') # drawPointsOnImg(nodLandmark2D, img, 'g') # drawPointsOnImg(ellipseVerts, img, 'g', cover=True) # drawPointsOnImg(outerEllipseVerts, img, 'r', cover=True) # drawPointsOnImg(originLandmark2D, img, 'g', cover=True) # drawPointsOnImg(edgePoints, img, 'b', radius=3) # drawPointsOnImg(nodLandmark2D, img, 'r') '''9. delaunay triangle for [origin landmarks (face + hair)] + (eight edge points)''' # triList = generateTriList(originLandmark2D, img) # '''9.1 save tri txt''' # triTxtPath = './nodTri.txt' # triTxt = open(triTxtPath, 'w') # for i in triList: # triTxt.write('{}\n'.format(i)) # triTxt.close() '''10. warp LR''' # imgMorph = morph_modify_for_2D3D2D_low_resolution( # originLandmark2D, nodLandmark2D, img, triList) # imshow('imgMorph', imgMorph) # cv2.imwrite('./nod.jpg', imgMorph) # return originLandmark2D, nodLandmark2D, triList '''LR to HR''' originLandmark2DHR = LR2HR(img, imgHR, originLandmark2D) for (x, y), (xmin, ymin) in zip(originLandmark2DHR, originLandmark2D): if float(x) >= 640 or float(y) >= 640: print(int(xmin), int(ymin)) cv2.circle(img, (int(xmin), int(ymin)), 3, (0, 255, 0), -1) imshow('img', img) nodLandmark2DHR = LR2HR(img, imgHR, nodLandmark2D) '''8. add 8 egde points''' # nodLandmark2DHR = addEdgeLandmark(nodLandmark2DHR, imgHR) # originLandmark2DHR = addEdgeLandmark(originLandmark2DHR, imgHR) # drawPointsOnImg(originLandmark2DHR, imgHR, 'g') # drawPointsOnImg(nodLandmark2DHR, imgHR, 'r') '''8.1 remove >= 640''' originLandmark2DHR = [(i[0], i[1]) for i in originLandmark2DHR if i[0] < imgHR.shape[0] and i[1] < imgHR.shape[1]] nodLandmark2DHR = [(i[0], i[1]) for i in nodLandmark2DHR if i[0] < imgHR.shape[0] and i[1] < imgHR.shape[1]] '''9. delaunay triangle for [origin landmarks (face + hair)] + (edge points)''' triList = generateTriList(originLandmark2DHR, imgHR) '''9.1 save tri txt''' triTxtPath = './nodTri.txt' triTxt = open(triTxtPath, 'w') for i in triList: triTxt.write('{}\n'.format(i)) triTxt.close() '''10. warp HR''' imgMorph = morph_modify_for_2D3D2D_low_resolution(originLandmark2DHR, nodLandmark2DHR, imgHR, triList) # imshow('imgMorph', imgMorph) # cv2.imwrite('./nod.jpg', imgMorph) return originLandmark2DHR, nodLandmark2DHR, triList
def main2D_3D_2D_LR_Hair(): '''1. read origin obj and image''' objPath = '../../github/vrn-07231340/obj/trump-12.obj' objLines, vLines, fLines = readObj(objPath) imgPath = '../../github/vrn-07231340/examples/scaled/trump-12.jpg' img = cv2.imread(imgPath) '''2. origin 2D landmark --> origin 3D landmark''' ''' BUT ONE 2D LANDMARK --> MORE THAN ONE 3D LANDMARK''' ''' HOW TO CHOOSE THE BEST ONE ?''' ''' OPTION 1: 选Z最大的3D landmark''' '''2.1 origin 2D landmark [x, y]''' originLandmark2DList = getLandmark2D(img) '''2.2 origin 3D landmark list [[[x, y], [(line1, vLine1), (line2, vLine2)]], ... ]''' originLandmark3DList = getLandmark3D(originLandmark2DList, vLines) '''2.3 OPTION 1: 选Z最大的3D landmark''' originLandmark3DList = optionChooseZMax(originLandmark3DList) '''3. nod''' nodAngle = 15 nodCenterMode = 'maxY' nodObjLines = nod(objPath, nodAngle, nodCenterMode) '''4. nod 3D landmark list''' '''nodLandmark3DList: [[x0, y0], [x0, y0, z0], [x1, y1], [x1, y1, z1], (line, vLine)]''' '''len(nodLandmark3DList): number of landmarks both on 2D and 3D''' '''[x0, y0]: original landmark on 2D img''' '''[x0, y0, z0]: original landmark on 3D model''' '''[x1, y1]: nod landmark on 2D img''' '''[x1, y1, z1]: nod landmark on 3D model''' '''(line, vLine): the line(th) nod vLine''' nodVLines = objLines2vLines(nodObjLines) nodLandmark3DList = getNodLandmark3D(nodVLines, originLandmark3DList) '''5. nod 3D landmark --> nod 2D landmark + 8 edge points''' nodLandmark2D = [] for nodLandmark3D in nodLandmark3DList: nodLandmark2D.append(nodLandmark3D[2]) nodLandmark2D = addEdgeLandmark(nodLandmark2D, img) '''6. origin 2D landmarks + 8 edge points''' originLandmark2D = [] for nodLandmark3D in nodLandmark3DList: originLandmark2D.append((nodLandmark3D[0][0], nodLandmark3D[0][1])) originLandmark2D = addEdgeLandmark(originLandmark2D, img) assert len(originLandmark2D) == len(nodLandmark2D) '''7. face 2D landmarks + hair 2D landmarks''' # hairLandmark2DList, nodHairLandmark2DList = main2D_3D_2D_ManuallySelectHair() hairLandmark2DList, nodHairLandmark2DList = main2D_3D_2D_LR_MeshHair() '''7.1 origin face 2D landmarks + origin hair 2D landmarks''' originLandmark2D = originLandmark2D+hairLandmark2DList # drawPointsOnImg(originLandmark2D, img, 'g') '''7.2 nod face 2D landmarks + nod hair 2D landmarks''' nodLandmark2D = nodLandmark2D+nodHairLandmark2DList # drawPointsOnImg(nodLandmark2D, img, 'r') '''7.3 save origin and nod 2D landmarks txt''' originLandmark2DTxtPath = './originLandmark2D.txt' originLandmark2DTxt = open(originLandmark2DTxtPath, 'w') for i in originLandmark2D: originLandmark2DTxt.write('{} {}\n'.format(i[0], i[1])) originLandmark2DTxt.close() nodLandmark2DTxtPath = './nodLandmark2D.txt' nodLandmark2DTxt = open(nodLandmark2DTxtPath, 'w') for i in nodLandmark2D: nodLandmark2DTxt.write('{} {}\n'.format(i[0], i[1])) nodLandmark2DTxt.close() '''8. delaunay triangle for [origin landmarks (face + hair)] + (eight edge points)''' triList = generateTriList(originLandmark2D, img) # print triList '''8.1 save tri txt''' triTxtPath = './nodTri.txt' triTxt = open(triTxtPath, 'w') for i in triList: triTxt.write('{}\n'.format(i)) triTxt.close() '''9. warp''' imgMorph = morph_modify_for_2D3D2D_low_resolution( originLandmark2D, nodLandmark2D, img, triList) # imshow('imgMorph', imgMorph) cv2.imwrite('./nod.jpg', imgMorph)