Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah anda mengakses nilai saluran piksel dalam imej Mat dalam OpenCV?

Bagaimanakah anda mengakses nilai saluran piksel dalam imej Mat dalam OpenCV?

DDD
Lepaskan: 2024-11-25 01:46:14
asal
189 orang telah melayarinya

How do you access pixel channel values in a Mat image in OpenCV?

Mengekstrak Nilai Saluran Pixel daripada Imej Mat dalam OpenCV

Dalam OpenCV, terdapat beberapa cara untuk mengakses dan memanipulasi nilai piksel dalam imej Mat. Satu senario biasa ialah mendapatkan semula nilai saluran piksel tertentu.

Menggunakan Vec3b

Jika imej disimpan dalam format CV_8UC3, yang mewakili imej tiga saluran dengan integer tidak bertanda 8-bit values ​​(BGR), anda boleh menggunakan jenis data Vec3b untuk mengakses saluran individu. Sebagai contoh, jika foo ialah imej Mat jenis ini, anda boleh lelaran ke atas piksel menggunakan kod berikut:

for (int i = 0; i < foo.rows; i++)
{
    for (int j = 0; j < foo.cols; j++)
    {
        Vec3b bgrPixel = foo.at<Vec3b>(i, j);
        
        // Access the pixel's BGR values...
    }
}
Salin selepas log masuk

Menggunakan Akses Penampan Data Terus

Atas sebab prestasi, anda boleh juga mengakses nilai piksel secara langsung dengan mengakses penimbal data. Ini menyediakan akses yang lebih pantas tetapi memerlukan lebih banyak pengendalian manual penukaran data dan mengimbangi saluran. Berikut ialah contoh cara untuk melakukan ini:

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
        
        // Access the pixel's BGR values...
    }
}
Salin selepas log masuk

Sebagai alternatif

Sebagai alternatif, anda juga boleh menggunakan kaedah row() untuk mengakses baris individu imej, seperti yang ditunjukkan dalam yang berikut kod:

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

        // Access the pixel's BGR values...
    }
}
Salin selepas log masuk

Ingat bahawa OpenCV menyimpan nilai piksel dalam format BGR (Biru, Hijau, Merah) dan bukannya RGB, jadi anda perlu mengambil kira perkara itu apabila mengakses saluran.

Atas ialah kandungan terperinci Bagaimanakah anda mengakses nilai saluran piksel dalam imej Mat dalam OpenCV?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan