7

Ubuntu12.04とOpenCV2を使用しています

私は次のコードを書きました:

IplImage* img =0;
img = cvLoadImage("nature.jpg");
if(img != 0)
{
    Mat Img_mat(img);
    std::vector<Mat> RGB;
    split(Img_mat, RGB);

    int data = (RGB[0]).at<int>(i,j)); /*Where i, j are inside the bounds of the matrix size .. i have checked this*/ 
}

問題は、データ変数に負の値と非常に大きな値が含まれていることです。どこかで間違えたと思います。指摘していただけませんか。
私はドキュメントを読んでいます(完全には完成していません。かなり大きいです。)しかし、私が読んだことから、これはうまくいくはずです。しかし、そうではありません。ここで何が問題になっていますか?

4

3 に答える 3

11

Img_mat3チャンネルの画像です。各チャネルはuchar、データ型のピクセル値で構成されます。したがってsplit(Img_mat, BGR)Img_matは青、緑、赤の3つの平面に分割され、これらは集合的にベクトルに格納されBGRます。つまり、データ型ピクセルBGR[0]を持つ最初の(青の)平面です...したがって、uchar

int dataB = (int)BGR[0].at<uchar>(i,j);
int dataG = (int)BGR[1].at<uchar>(i,j);

すぐ...

于 2013-01-13T13:36:00.850 に答える
2

の正しいタイプを指定する必要がありますcv::Mat::at(i,j)。としてピクセルにアクセスしていintますが、のベクトルである必要がありucharます。コードは次のようになります。

IplImage* img = 0;
img = cvLoadImage("nature.jpg");
if(img != 0)
{
  Mat Img_mat(img);
  std::vector<Mat> BGR;
  split(Img_mat, BGR);

  Vec3b data = BGR[0].at<Vec3b>(i,j);
  // data[0] -> blue
  // data[1] -> green
  // data[2] -> red
}
于 2013-01-13T12:33:14.997 に答える
1

なぜ最初にIplImageをロードするのですか?CインターフェイスとC++インターフェイスを混在させています。imreadを使用してcv::Matを直接ロードする方が、より簡単です。

このようにして、タイプを指定し、それに応じたタイプをatcallで使用することもできます。

于 2013-01-13T12:08:57.940 に答える