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

【C++】OpenCVにおける関心領域(ROI)の仕組みと使い方を解説

画像から特定の部分を切り出したい場合、まず対象となる領域を特定し、その領域を元の画像から別の行列(Mat)へコピーする必要があります。これがOpenCVにおけるROI(Region of Interest:関心領域)の基本的な仕組みです。

ROIの基本的な考え方

この例では、冒頭で2つのMat行列が宣言されています。その後、「image_name.jpg」という名前の画像が「image1」行列に読み込まれます。特に注目すべきは次の行です。

image2 = image1(Rect(100, 100, 120, 120));

この一行が、画像内の指定された領域を切り出し、「image2」行列に格納する処理を行っています。

【C++】OpenCVにおける関心領域(ROI)の仕組みと使い方を解説

上の図は、「Rect(100, 100, 120, 120)」というコードが何をしているのかを示したものです。このコードの基本形は「Rect(x, y, 幅, 高さ)」です。
xとyは矩形の左上(始点)の座標を定義し、続く2つの値は矩形の幅と高さを表します。これらの値を変更することで、切り出す領域の位置やサイズを自由に調整できます。

サンプルコード

以下のプログラムは、OpenCVにおけるROI(関心領域)の動作を示す例です。

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main() {
    Mat image1; // 「image1」という名前の行列を宣言 //
    Mat image2; // 「image2」という名前の行列を宣言 //
    image1 = imread("RGB.png"); // 「RGB.png」という画像をimage1に読み込む //
    image2 = image1(Rect(100, 100, 120, 120)); // image1に矩形を適用して領域を切り出す //
    namedWindow("Image_Window1"); // 元画像を表示するためのウィンドウを宣言 //
    namedWindow("Image_Window2"); // ROIを表示するためのウィンドウを宣言 //
    imshow("Image_Window1", image1); // 元画像を表示 //
    imshow("Image_Window2", image2); // 切り出したROIを表示 //
    waitKey(0); // キー入力があるまで待機 //
    return 0;
}

実行結果

このプログラムを実行すると、元画像を表示するウィンドウと、切り出されたROI(座標(100, 100)を始点とする120×120ピクセルの領域)を表示するウィンドウの2つが開きます。

【C++】OpenCVにおける関心領域(ROI)の仕組みと使い方を解説

このように、Rectクラスを使うだけで画像の一部を簡単に切り出すことができ、物体検出や画像処理の前処理など、さまざまな場面でROIは活用されています。

  1. C++とOpenCVで二値画像(バイナリイメージ)を反転する方法

    二値画像(バイナリイメージ)の反転とは、ピクセル値を逆転させる処理のことです。視覚的な観点から見ると、二値画像を反転させると、白いピクセルは黒へ、黒いピクセルは白へと変換されます。この処理は、主に3つの関数を組み合わせて実現します。それぞれの手順を順番に見ていきましょう。ステップ1:カラー画像をグレースケールに変換するまず、cvtColor()関数を使って元の画像をグレースケール画像に変換します。この関数の基本形は次の通りです。cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);ステップ2:グレースケール画像を二値化する続いて、グ

  2. C++とOpenCVでバイナリ画像(二値画像)を作成する方法を解説

    バイナリ画像(二値画像)とは、黒と白の2色のみで表現されるデジタル画像のことです。画像処理の観点から見ると、バイナリ画像は「0」と「1」という2つの値しか持たないピクセルで構成されています。ピクセルの値が0の場合は純粋な黒を、値が1の場合は純粋な白を表します。グレースケール画像では、各ピクセルが256段階の異なる値を持つのに対し、バイナリ画像では2つの値しか存在しません。このシンプルさゆえに、バイナリ画像はさまざまな用途で活用されています。例えば、モルフォロジー変換(形態学的処理)ではバイナリ画像が必要であり、背景から物体の形状を抽出する処理にもバイナリ画像が用いられます。OpenCVを使用す