2011-11-15 8 views
6

OpenCV 2.3でC++を使って個々のピクセルにアクセスする方法は?私U8C3の画像の場合
は、私はこれを試してみました:まず例外をスローしてピクセル値にアクセスするOpenCV 2.3 - C++

Scalar col = I.at<Scalar>(i, j); 

p = I.ptr<uchar>(i); 

、もう一つは、いくつかの無関係なデータを返しています。私が見つけたすべての例は、OpenCVのCバージョンの古いIIPimage(?)です。

私が必要とするのは、指定された座標でピクセルの色を取得することです。

答えて

9

cv::Mat::atと呼ぶタイプは、個々のピクセルのタイプと一致する必要があります。 cv::Scalarは基本的にcv::Vec<double,4>なので、U8C3の画像では機能しません(もちろんF64C4の画像でも動作します)。

あなたが cv::Vec<uchar,3>ため typedefある cv::Vec3bを、必要とする、あなたのケースで

Vec3b col = I.at<Vec3b>(i, j); 

あなたが本当にする必要がある場合は、その後cv::Scalarにこれを変換することができますが、cv::Mat::atインスタンス化のタイプが一致している必要がありますイメージデータを変換せずにキャストするだけなので、イメージのタイプは異なります。

2番目のコードスニペットは、画像のi番目の行へのポインタを返します。無関係なデータではなく、単一のuchar値へのポインタです。したがって、U8C3イメージの場合、pに返されるデータ内の連続する3つの要素はすべて1ピクセルを表す必要があります。再び、すべてのピクセルを単一の要素として取得するには、それを返す前に行ポインタを適切にキャストするだけで何もしません。

編集:イメージで多くのピクセルアクセスを行いたい場合は、cv::Mat_便利なタイプを使用することもできます。

Mat_<Vec3b> &U = reinterpret_cast<Mat_<Vec3b>&>(I); 

あなたはその後、自由にU(i, j)を使用し、常に符号なしcharの3要素のタプルを取得するので、することができますすべてが適切に入力された画像のピクセルにアクセスするようにこれは、画像データの周りに型指定された薄いラッパー以外の何ものでもありません再度コピーすることなく、キャストしてください(したがって、同じパフォーマンスでI.at<Vec3b>(i, j)となります)。

+0

迅速な対応をありがとうございます。私は本当に複数のチャンネルと混同されていて、どのように保存されていますか? – jnovacho

関連する問題