Rumah >pembangunan bahagian belakang >C++ >Mengapakah `Point(x,y)` dalam OpenCV menghasilkan hasil yang tidak dijangka apabila digunakan dengan `line()` berbanding `src.at(i,j)`?

Mengapakah `Point(x,y)` dalam OpenCV menghasilkan hasil yang tidak dijangka apabila digunakan dengan `line()` berbanding `src.at(i,j)`?

Linda Hamilton
Linda Hamiltonasal
2024-12-19 07:25:09125semak imbas

Why does `Point(x,y)` in OpenCV produce unexpected results when used with `line()` compared to `src.at(i,j)`?

OpenCV: Memahami Perwakilan Titik(x,y)

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:

  • src.at(i,j): Menggunakan (i,j) sebagai (baris,lajur).
  • Titik(x,y): Menggunakan (x,y) sebagai (lajur, baris).

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(i,j).

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(lajur,baris).

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!

Kenyataan:
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