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