web-dev-qa-db-ja.com

openCVで特定のピクセルRGB値にアクセスする

インターネットとstackoverflowを徹底的に検索しましたが、私の質問への答えが見つかりませんでした:

OpenCVで特定の(x、y座標で与えられる)ピクセルの(両方の)RGB値を取得/設定するにはどうすればよいですか?重要なこと-私はC++で書いています。画像はcv :: Mat変数に保存されています。 IplImage()演算子があることは知っていますが、IplImageはC APIに由来することを知っている限り、使い心地があまり良くありません。

はい、私はすでにこの OpenCV 2.2でのピクセルアクセス スレッドがあったことを知っていますが、それは白黒のビットマップについてのみでした。

編集:

回答ありがとうございます。ピクセルのRGB値を取得/設定する方法はたくさんあります。親友であるベニーからもう1つアイデアをもらいました!非常にシンプルで効果的です。どちらを選ぶかは好みの問題だと思います。

Mat image;

(...)

Point3_<uchar>* p = image.ptr<Point3_<uchar> >(y,x);

そして、次の方法でRGB値を読み書きできます。

p->x //B
p->y //G
p->z //R
70
Wookie88

以下を試してください:

cv::Mat image = ...do some stuff...;

image.at<cv::Vec3b>(y,x);は、cv::Vec3b型のRGB(BGRとして注文される場合があります)ベクトルを提供します

image.at<cv::Vec3b>(y,x)[0] = newval[0];
image.at<cv::Vec3b>(y,x)[1] = newval[1];
image.at<cv::Vec3b>(y,x)[2] = newval[2];
90
Boaz

低レベルの方法は、マトリックスデータに直接アクセスすることです。 RGBイメージ(OpenCVは通常BGRとして保存されると思います)で、cv :: Mat変数がframeと呼ばれると仮定すると、場所(xy)で青い値を取得できます(左上から):

frame.data[frame.channels()*(frame.cols*y + x)];

同様に、B、G、およびRを取得するには:

uchar b = frame.data[frame.channels()*(frame.cols*y + x) + 0];    
uchar g = frame.data[frame.channels()*(frame.cols*y + x) + 1];
uchar r = frame.data[frame.channels()*(frame.cols*y + x) + 2];

このコードは、ストライドが画像の幅に等しいと仮定していることに注意してください。

16
aardvarkk

このような問題を抱えている人にとっては、コードは簡単です。私は自分のコードを共有し、あなたはそれを直接使用できます。 OpenCVはピクセルをBGRとして保存することに注意してください。

cv::Mat vImage_; 

if(src_)
{
    cv::Vec3f vec_;

    for(int i = 0; i < vHeight_; i++)
        for(int j = 0; j < vWidth_; j++)
        {
            vec_ = cv::Vec3f((*src_)[0]/255.0, (*src_)[1]/255.0, (*src_)[2]/255.0);//Please note that OpenCV store pixels as BGR.

            vImage_.at<cv::Vec3f>(vHeight_-1-i, j) = vec_;

            ++src_;
        }
}

if(! vImage_.data ) // Check for invalid input
    printf("failed to read image by OpenCV.");
else
{
    cv::namedWindow( windowName_, CV_WINDOW_AUTOSIZE);
    cv::imshow( windowName_, vImage_); // Show the image.
}
2
ShannonLiu

現在のバージョンでは、cv::Mat::at関数で 次元 を処理できます。したがって、Matオブジェクトmの場合、m.at<uchar>(0,0,0)は機能するはずです。

0
Jacob
uchar * value = img2.data; //Pointer to the first pixel data ,it's return array in all values 
int r = 2;
for (size_t i = 0; i < img2.cols* (img2.rows * img2.channels()); i++)
{

        if (r > 2) r = 0;

        if (r == 0) value[i] = 0;
        if (r == 1)value[i] =  0;
        if (r == 2)value[i] = 255;

        r++;
}
0
Saef Myth