C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++とOpenCVで画像のサイズ変更・境界線の追加・回転をトラックバーで行う方法

この記事では、OpenCVのトラックバー(Trackbar)の別の活用例を紹介します。トラックバーを使って画像のサイズを変更し、画像に境界線(ボーダー)を追加するとともに、トラックバーを操作して境界線のサイズや種類を変更する方法を解説します。

以下のプログラムを使用すると、画像のサイズ変更、境界線の追加、境界線のサイズ変更に加えて、画像の回転まで行うことができます。基本的な流れは前回の例と似ていますが、今回は複数のスライダーを同じウィンドウ上に追加する方法をデモンストレーションしています。

サンプルコード

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int Rotate = 180; //回転角度の初期値//
int Scale = 50; //スケールの初期値//
int Border = 0; //境界線の初期値//
Mat before_Rotate; //回転前の画像を格納する行列の宣言//
int vertical = 0; //垂直方向の初期値//
int horizontal = 0; //水平方向の初期値//
void rotator(int, void*){ //画像を回転させる関数//
Mat Rotation = getRotationMatrix2D(Point(horizontal, vertical), (Rotate - 180), Scale / 50.0); //2D回転用のアフィン変換行列を取得//
Mat Rotated; //回転後の画像用の行列//
warpAffine(before_Rotate, Rotated, Rotation, before_Rotate.size(), INTER_LINEAR, Border, Scalar()); //アフィン変換の適用//
imshow("RotatedImage", Rotated); //回転後の画像を表示//
}
int main(int argc, char**argv) {
before_Rotate = imread("sky.jpg"); //画像を行列に読み込む//
vertical = before_Rotate.rows / 2; //垂直方向のピクセルの中点を取得//
horizontal = before_Rotate.cols / 2; //水平方向のピクセルの中点を取得//
namedWindow("BeforeRotate"); //回転前の画像を表示するウィンドウを宣言//
imshow("BeforeRotate", before_Rotate); //回転前の画像を表示//
namedWindow("AfterRotate"); //回転後の画像を表示するウィンドウを宣言//
createTrackbar("Angle", "AfterRotate", &Rotate, 360, rotator); //回転用のトラックバーを作成//
createTrackbar("Scale", "AfterRotate", &Scale, 100, rotator); //サイズ変更用のトラックバーを作成//
createTrackbar("Border Mode", "AfterRotate", &Border, 5, rotator); //境界線追加用のトラックバーを作成//
int cbfunction = 0; //rotator関数の引数の初期値//
rotator(cbfunction, &cbfunction); //rotator関数をコールバックとして呼び出す//
waitKey(0); //キー入力があるまで待機//
return 0;
}

コードのポイント

  • getRotationMatrix2D():指定した中心点・回転角度・スケールに基づいて、2D回転用のアフィン変換行列を生成します。
  • warpAffine():生成したアフィン変換行列を画像に適用します。第6引数のBorderTypeで境界線のスタイルを指定でき、トラックバーの値(0〜5)に応じて境界線が変化します。
  • createTrackbar():ウィンドウ上にスライダーを作成します。スライダーの値が変更されるたびに、コールバック関数(ここではrotator関数)が自動的に呼び出され、画像がリアルタイムに更新されます。

実行結果

プログラムを実行すると、回転前の画像と回転後の画像がそれぞれ別のウィンドウに表示されます。「AfterRotate」ウィンドウには「Angle」「Scale」「Border Mode」の3つのスライダーが配置されており、これらを動かすことで、回転角度の変更(0〜360度)、拡大・縮小、境界線の追加やスタイルの変更をリアルタイムで確認できます。

C++とOpenCVで画像のサイズ変更・境界線の追加・回転をトラックバーで行う方法

  1. C++とOpenCVで画像のチャンネル数を取得する方法を解説

    この記事では、OpenCVを使って画像のチャンネル数を調べる方法について解説します。プログラムを実行すると、コンソール画面に画像のチャンネル数が表示されます。チャンネル数を取得するには、OpenCVが提供するchannels()メソッドを使用します。このメソッドは、Matクラスのオブジェクト(画像行列)に対して呼び出すことで、その画像のチャンネル数を整数値として返します。例えば、カラー画像の場合は通常3チャンネル(BGR)、グレースケール画像の場合は1チャンネルとなります。画像処理を行う際、扱っている画像がカラーかモノクロかを判別するために、チャンネル数の確認は非常に重要な処理の一つです。以下

  2. C++とOpenCVで画像を読み込んで表示する方法を徹底解説

    この記事では、C++でOpenCVを使用して画像を読み込み、表示する方法について詳しく解説します。OpenCVで画像の読み込みや表示を行うには、以下のような関数やデータ構造が必要になります。 画像処理に必要な基本要素 Mat(マトリクス) Matは関数ではなく、データ構造の一種である変数型です。C++におけるint型やchar型、string型のように、MatはOpenCV独自の変数型であり、画像を格納するための行列(マトリクス)データ構造を作成します。プログラム内で「Mat myImage;」と記述した場合、「myImage」という名前の行列変数を宣言していることになります。 name