Mengubah koordinat persegi panjang opencv menjadi koordinat objek yolo untuk pelabelan gambar

Saya ingin membuat program pelabelan gambar dengan opencv c++ untuk memberi label gambar untuk detektor objek yolo, tetapi saya kesulitan dalam mengonversi koordinat persegi panjang (x1,y1,x2,y2) ke format yolo yang merupakan tinggi lebar x_center y_center kelas objek. Dan menurut dokumentasi x_center dan y_center adalah pusat persegi panjang (bukan pojok kiri atas).

Saya mencoba kode ini pada gambar yang sudah diberi label

            double centerX = (x1 + x2) / (2.0 * imageWidth);
            double centerY = (y1 + y2) / (2.0 * imageHeight);
            double width = double(abs(x2 - x1) / imageWidth);
            double height = double(abs(y2- y1) / imageHeight);

dan dapatkan 0 0.396759 0.278906 0.0109375 0.326852 yang berbeda dari 0 0.40703125 0.5194444444444445 0.25364583333333335 0.5851851851851851. Bagaimana saya bisa membuatnya berfungsi?


person EK_code    schedule 07.08.2020    source sumber
comment
bisakah anda memberi saya masukan?   -  person Hridoy_089    schedule 07.08.2020
comment
Dimensi gambar adalah 1920x1080, koordinat persegi panjang yang dipilih (x1,y1,x2,y2)=(539, 253, 522, 601) dan outputnya adalah 0 0.276302 0.39537 0.00885417 0.322222. Namun outputnya kira-kira 0 0,40703125 0,5194444444444445 0,25364583333333335 0,5851851851851851.   -  person EK_code    schedule 07.08.2020
comment
Mengapa Anda membagi lebar gambar dan tinggi gambar? Apa matematika di baliknya? Mengapa jumlahnya begitu kecil, Anda tidak ingin mendapatkan pusatnya?   -  person Yunus Temurlenk    schedule 07.08.2020
comment
Pusat x 0,40 berarti 40% lebar gambar, pusat y adalah % tinggi gambar, dan seterusnya. Inilah yang yolo gunakan untuk mendeteksi di mana letak kotak pembatas.   -  person EK_code    schedule 08.08.2020
comment
Jadi pusat x adalah pusat dari lebar persegi panjang yang dipilih, relatif terhadap lebar gambar, dan pusat y adalah pusat dari tinggi persegi panjang yang dipilih, relatif terhadap tinggi gambar.   -  person EK_code    schedule 08.08.2020


Jawaban (1)


Saya akhirnya menemukan kode yang berfungsi:

Point centralPoint = Point((selectedRect.tl().x + selectedRect.br().x) / 2, (selectedRect.tl().y + selectedRect.br().y) / 2);
                centerX = centralPoint.x / imageWidth;
                centerY = centralPoint.y / imageHeight;

                rectWidth = abs(selectedRect.br().x - selectedRect.tl().x) / imageWidth;
                rectHeight = abs(selectedRect.br().y - selectedRect.tl().y) / imageHeight;
person EK_code    schedule 09.08.2020