webentwicklung-frage-antwort-db.com.de

OpenCV erhält den Pixelkanalwert aus dem Mat-Bild

Vielleicht sehe ich nicht hart genug aus, aber es scheint, als würde ich ein Array verwenden. Wie bekomme ich also den Kanalwert für ein bestimmtes Pixel für foo, wenn foo so etwas wie Mat foo = imread("bar.png") ist?

30
HRÓÐÓLFR

Angenommen, der Typ ist CV_8UC3, würden Sie Folgendes tun:

for(int i = 0; i < foo.rows; i++)
{
    for(int j = 0; j < foo.cols; j++)
    {
        Vec3b bgrPixel = foo.at<Vec3b>(i, j);

        // do something with BGR values...
    }
}

Hier ist die Dokumentation für Vec3b. Hoffentlich hilft das! Vergessen Sie nicht, dass OpenCV die Dinge intern als BGR speichert und nicht als RGB.

EDIT:
Aus Performancegründen möchten Sie möglicherweise den direkten Zugriff auf den Datenpuffer verwenden, um die Pixelwerte zu verarbeiten:

So können Sie dies tun:

uint8_t* pixelPtr = (uint8_t*)foo.data;
int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;

for(int i = 0; i < foo.rows; i++)
{
    for(int j = 0; j < foo.cols; j++)
    {
        bgrPixel.val[0] = pixelPtr[i*foo.cols*cn + j*cn + 0]; // B
        bgrPixel.val[1] = pixelPtr[i*foo.cols*cn + j*cn + 1]; // G
        bgrPixel.val[2] = pixelPtr[i*foo.cols*cn + j*cn + 2]; // R

        // do something with BGR values...
    }
}

Oder alternativ:

int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;

for(int i = 0; i < foo.rows; i++)
{
    uint8_t* rowPtr = foo.row(i);
    for(int j = 0; j < foo.cols; j++)
    {
        bgrPixel.val[0] = rowPtr[j*cn + 0]; // B
        bgrPixel.val[1] = rowPtr[j*cn + 1]; // G
        bgrPixel.val[2] = rowPtr[j*cn + 2]; // R

        // do something with BGR values...
    }
}
89
mevatron

Der folgende Code funktioniert für mich, um auf einen Pixelwert zuzugreifen und ihn zu ändern.

Für den Zugriff auf den Kanalwert des Pixels: 

for (int i = 0; i < image.cols; i++) {
    for (int j = 0; j < image.rows; j++) {
        Vec3b intensity = image.at<Vec3b>(j, i);
        for(int k = 0; k < image.channels(); k++) {
            uchar col = intensity.val[k]; 
        }   
    }
}

Zum Ändern eines Pixelwerts eines Kanals:

uchar pixValue;
for (int i = 0; i < image.cols; i++) {
    for (int j = 0; j < image.rows; j++) {
        Vec3b &intensity = image.at<Vec3b>(j, i);
        for(int k = 0; k < image.channels(); k++) {
            // calculate pixValue
            intensity.val[k] = pixValue;
        }
     }
}

`

Quelle: Zugriff auf Pixelwert

14
Yoda

Das Pixelarray wird im "data" -Attribut von cv :: Mat gespeichert. Nehmen wir an, wir haben eine Mat-Matrix, in der jedes Pixel 3 Byte hat (CV_8UC3).

In diesem Beispiel zeichnen wir ein rotes Pixel an Position 100x50.

Mat foo;
int x=100, y=50;

Lösung 1:

Erstellen Sie eine Makrofunktion, die das Pixel aus dem Array abruft.

#define PIXEL(frame, W, x, y) (frame+(y)*3*(W)+(x)*3)
//...
unsigned char * p = PIXEL(foo.data, foo.rols, x, y);
p[0] = 0;   // B
p[1] = 0;   // G
p[2] = 255; // R

Lösung 2:

Holen Sie sich das Pixel mit der Methode ptr.

unsigned char * p = foo.ptr(y, x); // Y first, X after
p[0] = 0;   // B
p[1] = 0;   // G
p[2] = 255; // R
1
Derzu