Dalam pemprosesan imej, memahami susunan mata boleh menjadi penting. OpenCV, perpustakaan penglihatan komputer yang popular, menggunakan sistem koordinat yang boleh menyebabkan kekeliruan mengenai perwakilan mata.
Soalan:
Pertimbangkan imej yang disimpan dalam Matriks src dengan dimensi 300x200. Apabila menggunakan operasi berikut:
for(int i = 0; i < src.rows; i++){ for(int j = 0; j < src.cols; j++){ line( src, Point(i,j), Point(i,j), Scalar( 255, 0, 0 ), 1,8 ); } } imshow("A",src); waitKey(0);
Hasil yang dijangkakan ialah mengisi keseluruhan imej dengan garis putih. Walau bagaimanapun, hanya bahagian atas menjadi putih.
Tingkah laku ini berbeza dengan operasi berikut:
for(int i = 0; i < src.rows; i++){ for(int j = 0; j < src.cols; j++){ src.at<uchar>(i,j)=255; } } imshow("A",src); waitKey(0);
yang berjaya mengisi keseluruhan imej dalam warna putih.
Jawapannya:
Penjelasan terletak pada representasi berbeza yang digunakan untuk mata:
Percanggahan ini berpunca daripada sifat dwi Mat OpenCV, yang mewakili kedua-dua imej dan matriks. Dalam notasi matriks, susunan baris-utama digunakan, di mana indeks pertama mewakili baris dan indeks kedua mewakili lajur. Konvensyen ini sejajar dengan src.at
Sebaliknya, sistem koordinat untuk titik mengikut tatatanda imej, di mana nilai pertama menentukan arah-x (lajur) dan yang kedua nilai menentukan arah-y (baris). Ini menerangkan penggunaan susunan (lajur,baris) dalam Titik(x,y) dan penjajaran dengan src.at
Memahami perbezaan ini adalah penting untuk mengakses dan mengubah suai dengan berkesan mata dalam OpenCV.
Atas ialah kandungan terperinci Mengapakah `Point(x,y)` dalam OpenCV menghasilkan hasil yang tidak dijangka apabila digunakan dengan `line()` berbanding `src.at(i,j)`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!