Ishning nazariy ma’lumoti


Download 1.26 Mb.
bet4/6
Sana14.12.2022
Hajmi1.26 Mb.
#1004629
1   2   3   4   5   6
Bog'liq
Kurs ishi O\'T va UDT

Maxsus Pi Shield

4-rasm. Maxsus Pi shield
Maxsus Pi qalqoni ba‘zi qiziqarli loyihalarni osonroq va xavfsizroq qilish uchun ishlab chiqilgan. Bunga servolarni boshqarish va yaqin atrofdagi aloqani misol qilish mumkin . Shuningdek, u Raspberry Pi-ning barcha GPIO pinlarini himoya qiladi va ularni yanada qulayroq qiladi, shuning uchun agar siz tasodifan juda ko‘p oqim yuborsangiz, Pi zarar ko‘rmaydi.
3.2. QURILMANING DASTURIY TA’MINOTI
Avvalo 'face_detect.py' va 'blob_detect.py' deb nomlangan ikkita alohida skript yaratamiz. Bu biz ishlaydigan skriptlar bo‘ladi. Face_detect.py skriptini tahrirlash bilan boshlaymiz.
Odatdagidek rasmlarni qayta ishlash kutubxonasini import qilamiz va Camera va Viewer ob'ektini yaratamiz.
from imgproc import *
cam = Camera(160, 120)
view = Viewer(cam.width, cam.height, "Face detection")
Biz cheksiz tsikl yaratmoqchimiz, u erda biz bir xil ishni Ctrl-C bilan tugamaguncha takroriy bajaramiz.
while True:
Har safar loop qilsak, biz kameradan rasmni olishni va uni saqlamoqchimiz.
image = cam.grabImage()
Endi qiziqarli qism. Rasmni qayta ishlash modulida Image sinfining bir qismi bo‘lgan funktsiya mavjud detectFaces, bu funktsiya tasvirni kirish sifatida qabul qiladi va uning ichidagi yuzlarni qidiradi; yuzlar topilganda, ularning chegaralovchi to‘rtburchaklar Python katakchalari ro‘yxatiga qaytariladi. Ushbu katakchalarda matchning x va y holatlari hamda uning chegaralangan to‘rtburchaklar kengligi va balandligi ko‘rsatilgan.
faces = image.detectFaces()
facesendi topilgan yuzlarning chegaralangan to‘rtburchaklar ro‘yxati mavjud. Endi biz ma’lumotni chiqarib olishimiz kerak faces. Buni for loop yordamida qilishimiz mumkin.
for face in faces:
Har bir tsiklning takrorlanishida, faceyangi mos keladigan yuzni aks ettiruvchi yangi naycha bo‘ladi. Qaytgan chegaralarni facetasvirga tortish uchun foydalanaylik.
# extract the x, y, width and height from the tuple
x, y, width, height = face

# use the information to draw an purple rectangle around the face


image.drawRect(x, y, width, height, 128, 0, 255)
Endi, rasmni ko‘rinishga torting, buni for loop tashqarisida, ammo while ichida bajaring, shunda ham har bir kadr chiziladi.
view.displayImage(image)
Ushbu dasturni hozirdanoq ishga tushiring, u sizning yuzingizni ramkada ko‘tarib, atrofiga binafsha rangli chekka chizish kerak.
Endi yuzni aniqlash ishlamoqda, biz blobni aniqlashga o‘tamiz. Robotni boshqarishni ko'rib chiqqandan so'ng, biz yuzni aniqlashga qaytamiz.
Blob_detect.py-ni ochamiz, bu bizning blobni aniqlash skriptimiz bo‘ladi.
BLOB ochish Qo'llanma tomchi ochish algoritm nom ostida qanday ishlaydi orqali ketadi, lekin juda sekin edi, va faqat bir vaqtda bitta BLOB band edi. Robotni boshqarish maqsadida biz tasvirni qayta ishlash modulining bir qismi bo'lgan biroz rivojlangan blokirovkalarni aniqlashdan foydalanamiz. Buni ishlatish uchun yuzni aniqlashga o'xshash formatdagi boshqa skript kerak.
from imgproc import *

cam = Camera(160, 120)


view = Viewer(cam.width, cam.height, "Blob detection")

while True:


image = cam.grabImage()
Endi rasmdagi to'siqlarni aniqlash uchun filtrlash uchun ranglar oralig'ini aniqlashimiz kerak. Buning uchun biz chaqirilgan funktsiyadan foydalanamiz chromaKey(). Ushbu funktsiya qizil, yashil va ko'k rang intensivligi qiymatlarini va pol qiymatini argument sifatida qabul qiladi. U qizil, yashil va ko'k ranglarni 3D grafadagi o'qlar kabi ko'rib chiqadi va mos yozuvlar intensivligi bilan joriy piksel orasidagi masofani hisoblash uchun Pifagor teoremasidan foydalanadi. Agar masofa pol chegarasidan kichik bo'lsa, u holda piksel o'tadi va oq rangga o'rnatiladi, aks holda piksel qora rangga o'rnatiladi.
# use the chroma key with the colour (160, 64, 64) and the threshold 96
image.chromaKey(160, 64, 64, 96)
Chroma tugmachasi funktsiyasini qo'llaganidan so'ng, taqdim etilgan rasm qora va oq rangga ega bo'ladi. Agar biz asl rasmga keyinroq chizishni istasak, xrom tugmachasini ishlatishdan oldin uning nusxasini yaratishimiz kerak, masalan:
# create a copy of the original image for later
image_copy = image.copy()
# now apply the chroma key
image.chromaKey(160, 64, 64, 96)
Rasmning nusxasini keyinroq ekranga chizish uchun ishlatamiz, ammo hozirda oq va qora rangdagi asl nusxalarni blokirovkalarni aniqlash uchun ishlatamiz. detectBlobsFunktsiya ham shu kabi yo'l bilan ishlaydi detectFaces, biroq shuningdek sınırlayıcı to'rtburchak x va y o'rnini va kengligi va balandligi qaytib, u ham tomchi egallaydi piksel sonini yoki "maydoni" qaytadi.
# detectBlobs returns a tuple of the x, y, width and height of the
# bounds and the area in pixels of the blob
blobs = image.detectBlobs()
Bu erdan biz har bir blobda iteratsiya qilishimiz mumkin, uning chegaralangan qutisini olishimiz, rasm nusxasiga chegaralarini chizishimiz va keyin rasm nusxasini ekranga chizishimiz mumkin.
for blob in blobs:
# extract the blob's information
x, y, width, height, area = blob

# draw green bounding boxes around the blob on the image copy


image_copy.drawRect(x, y, w, h, 0, 255, 0)

# display the image copy on screen


view.displayImage(image_copy)
detectBlobsFunktsiya uzluksiz viloyatlar, barcha faqat bir piksel tashkil 'atmosferaga otadi "barcha, jumladan, tasvir topilgan bizga bergan. Darhaqiqat, biz faqat rasmdagi eng katta blokni qiziqtiramiz, shuning uchun biz boshqa barcha bloklarni filtrlashimiz kerak. Biz topilgan barcha bloklarni ko'rib chiqsak, biz hozirgacha topilgan eng katta blobni kuzatib boramiz va ketma-ket har bir blokning maydonini ushbu blokka qarab tekshirib, oxirigacha biz eng kattasiga ega ekanligimizga amin bo'lamiz.
# detect blobs in the image
blobs = image.detectBlobs()

# our current biggest


largest_blob = None

# the current biggest's area


largest_blob_area = 0

for blob in blobs:


# extract the blob's information
x, y, width, height, area = blob

# check if the area is greater than the largest blob's


if area > largest_blob_area:
# area is greater, so the current blob is the new largest
largest_blob = blob

# set the largest area to the current blobs area
largest_blob_area = area

# check the largest_blob is set


if largest_blob is not None:
# extract largest blobs information
x, y, width, height, area = largest_blob

# draw a purple rectangle around it on the image copy


image_copy.drawRect(x, y, width, height, 128, 0, 255)

# display the image copy


view.displayImage(image_copy)
Sinash uchun ushbu kodni ishga tushiring. U rasmdagi eng katta uzluksiz blobni aniq ko'rsatishi va uning atrofida binafsha rangli to'rtburchak chizishi kerak. Agar blokirovkani aniqlash ishlamayotgan bo'lsa, blokirovkalarni topish uchun ishlatiladigan oq-qora versiyani ko'rish uchun uning nusxasini emas, balki rasmni ko'rsating.
Agar chindan ham tiqilib qolsangiz , ushbu skript uchun kodlar ro'yxati mavjud: face_detect.py

Download 1.26 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling