OpenCV を使用して C++ で画像を操作しています。
を使用してグレースケールで imread でアップロードされた画像のピクセル値を読み取ることができる 2 次元の uchar 配列を使用してコードを記述しました.at< uchar>(i,j)
。
ただし、カラー画像についても同じことをしたいと思います。.at< Vec3b>(i,j)[0]
、.at< Vec3b>(i,j)[1]
およびが必要なピクセル値にアクセスすることがわかっているので.at< Vec3b>(i,j)[2]
、同様のVec3b
2 次元配列を作成しました。
しかし、この配列にピクセル値を入力する方法がわかりません。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 つのチャネルすべての値を配列に正しく入力する方法がわかりません。