Xo'sh, qanday qilib stereo kamera yoki chuqurlik sensori kabi qo'shimcha qurilmalarni talab qilmasdan veb-kamera yordamida real vaqt rejimida ob'ekt kamerasi orasidagi masofani qanday qilib aniqlay olamiz?*

Ushbu blog posti uchburchak o'xshashligi deb nomlangan oddiy algoritmni amalga oshirishni o'z ichiga oladi, ob'ektni aniqlash uchun biz OpenCV-ning yuzni aniqlash yordamida buni soddalashtiramiz.

Masofani baholash uchun demo video

Kod bazasi

Kod mening GitHub omborimda mavjud bo'ladi, bu erda men muhim kod parchalarini tushuntiraman, agar sizga yordam kerak bo'lsa, sharh qoldiring, men sizga yordam berishdan xursand bo'laman 😎

Talablar

Talablar juda oddiy, sizga Python, OpenCV va Yuzni aniqlash uchun Haar-cascade fayllari kerak.

Mashinada python o'rnatilgan bo'lsa, terminalni oching va terminalga quyidagi buyruqni qo'ying va siz o'rnatishni tugatasiz.

pip install opencv-python # on Linux turn pip to pip3

Malumot tasvirini oling

Malumot tasviri bizga real dunyoni (ob'ekt tekisligi) xaritalash imkonini beradi, chunki biz ob'ektni 2D kosmosda (tasvirda) suratga olganimizda uning chuqurligini yo'qotamiz, aks holda bizga maxsus kamera kerak bo'ladi, u biz xohlagancha chuqurlikni suratga oladi. bizning veb-kameramizdan foydalanish uchun mos yozuvlar tasviri talab qilinadi, siz bir nechta narsalarga e'tibor berishingiz kerak, shuning uchun aniqlik pasaymaydi, siz mening mos yozuvlar tasviridan foydalanishingiz mumkin, bu unchalik ta'sir qilmaydi, lekin men uni olish uchun o'zingiz suratga olishingizni maslahat beraman. ko'proq aniqlik.

Malumot tasvirini olishda siz ba'zi narsalarga e'tibor berishingiz kerak.

  • Tasvirning (ramka) o'lchamlari bir xil bo'lishi kerak, chunki men OpenCV standartini (640, 480) saqladim.
  • Malumot tasvirlarini olishda kamerani iloji boricha tekis tuting.
  • Ob'ekt kamerasidan masofani (KNOWN_DISTANCE) o'lchang, uni yozib oling va 76,2 santimetrga o'rnatilgan tasvirni oling.
  • Ob'ektning kengligini (KNOWN_WIDTH) o'lchang, uni ham yozib qo'ying, men uchun bu 14,3 santimetr.

Muhim o'zgaruvchilar

  • KNOWN_DISTANCE:bu real dunyoda obyekt kamerasi 📷 uchun masofa.
  • KNOWN_WIDTH:Bu ob'ektning real dunyoda o'lchangan kengligi
  • face_width_in_frame:Bu tasvirdagi (ramka) yuzning eni boʻlib, yuz detektori tomonidan piksellarda oʻlchanadi.
KNOWN_DISTANCE = 76.2  # centimeter
KNOWN_WIDTH = 14.3  # centimeter

Ob'ektni aniqlash (yuz)

Men bu erda yuzni aniqlashdan foydalanmoqdaman, bu har bir ob'ekt detektoriga mos kelmaydi, shunchaki protseduraga rioya qiling,

Opencv python yordamida yuzni aniqlash, bu yerda oddiygina yuzni aniqlaydigan va yuz kengligini piksellarda qaytaradigan funksiya

Yuz ma'lumotlari funksiyasi faqat bitta argumentni oladi, ya'ni rasm.

def face_data(image):
face_width = 0
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_detector.detectMultiScale(gray_image, 1.3, 5)
    for (x, y, h, w) in faces:
        cv2.rectangle(image, (x, y), (x+w, y+h), WHITE, 1)
        face_width = w
return face_width

Fokus uzunligini topuvchi

Fokus uzunligini topuvchi funktsiyasi uchta argumentni aniqlaydi:

  1. Measured_masofa - mos yozuvlar tasvirini olish paytida kameradan ob'ektgacha bo'lgan masofa, Ma'lum_masofa = 72,2 santimetr
  2. Haqiqiy_kenglik Haqiqiy dunyoda ob'ektning o'lchangan kengligi, bu erda men yuzning kengligini o'lchayman, u Ma'lum_keng =14,3 santimetr atrofida
  3. Width_in_rf_image - rasm/ramkadagi ob'ektning pikselda bo'ladigan kengligi.

Bu funksiya fokus uzunligini qaytaradi, bu masofani topish uchun ishlatiladi, bu shunchaki xaritalash.

bu erda kod:

def FocalLength(measured_distance, real_width, width_in_rf_image):
    focal_length = (width_in_rf_image* measured_distance)/ real_width
    return focal_length

Masofani topuvchi

Bu funksiya uchta argumentni bajaradi,

  1. Fokus uzunligi pikselda, bu Fokal masofani aniqlovchi funksiyasidan qaytish
  2. Real_width U ob'ektning haqiqiy dunyoda kengligini o'lchaydi, bu erda men yuzning kengligini o'lchayman, u Ma'lum_keng =14,3 santimetrga teng.
  3. Width_in_rf_image - rasm/ramkadagi ob'ektning pikselda bo'ladigan kengligi.

Masofani topuvchi funksiya santimetrdagi masofani qaytaradi

bu erda kod:

def Distance_finder(Focal_Length, real_face_width, face_width_in_frame):
    distance = (real_face_width * Focal_Length)/face_width_in_frame
    return distance

Bu juda ko'p, bu erda hamma narsani batafsil tushuntirib beradigan video darslik,

mana bu algoritmning aniqroq versiyasi, mana “GitHub Repository”

Yagona kamera (noutbukning oddiy veb-kamerasi) yordamida qulayroq va aniqroq masofani topishning yana bir yo'li (Aruco Markers) mavjud, biz ularni kelgusi postda ko'rib chiqamiz.

Ma'lumotnoma:







«Mlearning.ai bo'yicha takliflar
Qanday qilib Mlearning.aimedium.com saytida yozuvchi bo'lish mumkin?