C++とOpenCVで特定のピクセルの値を取得する2つの方法を解説
OpenCVで画像内の特定のピクセルの値を読み取るには、「at」メソッドを使う方法と、Mat_クラスによる「直接アクセス」を使う方法の2通りがあります。本記事では、両方のアプローチをサンプルコードとともにわかりやすく解説します。
「at」メソッドでピクセル値を取得する
まずは「at」メソッドから見ていきましょう。次のプログラムは、カラー画像の座標 (10, 29) にあるピクセルの値を読み出す例です。
サンプルコード
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
Mat image;//画像を格納する行列を用意//
image = imread("sky.jpg");//画像を読み込む//
int x = image.at<Vec3b>(10, 29)[0];//青チャンネルの値を取得//
int y = image.at<Vec3b>(10, 29)[1];//緑チャンネルの値を取得//
int z = image.at<Vec3b>(10, 29)[2];//赤チャンネルの値を取得//
cout << "青チャンネルの値:" << x << endl;//結果を表示//
cout << "緑チャンネルの値:" << y << endl;//結果を表示//
cout << "赤チャンネルの値:" << z << endl;//結果を表示//
system("pause");//結果を確認できるよう一時停止//
return 0;
}
実行結果

プログラムを実行すると、コンソールウィンドウに各チャンネルの値が表示されます。ポイントとなるのは次の3行です。
int x = image.at<Vec3b>(10, 29)[0]; int y = image.at<Vec3b>(10, 29)[1]; int z = image.at<Vec3b>(10, 29)[2];
1行目では、1番目のチャンネル(青)に格納された (10, 29) のピクセル値を読み取り、変数xに代入しています。2行目・3行目も同様に、それぞれ2番目(緑)、3番目(赤)のチャンネルの値を取得しています。なお、OpenCVは色をBGRの順で保持するため、インデックス0が青、1が緑、2が赤に対応します。また、Vec3bは8ビット符号なし整数3チャンネル分のデータを表す型で、一般的なカラー画像(CV_8UC3)の読み書きに使用されます。
「直接アクセス」でピクセル値を取得する
続いて、Mat_クラスを使った直接アクセスの方法です。次のプログラムは、座標 (10, 29) のピクセル値を直接読み出します。
サンプルコード
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
Mat_<Vec3b>image;//画像を格納する行列を用意//
image = imread("sky.jpg");//画像を読み込む//
Vec3b x = image(10, 29);//ピクセル値をまとめて取得//
cout << x << endl;//結果を表示//
system("pause");//結果を確認できるよう一時停止//
return 0;
}
実行結果

この方法では、画像を Mat_<Vec3b> 型として扱うことで、image(行, 列) という関数呼び出しのような構文でピクセルに直接アクセスできます。戻り値は Vec3b 型なので、x[0]、x[1]、x[2] のように各チャンネルの値を個別に取り出すことも可能です。
まとめ
OpenCVで特定のピクセル値を取得するには、「at」メソッドと「直接アクセス」の2つの方法があります。「at」メソッドは記述が直感的で安全性が高い一方、直接アクセスはオーバーヘッドが少なく高速に動作します。可読性を重視するなら「at」メソッド、処理速度が求められる場面では直接アクセスといった具合に、目的に応じて使い分けるのがおすすめです。
-
C++とOpenCVで画像のチャンネル数を取得する方法を解説
この記事では、OpenCVを使って画像のチャンネル数を調べる方法について解説します。プログラムを実行すると、コンソール画面に画像のチャンネル数が表示されます。チャンネル数を取得するには、OpenCVが提供するchannels()メソッドを使用します。このメソッドは、Matクラスのオブジェクト(画像行列)に対して呼び出すことで、その画像のチャンネル数を整数値として返します。例えば、カラー画像の場合は通常3チャンネル(BGR)、グレースケール画像の場合は1チャンネルとなります。画像処理を行う際、扱っている画像がカラーかモノクロかを判別するために、チャンネル数の確認は非常に重要な処理の一つです。以下
-
Java OpenCVライブラリを使って画像の明るさを変更する方法
OpenCVのorg.opencv.core.Matクラスが提供するconvertTo()メソッドを使うと、行列に対して必要な演算を実行し、画像のコントラストや明るさを簡単に調整できます。このメソッドは以下の4つのパラメータを受け取ります。 mat − 計算結果を格納するための空の行列。ソース行列と同じサイズ・型である必要があります。 rtype − 出力行列の型を指定する整数値。負の値を指定した場合は、ソース行列と同じ型になります。 alpha − ゲイン値。0より大きい値を指定します(デフォルトは1)。この値を変更するとコントラストに影響します。 beta − バイアス値(デフォルトは