Python dapatkan koordinat klik mouse pada gambar

Dibesarkan di pantai timur Amerika Serikat, saya kira saya seharusnya sudah terbiasa dengan salju sekarang - tetapi ternyata tidak. Sebagai seorang anak, saya menyukai salju. Saya suka naik eretan, seluncur salju, dan adu bola salju

Tapi sekarang, sebagai orang dewasa, salju hanya berarti ketidaknyamanan. Itu berarti perjalanan akan menjadi mengerikan. Itu berarti tidak bisa mengemudi ke gym. Dan itu berarti terjebak di apartemen

Yang mengatakan, saya mengambil hari salju ini di pantai timur dan menulis posting blog tentang menangkap peristiwa klik mouse dengan Python dan OpenCV

Dalam contoh ini, kami akan mengeklik dan menyeret Wilayah Minat (ROI) persegi panjang dan memotongnya dari gambar kami. Teknik ini sangat membantu jika Anda memberi label pada data sebagai input ke algoritme klasifikasi gambar

Jadi, jika Anda mencoba memahami cara kerja peristiwa klik mouse dengan Python dan OpenCV, maka tidak perlu mencari lagi. Posting blog ini akan menunjukkan hal itu kepada Anda

Python dapatkan koordinat klik mouse pada gambar

Mencari kode sumber untuk posting ini?

Versi OpenCV dan Python
Untuk menjalankan contoh ini, Anda memerlukan Python 2. 7 dan OpenCV 2. 4. X

Menangkap peristiwa klik mouse dengan Python dan OpenCV

Mari kita lanjutkan dan mulai contoh ini. Buka file baru, beri nama click_and_crop.py , dan kami akan mulai bekerja

# import the necessary packages
import argparse
import cv2

# initialize the list of reference points and boolean indicating
# whether cropping is being performed or not
refPt = []
cropping = False

def click_and_crop(event, x, y, flags, param):
	# grab references to the global variables
	global refPt, cropping

	# if the left mouse button was clicked, record the starting
	# (x, y) coordinates and indicate that cropping is being
	# performed
	if event == cv2.EVENT_LBUTTONDOWN:
		refPt = [(x, y)]
		cropping = True

	# check to see if the left mouse button was released
	elif event == cv2.EVENT_LBUTTONUP:
		# record the ending (x, y) coordinates and indicate that
		# the cropping operation is finished
		refPt.append((x, y))
		cropping = False

		# draw a rectangle around the region of interest
		cv2.rectangle(image, refPt[0], refPt[1], (0, 255, 0), 2)
		cv2.imshow("image", image)

Kami akan mulai dengan mengimpor dua paket yang diperlukan. argparse_ untuk parsing argumen baris perintah dan cv2 untuk binding OpenCV kami

Kami juga mendefinisikan dua variabel global pada Baris 7 dan 8. refPt , yang merupakan daftar dua koordinat (x, y) yang menentukan wilayah persegi panjang yang akan kita pangkas dari gambar kita, dan cropping , boolean yang menunjukkan apakah kita dalam mode pemangkasan atau tidak

Untuk memproses peristiwa klik mouse, kami mendefinisikan fungsi callback click_and_crop pada Baris 10. Setiap kali peristiwa mouse terjadi, OpenCV akan menyampaikan detail terkait ke fungsi click_and_crop kami

Agar fungsi kita dapat menangani relai, kita perlu menerima 5 argumen

  • peristiwa. Peristiwa yang terjadi (tombol kiri mouse ditekan, tombol kiri mouse dilepas, gerakan mouse, dll)
  • x. Koordinat x kejadian tersebut
  • y. Koordinat y dari kejadian tersebut
  • bendera. Setiap bendera yang relevan dilewatkan oleh OpenCV
  • parameter. Parameter tambahan apa pun yang disediakan oleh OpenCV

Dari sana kami mengambil referensi ke daftar refPt kami dan bendera cropping kami di Jalur 12

Kami kemudian memeriksa Baris 17 untuk melihat apakah tombol kiri mouse kami ditekan. Jika ya, kami merekam (x, y)-koordinat acara dan menunjukkan bahwa kami sekarang dalam "mode tanam"

Pada titik ini kami akan menyeret keluar area persegi panjang dari gambar yang ingin kami pangkas. Setelah selesai menyeret keluar wilayah, kami melepaskan tombol kiri mouse — Garis 22 menangani saat tombol kiri mouse dilepaskan dan memperbarui daftar poin yang berisi ROI kami. Kami juga menggambar persegi panjang yang mewakili ROI pada Baris 29 dan 30

Sekarang, mari kita lihat bagaimana kita dapat menggunakan fungsi ini untuk memotong gambar

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# load the image, clone it, and setup the mouse callback function
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)

# keep looping until the 'q' key is pressed
while True:
	# display the image and wait for a keypress
	cv2.imshow("image", image)
	key = cv2.waitKey(1) & 0xFF

	# if the 'r' key is pressed, reset the cropping region
	if key == ord("r"):
		image = clone.copy()

	# if the 'c' key is pressed, break from the loop
	elif key == ord("c"):
		break

# if there are two reference points, then crop the region of interest
# from teh image and display it
if len(refPt) == 2:
	roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
	cv2.imshow("ROI", roi)
	cv2.waitKey(0)

# close all open windows
cv2.destroyAllWindows()
_

Kita mulai dengan menguraikan argumen baris perintah kita pada Baris 33-35. Kami hanya membutuhkan satu sakelar di sini,

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# load the image, clone it, and setup the mouse callback function
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)

# keep looping until the 'q' key is pressed
while True:
	# display the image and wait for a keypress
	cv2.imshow("image", image)
	key = cv2.waitKey(1) & 0xFF

	# if the 'r' key is pressed, reset the cropping region
	if key == ord("r"):
		image = clone.copy()

	# if the 'c' key is pressed, break from the loop
	elif key == ord("c"):
		break

# if there are two reference points, then crop the region of interest
# from teh image and display it
if len(refPt) == 2:
	roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
	cv2.imshow("ROI", roi)
	cv2.waitKey(0)

# close all open windows
cv2.destroyAllWindows()
2 , yang merupakan jalur ke gambar yang ingin kami pangkas. Gambar ini kemudian dimuat dan digandakan pada Baris 38 dan 39. Kita membuat salinan gambar yang dalam sehingga kita dapat menggambar kotak pembatas persegi panjang pada Baris 29 tanpa merusak gambar aslinya

Baris 40 dan 41 menangani pendaftaran fungsi callback click_and_crop kita. Kami pertama-tama memanggil

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# load the image, clone it, and setup the mouse callback function
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)

# keep looping until the 'q' key is pressed
while True:
	# display the image and wait for a keypress
	cv2.imshow("image", image)
	key = cv2.waitKey(1) & 0xFF

	# if the 'r' key is pressed, reset the cropping region
	if key == ord("r"):
		image = clone.copy()

	# if the 'c' key is pressed, break from the loop
	elif key == ord("c"):
		break

# if there are two reference points, then crop the region of interest
# from teh image and display it
if len(refPt) == 2:
	roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
	cv2.imshow("ROI", roi)
	cv2.waitKey(0)

# close all open windows
cv2.destroyAllWindows()
_4 untuk membuat jendela bernama "gambar". Dan kami kemudian mengatur panggilan balik mouse dengan memanggil
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# load the image, clone it, and setup the mouse callback function
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)

# keep looping until the 'q' key is pressed
while True:
	# display the image and wait for a keypress
	cv2.imshow("image", image)
	key = cv2.waitKey(1) & 0xFF

	# if the 'r' key is pressed, reset the cropping region
	if key == ord("r"):
		image = clone.copy()

	# if the 'c' key is pressed, break from the loop
	elif key == ord("c"):
		break

# if there are two reference points, then crop the region of interest
# from teh image and display it
if len(refPt) == 2:
	roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
	cv2.imshow("ROI", roi)
	cv2.waitKey(0)

# close all open windows
cv2.destroyAllWindows()
5 , menyediakan jendela "gambar" bernama kami dan fungsi panggilan balik click_and_crop kami

Dari sini, sisa contoh ini hanya menyatukan potongan-potongan itu

Kami memulai loop pada Baris 44 yang (1) menampilkan gambar kami di layar dan (2) menunggu penekanan tombol

Ini adalah titik di mana kami memilih wilayah persegi panjang yang ingin kami pangkas dari gambar

Jika kami menekan tombol

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# load the image, clone it, and setup the mouse callback function
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)

# keep looping until the 'q' key is pressed
while True:
	# display the image and wait for a keypress
	cv2.imshow("image", image)
	key = cv2.waitKey(1) & 0xFF

	# if the 'r' key is pressed, reset the cropping region
	if key == ord("r"):
		image = clone.copy()

	# if the 'c' key is pressed, break from the loop
	elif key == ord("c"):
		break

# if there are two reference points, then crop the region of interest
# from teh image and display it
if len(refPt) == 2:
	roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
	cv2.imshow("ROI", roi)
	cv2.waitKey(0)

# close all open windows
cv2.destroyAllWindows()
_7 setelah memilih wilayah yang akan dipotong, kami mengatur ulang pemotongan kami

Dan jika kita menekan tombol

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# load the image, clone it, and setup the mouse callback function
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)

# keep looping until the 'q' key is pressed
while True:
	# display the image and wait for a keypress
	cv2.imshow("image", image)
	key = cv2.waitKey(1) & 0xFF

	# if the 'r' key is pressed, reset the cropping region
	if key == ord("r"):
		image = clone.copy()

	# if the 'c' key is pressed, break from the loop
	elif key == ord("c"):
		break

# if there are two reference points, then crop the region of interest
# from teh image and display it
if len(refPt) == 2:
	roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
	cv2.imshow("ROI", roi)
	cv2.waitKey(0)

# close all open windows
cv2.destroyAllWindows()
_8, maka kita keluar dari loop dan melakukan pemotongan yang sebenarnya pada Baris 59-62

Terakhir, kami membersihkan dan menutup semua jendela yang terbuka di Jalur 65

Acara mouse OpenCV sedang beraksi

Sekarang setelah contoh kita dikodekan, mari kita coba. Buka terminal dan jalankan perintah berikut

$ python click_and_crop.py --image jurassic_park_kitchen.jpg

Anda pertama-tama akan disajikan dengan gambar di layar Anda

Python dapatkan koordinat klik mouse pada gambar
Gambar 1. Gambar asli kami ditampilkan di layar

Pilih wilayah yang ingin Anda potong dengan mengklik, menyeret, dan melepaskan

Python dapatkan koordinat klik mouse pada gambar
Gambar 2. Mengklik dan menyeret wilayah gambar yang ingin kita potong

Terakhir, tekan tombol

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# load the image, clone it, and setup the mouse callback function
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)

# keep looping until the 'q' key is pressed
while True:
	# display the image and wait for a keypress
	cv2.imshow("image", image)
	key = cv2.waitKey(1) & 0xFF

	# if the 'r' key is pressed, reset the cropping region
	if key == ord("r"):
		image = clone.copy()

	# if the 'c' key is pressed, break from the loop
	elif key == ord("c"):
		break

# if there are two reference points, then crop the region of interest
# from teh image and display it
if len(refPt) == 2:
	roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
	cv2.imshow("ROI", roi)
	cv2.waitKey(0)

# close all open windows
cv2.destroyAllWindows()
_8  untuk melakukan pemotongan

Python dapatkan koordinat klik mouse pada gambar
Gambar 3. Memotong gambar yang sebenarnya

Seperti yang Anda lihat, kami telah berhasil memotong wajah Tim dari gambar

Ini adalah contoh lain di mana kita memotong Velociraptor

Python dapatkan koordinat klik mouse pada gambar
Gambar 4. Contoh lain dari memotong gambar kita, kali ini mengekstrak kepala Velociraptor dari gambar

Jadi begitulah — metode sederhana untuk menangkap peristiwa mouse untuk memotong gambar menggunakan Python dan OpenCV

Apa berikutnya?

Informasi kursus
64 total kelas • 68 jam video penelusuran kode sesuai permintaan • Terakhir diperbarui. Januari 2023
★★★★★ 4. 84 (128 Peringkat) • 15.800+ Siswa Mendaftar

Saya sangat percaya bahwa jika Anda memiliki guru yang tepat, Anda dapat menguasai visi komputer dan pembelajaran mendalam

Apakah menurut Anda mempelajari visi komputer dan pembelajaran mendalam harus memakan waktu, berlebihan, dan rumit?

Bukan itu masalahnya

Yang Anda perlukan untuk menguasai visi komputer dan pembelajaran mendalam adalah agar seseorang menjelaskan berbagai hal kepada Anda dengan istilah yang sederhana dan intuitif. Dan itulah yang saya lakukan. Misi saya adalah mengubah pendidikan dan seberapa rumit topik Kecerdasan Buatan diajarkan

Jika Anda serius mempelajari visi komputer, perhentian Anda berikutnya adalah Universitas PyImageSearch, visi komputer terlengkap, pembelajaran mendalam, dan kursus OpenCV online hari ini. Di sini Anda akan mempelajari cara menerapkan visi komputer dengan sukses dan percaya diri pada pekerjaan, penelitian, dan proyek Anda. Bergabunglah dengan saya dalam penguasaan visi komputer

Di dalam Universitas PyImageSearch Anda akan menemukan

  • ✓ 64 kursus tentang visi komputer esensial, pembelajaran mendalam, dan topik OpenCV
  • ✓ 64 Sertifikat Kelulusan
  • ✓ 68 jam video sesuai permintaan
  • ✓ Kursus baru dirilis secara teratur, memastikan Anda dapat mengikuti teknik mutakhir
  • ✓ Notebook Jupyter yang telah dikonfigurasi sebelumnya di Google Colab
  • ✓ Jalankan semua contoh kode di browser web Anda — berfungsi di Windows, macOS, dan Linux (tidak diperlukan konfigurasi lingkungan dev. )
  • ✓ Akses ke repo kode terpusat untuk semua 500+ tutorial di PyImageSearch
  • ✓ Pengunduhan sekali klik yang mudah untuk kode, kumpulan data, model terlatih, dll
  • ✓ Akses di ponsel, laptop, desktop, dll

Klik di sini untuk bergabung dengan Universitas PyImageSearch

Ringkasan

Dalam postingan blog ini kita belajar cara menangkap event mouse menggunakan OpenCV dan Python. Meskipun postingan ini tidak memberikan ikhtisar yang lengkap dan menyeluruh tentang semua peristiwa mouse yang dapat Anda tangkap, postingan ini meletakkan dasar untuk kemungkinan yang dapat terjadi

Posting ini juga menunjukkan bagaimana Anda dapat dengan cepat memotong dan mengekstrak wilayah gambar, yang sangat berguna saat membuat data pelatihan untuk detektor objek kustom Anda sendiri

Python dapatkan koordinat klik mouse pada gambar

Unduh Kode Sumber dan Panduan Sumber Daya 17 halaman GRATIS

Masukkan alamat email Anda di bawah ini untuk mendapatkan a. zip kode dan Panduan Sumber Daya 17 halaman GRATIS tentang Computer Vision, OpenCV, dan Deep Learning. Di dalamnya Anda akan menemukan tutorial, buku, kursus, dan perpustakaan pilihan saya untuk membantu Anda menguasai CV dan DL

Bagaimana Anda menemukan koordinat suatu titik dalam gambar dengan Python?

Sekarang mari kita lihat bagaimana menampilkan koordinat titik-titik yang diklik pada gambar. .
Impor modul cv2
Impor gambar menggunakan cv2. imread() fungsi
Tampilkan gambar gambar menggunakan cv2. fungsi imshow()
Hubungi cv2. .
Dalam fungsi yang ditentukan pengguna, periksa klik kiri mouse menggunakan cv2

Bagaimana Anda menemukan koordinat objek dalam gambar?

Dapatkan Koordinat dari Gambar .
Buka bilah alat gambar. Klik gambar untuk membuka toolbar gambar
Pilih alat koordinat. Pilih alat koordinat di toolbar
Klik titik gambar. .
Salin koordinat gambar ke papan klip. .
Tempel koordinat gambar ke dalam ekspresi

Bagaimana cara menemukan koordinat gambar di cv2?

Impor pustaka OpenCV yang diperlukan. .
Tentukan fungsi panggilan balik mouse untuk menampilkan koordinat titik yang diklik pada gambar masukan. .
Baca gambar input menggunakan cv2. .
Tentukan jendela baru dan ikat fungsi panggilan balik yang ditentukan di atas ke jendela menggunakan cv2. .
Menampilkan jendela gambar

Bagaimana Anda menemukan koordinat XY di Python?

Cara. Hitung koordinat XY menggunakan Python .
Alat Tambahkan Koordinat XY membuat bidang baru untuk Point_X dan POINT_Y, menghitung nilainya, dan menambahkan POINT_Z, dan POINT_M jika fitur input diaktifkan Z dan M. .
Alur kerja berikutnya menggunakan sintaks Hitung Bidang untuk mengakses properti kelas Luas