4

OpenCV を使用して C++ で画像を操作しています。

を使用してグレースケールで imread でアップロードされた画像のピクセル値を読み取ることができる 2 次元の uchar 配列を使用してコードを記述しました.at< uchar>(i,j)

ただし、カラー画像についても同じことをしたいと思います。.at< Vec3b>(i,j)[0].at< Vec3b>(i,j)[1]およびが必要なピクセル値にアクセスすることがわかっているので.at< Vec3b>(i,j)[2]、同様のVec3b2 次元配列を作成しました。

しかし、この配列にピクセル値を入力する方法がわかりません。2D 配列でなければなりません。

私は試した:

array[width][height].val[0]=img.at< Vec3b>(i,j)[0]

しかし、それはうまくいきませんでした。

OpenCVドキュメントまたはここでも答えが見つかりませんでした。

誰にもアイデアがありますか?

私のコードの一部を含めました。配列が必要なのは、配列を使用して、1 つのチャネルのみのグレースケールの画像に対してアルゴリズム全体が既に機能しているためです。

グレースケール コードは次のようになります。

for(int i=0;i<height;i++){
    for(int j=0;j<width;j++){
        image_data[i*width+j]=all_images[nb_image-1].at< uchar>(i,j);
    }
}

どこから読んだか:

std::vector< cv::Mat> all_images

各画像(私は長いシーケンスを持っています)、 uchar 配列のピクセル値を取得し、image_dataそれらを処理します。

同じことをしたいのですが、RGB 画像の場合は、各チャネルのデータ ピクセルを読み取って配列に入れることができません。

今回は image_data は Vec3b 配列で、試しているコードは次のようになります。

for(int i=0;i<height;i++){
    for(int j=0;j<width;j++){
        image_data[0][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[2];
        image_data[1][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[1];
        image_data[2][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[0];
    }
}

image_dataしかし、これは機能しないため、この配列が画像処理アルゴリズムで使用されるため、コード構造を変更せずに、3 つのチャネルすべての値を配列に正しく入力する方法がわかりません。

4

3 に答える 3

3

あなたが何をしようとしているのか正確にはわかりません。次の方法でカラー画像を直接読み取ることができます。

cv::Mat img = cv::imread("image.jpeg",1);

マトリックス ( img) タイプは CV_8UC3 になり、次を使用して言ったように各ピクセルにアクセスできます。

img.at<cv::Vec3b>(row,col)[channel].

Vec3basの 2D 配列がある場合、次Vec3b myArray[n][m]; のような値にアクセスできます。

myArray[i][j](k)ここで、Vec3b は行行列であるため、k={1,2,3} です。

于 2012-06-12T08:47:09.167 に答える
2

これが私がテストしたばかりのコードで、動作します。

#include <iostream>
#include <cstdlib>
#include <opencv/cv.h>
#include <opencv/highgui.h>

int main(int argc, char**argv){

  cv::Mat img = cv::imread("image.jpg",1);
  cv::imshow("image",img);
  cv::waitKey(0);
  cv::Vec3b firstline[img.cols];
  for(int i=0;i<img.cols;i++){
    // access to matrix
    cv::Vec3b tmp = img.at<cv::Vec3b>(0,i);
    std::cout << (int)tmp(0) << " " << (int)tmp(1) << " " << (int)tmp(2) << std::endl;
    // access to my array
    firstline[i] = tmp;
    std::cout << (int)firstline[i](0) << " " << (int)firstline[i](0) << " " << (int)firstline[i](0) << std::endl;
  }
  return EXIT_SUCCESS;
}
于 2012-06-12T14:25:33.907 に答える
0

最初のメッセージを編集した場合、この行は奇妙です:

image_data[0][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[2];

画像データがカラー画像の場合、次のように記述します。

image_data[i][j] = all_images[nb_image-1].at<cv::Vec3b>(i,j);
于 2012-06-12T18:06:21.960 に答える