[OpenCV]イメージ回転(中央回転)cv 2.getRotation Matrix 2 D-顔の回転角度を求めます
9505 ワード
芸能人の写真で猫のひげを合成するアイテム既存のレベル
コードは次の操作を行います.
1. dlib.get frond face detectorを使用して正面顔認識を行います(側面写真は認識できない可能性があります).
2. dlib.shape predicator関数を用いて社会標識(目、鼻、口など)を識別する
3.回転角度を計算して回転する
4.付着画像
詳細コードブックは付録に詳しく記載されていますので、参考にしてください.
https://github.com/dldndyd01/AIFFEL/blob/master/Face_Detection/FaceDetection-rotation.ipynb
この文章は回転する顔を認識し、
1.回転角度の測定方法と
2.画像を回転およびアタッチする角度を作成します.回転角を取得
コード部分をよく見ると、Face Landmarkが抽出され、顔から特性座標が印刷されます.
ここで使用する座標は27番座標と30番座標です.
絵が下手なのでご了承ください
θ値を求めるために三角比を利用する
※xが右へ、yが下へ、値が大きいことを忘れないでください!
角度°=θ 180π\frac{180}{π}π180
経験する過程
関連内容に興味がある人はアーク法を学ぶことができます!
デフォルトではgetRotationMatrix 2 Dは反時計回りの角度で増加するため、上図の値は-47度です.
回転画像合成
np.where
このように理解すればよい
条件式を満たすpixelは真の値であり、条件を満たさないpixelはfalseの値である.
上のコードでは、
np.where(img rotate=255,sticker area,img rotate)
回転画像が白い部分はsticker areaに変更され、白でない場合はimg rotateがそのまま出力されることを示します.
そのため、背景の白は徐々に消え、芸能人の写真には以下の写真が合成されます.
ネクタイの中で詳しく説明されていない部分をBellogにまとめて、ネクタイのコード通りにして、理解していない部分はいつでも質問できます!
コードは次の操作を行います.
1. dlib.get frond face detectorを使用して正面顔認識を行います(側面写真は認識できない可能性があります).
2. dlib.shape predicator関数を用いて社会標識(目、鼻、口など)を識別する
3.回転角度を計算して回転する
4.付着画像
詳細コードブックは付録に詳しく記載されていますので、参考にしてください.
https://github.com/dldndyd01/AIFFEL/blob/master/Face_Detection/FaceDetection-rotation.ipynb
この文章は回転する顔を認識し、
1.回転角度の測定方法と
2.画像を回転およびアタッチする角度を作成します.
コード部分をよく見ると、Face Landmarkが抽出され、顔から特性座標が印刷されます.
絵が下手なのでご了承ください
θ値を求めるために三角比を利用する
tanθ = x30−x27y30−y27\frac{x_{30}-x_{27}}{y_{30}-y_{27}}y30−y27x30−x27
※xが右へ、yが下へ、値が大きいことを忘れないでください!
import math
tan_theta = (landmark[30][0]-landmark[27][0])/(landmark[30][1]-landmark[27][1])
theta = np.arctan(tan_theta)
rotate_angle = theta *180/math.pi
print(rotate_angle)
==> -47.60256
thetaは私たちがよく知っている角度(°).角度°=θ 180π\frac{180}{π}π180
経験する過程
関連内容に興味がある人はアーク法を学ぶことができます!
def rotate_image(image, angle):
image_center = tuple(np.array(image.shape[1::-1]) / 2)
rot_mat = cv2.getRotationMatrix2D(image_center, angle, 1.0)
result = cv2.warpAffine(image, rot_mat, image.shape[1::-1], flags=cv2.INTER_LINEAR,borderValue=(255,255,255))
return result
img_rotate = rotate_image(img_sticker,rotate_angle)
print(img_rotate.shape)
plt.imshow(img_rotate)
plt.show()
回転角度をrotate angleに保存し、getRotationMatrix 2 Dを使用して回転すると、次のような回転ひげが発生します.デフォルトではgetRotationMatrix 2 Dは反時計回りの角度で増加するため、上図の値は-47度です.
refined_x = x[i] - w//2
refined_y = y[i]
sticker_area = img_bgr[refined_y:refined_y+img_rotate.shape[0],refined_x:refined_x+img_rotate.shape[1]]
img_show[refined_y:refined_y+img_rotate.shape[0], refined_x:refined_x+img_rotate.shape[1]] = np.where(img_rotate==255,sticker_area,img_rotate).astype(np.uint8)
ここでnpwhere関数は合成時に有用な関数である可能性がありますので、議論しましょう.np.where
このように理解すればよい
条件式を満たすpixelは真の値であり、条件を満たさないpixelはfalseの値である.
上のコードでは、
np.where(img rotate=255,sticker area,img rotate)
回転画像が白い部分はsticker areaに変更され、白でない場合はimg rotateがそのまま出力されることを示します.
そのため、背景の白は徐々に消え、芸能人の写真には以下の写真が合成されます.
ネクタイの中で詳しく説明されていない部分をBellogにまとめて、ネクタイのコード通りにして、理解していない部分はいつでも質問できます!
Reference
この問題について([OpenCV]イメージ回転(中央回転)cv 2.getRotation Matrix 2 D-顔の回転角度を求めます), 我々は、より多くの情報をここで見つけました https://velog.io/@dldndyd01/OpenCV-이미지-회전중앙-기준-회전-cv2.getRotationMatrix2D-얼굴-회전-각도-구하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol