2

OpenCV の新しいバージョン (2.x) で RGB ピクセルにアクセスする方法がわかりません。古い方法と新しい方法を組み合わせて使用​​しようとしましたが、成功しませんでした。

これが私のコードです

#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace cv;
using namespace std;

int main (int argc, char* argv[])
{
Mat img;


string winMain = "Main";

img = imread(argv[1]);

for (int j = 0; j < img.rows; j++)
{
    for (int i = 0; i < img.cols; i++)
    {
        img.data[j * img.cols + i * 3 + 0] = (uchar)0; //B
        //img.data[j * img.cols + i + 1] = (uchar)0; //G
        //img.data[j * img.cols + i + 2] = (uchar)0; //R
    }
}

namedWindow(winMain);

imshow(winMain, img);

waitKey();  

return 1;
}

次の例でわかるように、画像の 3 分の 1 だけが変更されています。

例へのリンク

助けてくれてありがとう

4

2 に答える 2

4

あなたのコードをテストしたところ、バグが見つかりました。列のインデックスに 3 を掛けましたが ( ) 、行のインデックスi * 3にも 3 を掛ける必要があります( )。j * img.cols * 3

私は次のものに置き換えj * img.colsましたj * img.cols * 3

for (int j = 0; j < img.rows; j++)
{
    for (int i = 0; i < img.cols; i++)
    {
        img.data[j * img.cols * 3 + i*3 + 0] = (uchar)0; //B
        //img.data[j * img.cols * 3 + i*3 + 1] = (uchar)0; //G
        //img.data[j * img.cols * 3 + i*3 + 2] = (uchar)0; //R
    }
}

例を試してみましょう。

画像の例 ( MIT 歩行者データセットから):

オリジナル画像

OPのコードを使用した結果:

OPのコード

改訂されたコードを使用した結果 (とj * img.cols * 3):

新しいコード

于 2012-09-18T06:51:49.977 に答える
1

ループ内で、次のことができます。

img.at<Vec3b>(j,i)[0] = 0;    // Blue Channel
img.at<Vec3b>(j,i)[1] = 0;    // Green Channel
img.at<Vec3b>(j,i)[2] = 0;    // Red Channel

これはあなたが望んでいたことですか、それとも私は間違って理解しましたか?

于 2012-09-17T18:01:22.837 に答える