SİHA otonom kilitlenme kodu nasıl yazılmalı?

Mr. DarkTech

Kilopat
Katılım
27 Mart 2022
Mesajlar
9.841
Makaleler
3
Çözümler
66
Yer
Amerika / Las Vegas / Bellagio
Daha fazla  
Sistem Özellikleri
CPU: i5 12400F
Motherboard: Asus prime H610-D
GPU: XFX SWFT RX6600
Cinsiyet
Erkek
Meslek
ATARİYST
Merhaba sevgili hocalarım. TEKNOFEST için savaşan İHA yarışmasına katıldık lakin İHA için otonom kilitlenme konusunda kodlama kısmı için fikire ihtiyacımız var.
Yardımlarınız için teşekkürler.
@Kxaan @ny4rlk0
@The Anorak hocam umarım siz ilgilenirsiniz.
 
Merhaba sevgili hocalarım. TEKNOFEST için savaşan İHA yarışmasına katıldık lakin İHA için otonom kilitlenme konusunda kodlama kısmı için fikire ihtiyacımız var.
Yardımlarınız için teşekkürler.
@Kxaan @ny4rlk0
@The Anorak hocam umarım siz ilgilenirsiniz.
Yarışmayla alakam olmamasına rağmen daha önce can sıkıntısından yaptığım bir projeyi paylaşabilirim.

Öncelikle Python dilini kullandım projede.
Görüntü işleme için opencv ve cvzone kütüphanesinin "PoseDetector" modülünden faydalandım.

Bu modül fotoğraftaki insanları tanımlamamıza yarıyor eğer istersen farklı nesneler için farklı kütüphaneler kullanabilirsin veya kendi nesneni eğitebilirsin bu sana kalmış.

Kilitlenme mantığı olarak da kişi tanımladıktan sonra ekrana bir artı işareti çiziyor ve ekranı 4 bölgeye ayırıyor ve algılanan kişi ile ekranın ortası arasına bir çizgi çiziyor böylece kişinin merkeze olan x ve y uzaklıklarını hesaplıyor bu sayede ne kadar sol-sağ ve yukarı-aşağı hareket etmesi gerektiğini anlayabiliyor.

Örneğin kişi bu örnekteki gibi sol altta bulunsun
1671571333062.png

Bu şekilde çizgiyi merkeze çekerek SİHA'nın hangi tarafa doğru dönüş yapacağını hesaplayabilirsin
Bu örnekte çizgi tam x eksenine denk gelene kadar yukarı ve tam y eksenine denk gelene kadar sağa gitmesi gerekiyor. (Tahmini uzaklık yazan kısım aşağıda açıklıyorum)

Eğer lazım olursa 1280x720'lik bir ekranda derinlik hesaplaması (tahmini uzaklık) için gereken değer 1210. Kendim proje üstünde uğraşırken hesaplamıştım. Bunu nasıl kullanabilirim dersen:
1671574129292.jpeg

Yani;
Kod:
C = (1210 / (A - B) * 2)

Tüm bunların uygulandığı örnek bir Python kodunu da paylaşmak istiyorum.

Kod:
Gerekli kütüphaneler:
opencv-python
cvzone

Python:
# RedisCache0
# İnsan takip sistemi
import random
import cv2
from cvzone.PoseModule import PoseDetector
detector = PoseDetector()

x = 1280
y = 720

distanceVar = 1210

font = cv2.FONT_HERSHEY_SIMPLEX

org = (50, 50)
fontScale = 2
fontScale2 = 1
color = (255, 0, 0)
color2 = (255, 255, 255)
thickness = 2

areaOne = ((0, int(x/2)), (0, int(y/2)), "1")
areaTwo = ((int(x/2), x), (0, int(y/2)), "2")
areaThree = ((0, int(x/2)), (int(y/2), y), "3")
areaFour = ((int(x/2), x), (int(y/2), y), "4")
areaNow = "Bekleniyor..."

print(areaThree)

# cap = cv2.VideoCapture("peoples.mp4")
# cap.set(cv2.CAP_PROP_FRAME_WIDTH, x)
# cap.set(cv2.CAP_PROP_FRAME_HEIGHT, y)

def writeUniqeID(img, bbox, id):
    coordsX, coordsY = bbox["bbox"][0]+20, bbox["bbox"][1]+20

    cv2.putText(img, f"ID: {id}", (coordsX, coordsY), font,
                      fontScale2, color2, 2, cv2.LINE_AA)

inScreen = False

def generateUID():
    chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    chars = list(chars.strip())

    generatedChars = []
    for i in range(10):
        generatedChars.append(random.choice(chars))
    return "".join(generatedChars)

img = cv2.imread("human.jpg")
img = detector.findPose(img)
lmList, bbox = detector.findPosition(img, bboxWithHands=False)

if bbox != {} and inScreen is False:
    uniqueID = generateUID()
    inScreen = True
    print(inScreen)
if bbox == {}:
    inScreen = False

try:
    if bbox != {}:
        writeUniqeID(img, bbox, uniqueID)
    img = cv2.line(img, (int(x/2), 0), (int(x/2), y), (0, 255, 0), 3)
    img = cv2.line(img, (0, int(y/2)), (x, int(y/2)), (0, 255, 0), 3)
except Exception as e:
    print(e)
# print(bbox)
if bbox:
    # centerCords = (int((bbox["bbox"][1] + bbox["bbox"][3]) / 2), int((bbox["bbox"][0] + bbox["bbox"][2]) / 2))

    img = cv2.circle(img, bbox["center"], radius=5, color=(255, 255, 255), thickness=-1)
    img = cv2.line(img, bbox["center"], (int(x/2), int(y/2)), color=(0, 0, 255), thickness=3)

    print(bbox)
    centerX = bbox["center"][0]
    centerY = bbox["center"][1]
    print(1210 / (bbox["center"][1] - bbox["bbox"][1]) * 2)
    estDistance = "%.2f" % float(1210 / (bbox["center"][1] - bbox["bbox"][1]) * 2)

    coordsX, coordsY = bbox["bbox"][0] + 40, bbox["bbox"][1] + 20
    print(bbox)
    cv2.putText(img, f"Tahmini Uzaklik: {estDistance} metre", (coordsX, coordsY), font,
                fontScale2, (0, 0, 0), 2, cv2.LINE_AA)
    print(f"Tahmini Uzaklik: {estDistance} metre")

    # print(centerX in range(areaThree[0][0], areaThree[0][1]), centerY in range(areaOne[1][0], areaOne[1][0]))

    if centerX in range(areaOne[0][0], areaOne[0][1]) and centerY in range(areaOne[1][0], areaOne[1][1]):
        areaNow = f"{areaOne[2]}. Bolge"
    elif centerX in range(areaTwo[0][0], areaTwo[0][1]) and centerY in range(areaTwo[1][0], areaTwo[1][1]):
        areaNow = f"{areaTwo[2]}. Bolge"
    elif centerX in range(areaThree[0][0], areaThree[0][1]) and centerY in range(areaThree[1][0], areaThree[1][1]):
        areaNow = f"{areaThree[2]}. Bolge"
    elif centerX in range(areaFour[0][0], areaFour[0][1]) and centerY in range(areaFour[1][0], areaFour[1][1]):
        areaNow = f"{areaFour[2]}. Bolge"
    # print(areaNow)
img = cv2.putText(img, areaNow, org, font,
               fontScale, color, thickness, cv2.LINE_AA)

while 1:
    cv2.imshow("Image", img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# cap.release()
cv2.destroyAllWindows()

Bu da programın bir tık geliştirilmiş halinin çıktısı:

Şunu da belirtmem lazım bu projeyi 1 hafta içerisinde yaptığım için gözümden kaçan şeyler olmuş olabilir. Zamanım olmadığı için devam edemedim maalesef.
Umarım işine yaramıştır. Kafana bir şey takılırsa sorabilirsin.
 
Son düzenleme:

Yeni konular

Geri
Yukarı