C++とOpenCVを使って動画を回転させる方法
OpenCVにおける動画の回転処理は、画像を回転させる場合と基本的に同じ仕組みです。唯一の違いは、静止画像を画像行列(Mat)に読み込む代わりに、動画ファイルを読み込むか、カメラから映像ストリームを取得するという点です。
この記事では、動画ファイルを読み込むのではなく、カメラで撮影した映像をリアルタイムに回転させて表示します。もし既存の動画ファイルを使用したい場合は、VideoCaptureの引数に動画ファイルのパスを正しく指定するだけで対応できます。
また、トラックバー(スライダー)を追加することで、実行中に回転角度を自由に変更できるようにしています。回転角度の初期値は180度に設定されており、トラックバーの値から180を引いた角度が実際の回転角として適用されます。これにより、-180度から+180度までの範囲で直感的に回転操作が可能になります。
サンプルコード
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[]) {
VideoCapture loadvideo(0);//デフォルトカメラから映像をキャプチャ//
namedWindow("OriginalVideo");//元の映像を表示するウィンドウを宣言//
namedWindow("RotatedVideo");//回転後の映像を表示するウィンドウを宣言//
int rotating_angle = 180;//初期回転角度//
createTrackbar("Rotation", "RotatedVideo", &rotating_angle, 360);//回転用トラックバーを作成//
while (true) {
Mat before_Rotating;//回転前の画像用行列を宣言//
bool temp = loadvideo.read(before_Rotating);//映像ソースからフレームを行列に読み込む//
imshow("OriginalVideo", before_Rotating);//回転前のフレームを表示//
Mat for_Rotation = getRotationMatrix2D(Point(before_Rotating.cols / 2, before_Rotating.rows / 2), (rotating_angle - 180), 1);//2D回転のためのアフィン変換行列//
Mat after_Rotating;//回転後の画像用行列を宣言//
warpAffine(before_Rotating, after_Rotating, for_Rotation, before_Rotating.size());//アフィン変換を適用//
imshow("RotatedVideo", after_Rotating);//回転後のフレームを表示//
if (waitKey(30) == 27){ //Escキーが押されるまで待機//
break;
}
}
return 0;
}コードのポイント
- getRotationMatrix2D():画像中心を軸として2D回転用のアフィン変換行列を生成します。第1引数に回転中心座標、第2引数に回転角度、第3引数に拡大率を指定します。
- warpAffine():生成したアフィン変換行列を各フレームに適用し、実際の回転処理を行います。
- waitKey(30):約30ミリ秒ごとにキー入力をチェックし、Escキー(ASCIIコード27)が押されるとループを抜けてプログラムを終了します。
実行結果
プログラムを実行すると、「OriginalVideo」ウィンドウにはカメラからの元の映像が、「RotatedVideo」ウィンドウには回転処理が適用された映像がそれぞれリアルタイムに表示されます。トラックバーを動かすことで、映像の回転角度を自由に調整できます。

-
C++とOpenCVで二値画像(バイナリイメージ)を反転する方法
二値画像(バイナリイメージ)の反転とは、ピクセル値を逆転させる処理のことです。視覚的な観点から見ると、二値画像を反転させると、白いピクセルは黒へ、黒いピクセルは白へと変換されます。この処理は、主に3つの関数を組み合わせて実現します。それぞれの手順を順番に見ていきましょう。ステップ1:カラー画像をグレースケールに変換するまず、cvtColor()関数を使って元の画像をグレースケール画像に変換します。この関数の基本形は次の通りです。cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);ステップ2:グレースケール画像を二値化する続いて、グ
-
C++とOpenCVでバイナリ画像(二値画像)を作成する方法を解説
バイナリ画像(二値画像)とは、黒と白の2色のみで表現されるデジタル画像のことです。画像処理の観点から見ると、バイナリ画像は「0」と「1」という2つの値しか持たないピクセルで構成されています。ピクセルの値が0の場合は純粋な黒を、値が1の場合は純粋な白を表します。グレースケール画像では、各ピクセルが256段階の異なる値を持つのに対し、バイナリ画像では2つの値しか存在しません。このシンプルさゆえに、バイナリ画像はさまざまな用途で活用されています。例えば、モルフォロジー変換(形態学的処理)ではバイナリ画像が必要であり、背景から物体の形状を抽出する処理にもバイナリ画像が用いられます。OpenCVを使用す