7

ここに問題があります:OpenCVv.2.4.2でグレースケール画像をロードします。ここで、たとえば位置(0,0)のピクセルの値を知りたいと思います。私はもう試した:

Mat image=imread("00001.jpg",1);
cvtColor(image,image,CV_RGB2GRAY);
int a=image.at<unsigned>(0,1);
printf("%d ",a);

これは実際には機能しません。任意のデータ型(CV_8U、CV_32S ...)でピクセル値を取得するにはどうすればよいですか?

ありがとう!!!

4

4 に答える 4

4

ここで2つの間違いを犯しています。

画像の読み取り中に、入力引数として1を指定しています。imreadで説明したように、この関数は3つの異なる形式で画像を読み取ることができます。

CV_LOAD_IMAGE_UNCHANGED(<0)は画像をそのままロードします(存在する場合はアルファチャネルを含む)CV_LOAD_IMAGE_GRAYSCALE(0)は画像を強度1としてロードします
CV_LOAD_IMAGE_COLOR(> 0)は画像をRGB形式でロードします

あなたの場合CV_LOAD_IMAGE_GRAYSCALE、2番目の引数として使用する必要があります

使用している次のステップでは、image.at<unsigned>(0,1);これは何にも対応していません。使用します<unsigned>が、コンパイラは「UNSIGNED?UNSIGNEDwhat???」と表示します。

これを行うためのより良い方法は、CV_LOAD_IMAGE_COLORまたはのような正しいラベルを使用することだと思いCV_LOAD_IMAGE_GRAYSCALEます。以下の例では、画像を1つのチャネル()に読み込んでいます。これにより、画像CV_LOAD_IMAGE_GRAYSCALEが自動的にグレースケールに変換されます。

#include <cv.h>
#include <highgui.h>

#include <iostream>

using namespace std;
using namespace cv;

int main()
{
    Mat gImg = imread("img.png", CV_LOAD_IMAGE_GRAYSCALE);

    uchar val;
    val = gImg.at<uchar>(0,0);

    cout << (int)val << endl;

    imshow("showImg",gImg);
    cvWaitKey(0);

    return 1;
}
于 2012-09-20T14:02:05.770 に答える
1

これを行う簡単な方法があります。

Mat has Mat.dataは、元のデータマトリックスを参照するポインターを提供します。

n番目の行m番目の列のピクセル値を取得するには、

Mat img = imread("filename.jpg",CV_LOAD_IMAGE_COLOR);
unsigned char *input = (unsigned char*)(img.data);

int i,j,r,g,b;
for(int i = 0;i < img.cols;i++){
    for(int j = 0;j < img.rows;j++){
         b = input[img.cols * j + i ] ;
         g = input[img.cols * j + i + 1];
         r = input[img.cols * j + i + 2];
     }
 }

だから、これはカラー画像についてです。グレースケール画像の場合、

Mat img = imread("filename.jpg",CV_LOAD_IMAGE_COLOR);
Mat g;
cvtColor(img, g, CV_BGR2GRAY);
unsigned char *input = (unsigned char*)(g.data);

int i,j,r,g,b;
for(int i = 0;i < img.cols;i++){
    for(int j = 0;j < img.rows;j++){
         g = input[img.cols * j + i];
     }
 }

このブログ投稿で詳細をお読みください。

于 2012-09-20T18:32:43.060 に答える
0

まず第一に、この方法でピクセル値を取得する一般的な方法はありません。つまり、を使用する場合は、常に正しいタイプの値を指定する必要がありますat。この場合、a=image.at<uchar>(0,1);画像を8ビットの符号なしグレースケール(1チャネル)に変換するため、これを行う必要があります。

OpenCVはチャネル順序としてBGRを使用するため、RGB2GRAYの代わりにCV_BGR2GRAYを使用する必要があります。

画像を最初からグレースケールとして読み取って、ucharもう一度使用することもできます。

Mat image = imread("00001.jpg",0);    // note the 0 flag
int a=image.at<uchar>(0,1);
printf("%d ",a);
于 2012-09-20T15:49:40.063 に答える
0

どのタイプを使用するかをよりよく理解するために、opencvがそれをどのように表現しているかを調べてみることができます。

cout << image.depth() << ", " << image.channels() << endl;

要素へのアクセスに関するこのディスカッションも確認してください。

于 2012-09-20T12:36:56.553 に答える