猫ひげシール回転

4103 ワード

座標を2つに分けます.
1つ目は、画像キャンバス上の座標(xi,yi)(x i,y i)(xi,yi)(xi,yi)であり、写真左topを原点とする座標である.
2つ目は、マップキャンバス上の座標(xs,ys)(xs,y s)(xs,ys)で、マップの左上隅を原点とする座標です.
マップキャンバスの原点は、画像キャンバスの原点(l,t)(l,t)(l,t)から離れている.
イメージキャンバスにマップキャンバス座標を表示するには
(xi,yi)=(xs+l,ys+t)(x i,y i)=(x s+l,y s+t)(xi,yi)=(xs+l,ys+t).
逆に、イメージキャンバスの座標をマップキャンバスに表示するには:
(xs,ys)=(xi are,yi t)(x s,y s)=(x i-l,y i-t)=(xs,ys)=(xi are,yi act).
2つの座標系が重なるため、それらを切り替えるときに混同してはいけません.私は土を少し掘った.
以下のコードにはxix ixiまたはysy sysと同じタグはありません.
必要に応じて、画像キャンバス座標を大座標、マップキャンバス座標を小座標と呼びます.

シールを再表示し、座標地獄の画像変換を行います.
マップの位置とマーカーの位置を指定します.
この赤い点がランドマークのどの位置に適しているかを比較します
マップの基点としての座標を検索
cat_list1 = [(int(w*0.46), int(w*0.4)),
             (int(w*0.54), int(w*0.4)),
             (int(w*0.4), int(w*0.57)),
             (int(w*0.6), int(w*0.57))]
移動する座標を検索
移動はマップキャンバス内で行われるので、小さな座標が必要です.
私たちが得ることができるランドマーク座標は大きな座標であり、変換する必要があります.
(xs,ys)=(xi,yi,t)(x s,y s)=(x i-l,y i-t)=(xs,ys)=(xi,yi,t)計算はcat list 2である.
cat_list2 = [((landmark[31][0]+landmark[27][0])//2 - l, (landmark[31][1]+landmark[27][1])//2 - t),
             ((landmark[35][0]+landmark[27][0])//2 - l, (landmark[35][1]+landmark[27][1])//2 - t),
             (landmark[31][0] - l, landmark[31][1] - t),
             (landmark[35][0] - l, landmark[35][1] - t)]
私が座標を選ぶ基準は.
  • は、指定されたランドマーク
  • として容易に指定できる.
  • 顔を変えてもあまり変わらない
  • 顔の輪郭線はその名の通り輪郭であるため、顔の回転時に表示される点があまりにも異なり、使用できません
    例えば、正面はこめかみ、側面は耳
  • の輪郭線を基準にして、正面写真でもひげが歪んでいる場合があります.
  • 江南CamのJiEunさんによると眉毛の角度=ひげの角度を利用するように、ひげの形状に関連する形態を探すには、
  • しかし、眉に変換するとシールが位置決めしにくくなり、
  • だから選択鼻
  • 長方形の大きな座標と小さな座標を保持します.
  • ここでは最初は多くの問題が発生していましたが、「頬の輪郭と鼻の中点」という基準では、場合によっては座標の反転によってひげが
  • 歪むことになります.
    したがって、
  • は、回転の影響が小さい鼻の周りで矩形ノイズ
  • を行う.
  • 鼻を等辺三角形と見なし、中間に裁断された等辺台形形状.
  • はこのような形で捉えられたが、なぜか上下回転が脆弱になり、どのように変えたのか分からない.
  • 画像で確認します.赤:基点、緑:変換点ヘンカンてん
    for point in cat_list1:
        cv2.circle(sticker_copy, point, 2, (255, 0, 0), -1)
    for point in cat_list2:
        cv2.circle(sticker_copy, point, 2, (0, 255, 0), -1)

    へんかんプロセス
    pts1 = np.float32(cat_list1) # 이동 전 작은좌표
    pts2 = np.float32(cat_list2) # 이동 후 작은좌표
    M = cv2.getPerspectiveTransform(pts1,pts2) # 변환시켜주는 매트릭스
    dst = cv2.warpPerspective(img_sticker,M,(w,h), borderValue = [255, 255, 255, 255]) 
          # 실제로 이미지를 M을 이용해 변환해주는 코드
          # 회전시켰을 때 검은 배경을 없애기 위해 borderValue 설정

    投影変換されていないケースのコード
    ノードで行う操作と大差ないので省略する.
    変換された場合
    sticker_area2 = img_bgr[t:t+dst.shape[0], l:l+dst.shape[1]]
        # 스티커가 들어갈 공간 = l과 t 에서 스티커 가로세로만큼 확보
    img_bgr[t:t+dst.shape[0], l:l+dst.shape[1]] = \
        np.where(dst==0, cv2.addWeighted(dst, 0.8, sticker_area2, 0.2, 0), sticker_area2).astype(np.uint8)
        # 똑같은 사이즈로 만들고 검은색 수염인 경우만 드러나도록 설정

    同じコードに異なる写真のみをロード

    残念なことに.
  • y軸回転はある程度カバーされているが、x軸回転時には所望の感覚がなく、
  • は複数の人に同時に適用される可能性がありますが、簡単に試してみる勇気がありません.
  • 変換の際、キャンバスの外からひげが抜ける現象は
    cv2.warpPerspectiveで調整可能(w,h)
    その後シールスペースに貼る過程で処理できないと感じたので諦めました
  • もっと顔の曲面に貼ろうと思ったのですが、それは半分だけ変換した時にもっとよく表現されていたのですが、そうなると正面写真が完全に壊れてしまいました…両者を補う方法を見つけたいのですが、失敗しました.
  • この程度のはずだ
    参考になると役に立ちますか.
    私の考えを諸説あるような気がします.
    私の説明不足で理解できない点があれば.
    ブログコメントで秘密基地コメントやチャットはやめましょう!
    ここで確認できるかどうか保証できません.きょうどう
    もしあなたがもっと良いバージョンにアップグレードしたら、私にも教えてください.ありがとうございます.
    簡単に書こうと思っていたが、あいまいな文章になったようだ.
    ここまで我慢してくれてありがとう.😂😂😂