Apabila bekerja dengan OpenCV, mengakses nilai saluran piksel tertentu boleh menjadi penting untuk tugas pemprosesan imej . Artikel ini menangani soalan biasa: "Bagaimanakah saya boleh mendapatkan nilai saluran untuk piksel tertentu?"
Dengan mengandaikan imej yang diwakili oleh Mat objek foo berada dalam 8-bit yang biasa digunakan setiap saluran (CV_8UC3), untuk mendapatkan nilai saluran memerlukan perkara berikut langkah:
for(int i = 0; i < foo.rows; i++) { for(int j = 0; j < foo.cols; j++) { Vec3b bgrPixel = foo.at<Vec3b>(i, j); // Process B, G, and R values here... } }
Dalam kod ini, Vec3b mewakili vektor 3 saluran di mana setiap saluran sepadan dengan nilai Biru, Hijau dan Merah (BGR).
Pengoptimuman Prestasi:
Atas sebab prestasi, akses terus kepada penimbal data mungkin diutamakan:
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 // Process B, G, and R values here... } }
Sebagai alternatif, akses berasaskan baris boleh digunakan:
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 // Process B, G, and R values here... } }
Dengan mengikuti kaedah ini, anda boleh mendapatkan semula nilai saluran piksel individu untuk pelbagai pemprosesan imej dengan cekap. tugasan dalam OpenCV.
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengakses nilai saluran piksel tertentu dalam imej OpenCV Mat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!