[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番座標です.


    絵が下手なのでご了承ください
    θ値を求めるために三角比を利用する

    tanθ = x30−x27y30−y27\frac{x_{30}-x_{27}}{y_{30}-y_{27}}y30​−y27​x30​−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にまとめて、ネクタイのコード通りにして、理解していない部分はいつでも質問できます!