質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

253閲覧

画像を貼り付ける際に回転と位置指定を同時するやり方がわかりません。

naninuneno1234

総合スコア9

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2024/05/13 08:04

実現したいこと

異なるサイズの画像を別の画像に貼り付ける際に指定の位置で指定の角度に傾けたい

発生している問題・分からないこと

位置を指定する
M = np.float32([[1, 0, 40],[0, 1, 40]])
のコードと
M = cv2.getRotationMatrix2D(center=(fg_w / 2, fg_h / 2), angle=15, scale=0.5)
のコードの両方を反映させたいのですが、後に書いたコードしか保存した画像には反映されていません。
この位置の指定と傾ける処理の両方を反映させる方法がわかりません。

該当のソースコード

import numpy as np import cv2 fg_img = cv2.imread("001.png") # アフィン変換を適用する画像 bg_img = cv2.imread("bg_img.png") # 背景画像 fg_h, fg_w = fg_img.shape[:2] M = np.float32([[1, 0, 40],[0, 1, 40]]) M = cv2.getRotationMatrix2D(center=(fg_w / 2, fg_h / 2), angle=15, scale=0.5) bg_h, bg_w = bg_img.shape[:2] dst = cv2.warpAffine( fg_img, M, dsize=(bg_w, bg_h), dst=bg_img, borderMode=cv2.BORDER_TRANSPARENT ) cv2.imwrite("aa.png", dst)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

位置の指定と貼り付けた画像を傾け処理の両方を反映させている記事が見つかりませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2024/05/13 08:17

> 位置の指定 > 傾ける処理 どちらか一方であれば問題無く実現できているのでしょうか? そうであれば,まず > 傾ける処理 で傾いた画像を生成し,次にそれを > 位置の指定 で貼りつける,という手順で処理を行えばよいのではないでしょうか. (それだと何か問題があるのでしょうか?)
fana

2024/05/13 08:29 編集

↑失礼,そういう話じゃなさそう. 並進変換と回転変換を1つのアフィン変換に合成したい,という話ですね. getRotationMatrix2D で得た行列内の並進に対応する要素(一番右の列)に適切な値を加算してやればよいのではないでしょうか.
naninuneno1234

2024/05/13 23:46

コメントありがとうございます。getRotationMatrix2Dの一番右の列に値を加算したら解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
fana

2024/05/14 01:21

> 同じ内容を回答欄に投稿いただけますでしょうか? しました. ただ,ご自身でやってみた結果得られた知見等がある場合には,そういう情報を含めた自己回答の形をとっても良いと思います.
guest

回答1

0

ベストアンサー

並進変換と回転変換を1つのアフィン変換に合成したい,という話かと見えますので,
getRotationMatrix2D で得た行列内の並進に対応する要素(一番右の列)に適切な値を加算してやればよいのではないでしょうか.

「何故そこに加算すれば良いのか?」については行列の使われ方(OpenCVのマニュアルで確認されたし)的に自明かと思います.
(マニュアルとは異なる記号で書きますが)与える 2x3 行列が

a b c d e f

のとき,入力 (x,y) に対する出力 (x',y')

x' = a*x + b*y + c y' = d*x + e*y + f

となる,という話なのですから,cf は単純な並進量なわけですよね.


行列の積による「合成」として考えるならば以下のようになると思います:

warpAffine に与える行列のサイズは 縦2x横3 となっていますが,同次座標で 3x3 だと考えてやれば行列の積で合成を考えられます.
具体的には getRotationMatrix2D で得られた 2x3 行列に3行目 (0 0 1)を追加して

a b c d e f 0 0 1

だと考えてやり,この行列に左側から並進変換の行列

1 0 tx 0 1 ty 0 0 1

を乗じればよいです.その結果は

a b c+tx d e f+ty 0 0 1

であり,元々の 2x3 行列の一番右側の列に並進量 (tx, ty) を加算したものになる,と.

投稿2024/05/14 01:20

編集2024/05/14 01:32
fana

総合スコア11893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問