※ replitで「You've used up all your Development time」というメッセージが出た人は
こちらを参考にして新しくreplitのアカウントを作ってください。
※ 本題に入る前に、必ず動画の
連絡
を見てください。
- リサイズ
- 拡大させる動画
- 回転させる動画
- スキューさせる動画
拡大させる動画
これまでの1つ目の課題で最初に行っているように、OpenCVのresize関数を使えば画像をリサイズできる。
image = cv2.resize(image, (new_width, new_height))
こうして大きくした画像の中心の部分 (元画像と同じサイズ) だけを取り出したい。
左右の「余白」の和は両者の幅の差「new_width - width」、上下は「new_height - height」になる。
そのため、赤い長方形の左上の座標は ((new_width - width)/2, (new_height - height)/2) となる。
よって、
x = (new_width - width)/2
y = (new_height - height)/2
cropped_image = resized_image[y:y+height, x:x+width]
とすれば、cropped_imageには拡大画像 resized_image から赤の部分だけを取り出したものが入る。
倍率を上げながら1フレームずつ書き込めばこのような動画ができる。
回転させる動画
第2回ではrotate関数で画像を回転させたが、OpenCVのアフィン変換を使えば基準点を指定して回転させられる。
M = cv2.getRotationMatrix2D((width / 2, height / 2), i, 1.0)
cropped_image = cv2.warpAffine(image, M, (width, height))
のようにすれば、画像を中心を基準として i 度回転させることができる。
iを0~359の範囲で変えながら1フレームずつ書き込めば1回転する動画ができる。
スキューさせる動画
第3回のOpenCVを使ったX方向のスキューを使えばこのように歪み方が変わっていく動画ができる
(第3回のときとは違ってはみ出しは無視する)。
# 単位をラジアンに変換して正接を求める
tan = np.tan(np.deg2rad(i))
# スキュー行列を作成する
M = np.array([[1, tan, 0], [0, 1, 0]], dtype=np.float32)
# 画像のスキュー
cropped_image = cv2.warpAffine(image, M, (width, height))