İçindekiler:
- Adım 1: GEREKLİ ŞEYLER:
- Adım 2: ÇALIŞMA PRENSİBİ:
- Adım 3: GİRİŞ YAKALAMA VE İŞLEME:
- 4. Adım:
- Adım 5:
- Adım 6: İŞLEME BÖLÜMÜ:
- 7. Adım:
- Adım 8:
- 9. Adım:
- Adım 10:
- Adım 11:
- Adım 12: HAREKET KONTROLÜ:
- Adım 13:
Video: Gesture Hawk: Görüntü İşleme Tabanlı Arayüz Kullanan El Hareketi Kontrollü Robot: 13 Adım (Resimlerle)
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:19
Gesture Hawk, TechEvince 4.0'da basit bir görüntü işleme tabanlı insan-makine arayüzü olarak sergilendi. Faydası, diferansiyel tahrik prensibi ile çalışan robotik arabayı kontrol etmek için bir eldiven dışında hiçbir ek sensör veya giyilebilir cihaz gerekmemesi gerçeğinde yatmaktadır. Bu talimatta, sistemde kullanılan nesne izleme ve hareket algılamanın ardındaki çalışma prensibini ele alacağız. Bu projenin kaynak kodu Github'dan şu linkten indirilebilir:
Adım 1: GEREKLİ ŞEYLER:
- L298N Motor Sürücüsü
- DC Motorlar
- Robot araba şasisi
- Arduino Uno'su
- LiPo Piller
- Arduino USB Kablosu(uzun)
- Python ile OpenCV Kütüphanesi
Adım 2: ÇALIŞMA PRENSİBİ:
Gesture Hawk, yukarıdaki şemada görebileceğiniz gibi üç fazlı bir işleme sistemidir.
Adım 3: GİRİŞ YAKALAMA VE İŞLEME:
Giriş yakalama, yukarıdaki şemada verilen daha geniş kategorilerde anlaşılabilir.
El şeklini ortamdan çıkarmak için, belirli bir rengin (bu durumda - menekşe mavisi) maskeleme veya filtreleme kullanmamız gerekir. Bunu yapmak için aşağıdaki kod parçacığını kullanarak görüntüyü BGR'den HSV formatına dönüştürmeniz gerekir.
hsv = cv2.cvtColor(çerçeve, cv2. COLOR_BGR2HSV)
Şimdi, bir sonraki adım, eli maske veya filtre yoluyla çıkarmak için istenen HSV parametre aralığını bulmaktır. Bunun için en iyi yol, uygun bir menzil bulmak için iz çubuklarını kullanmaktır. İşte bu proje için kullanılan bir izleme çubuğunun ekran görüntüsü.
4. Adım:
Adım 5:
Burada, maske yapımı için böyle bir izleme çubuğu yapmak için aşağıda verilen bir kod parçası var:
cv2'yi içe aktar
numpy'yi npdef hiçbir şey(x) olarak içe aktar: cv2.namedWindow('image') ilet img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, hiçbir şey) cv2.createTrackbar('l_S) ', 'image', 50, 255, hiçbir şey) cv2.createTrackbar('l_V', 'image', 50, 255, hiçbir şey) cv2.createTrackbar('h_H', 'image', 130, 255, hiçbir şey) cv2. createTrackbar('h_S', 'image', 255, 255, hiçbir şey) cv2.createTrackbar('h_V', 'image', 255, 255, hiçbir şey) while(1): _, çerçeve = img.read()
hsv = cv2.cvtColor(çerçeve, cv2. COLOR_BGR2HSV)lH = cv2.getTrackbarPos('l_H', 'image') lS = cv2.getTrackbarPos('l_S', 'image') lV = cv2.getTrackbarPos('l_H', 'image') 'image') hH = cv2.getTrackbarPos('h_H', 'image') hS = cv2.getTrackbarPos('h_S', 'image') hV = cv2.getTrackbarPos('h_V', 'image') low_R = np. dizi([lH, lS, lV]) high_R = np.array([hH, hS, hV]) mask = cv2.inRange(hsv, low_R, high_R) res = cv2.bitwise_and(çerçeve, çerçeve, maske= maske) cv2.imshow('image', res) k = cv2.waitKey(1) & k == 27 ise 0xFF: break cv2.destroyAllWindows()
Adım 6: İŞLEME BÖLÜMÜ:
Bir elin geometrik şekline sahibiz, şimdi onu kullanmanın ve el hareketini anlamak için kullanmanın zamanı geldi.
Dışbükey örtü:
Dışbükey gövde sayesinde, şekilde mevcut olan uç noktalar aracılığıyla yaklaşık bir çokgen sığdırmaya çalışıyoruz. Soldaki resim, kırmızı ile işaretlenmiş dışbükey noktalarla şekle atanmış yaklaşık çokgeni göstermektedir.
Dışbükey noktalar, bu yaklaşık poligonun bir tarafından en uzak olan şekildeki noktalardır. Ancak, dışbükey gövde ile ilgili sorun, hesaplaması sırasında tüm dışbükey noktaların bir dizisini alacağımızdır, ancak ihtiyacımız olan şey mavi sivri dışbükey noktadır. Neden gerekli olduğunu size söyleyeceğiz.
Bu dışbükey noktayı bulmak için, dışbükey noktanın en yakın kenara olan uzaklığını bulmak için dik uzaklık formülünü uygulamamız gerekir. Mavi noktanın yandan maksimum uzaklığa sahip olduğunu gözlemledik ve bu noktayı elde ettik.
7. Adım:
Adım 8:
Ardından, başparmağın ucunu (veya en uç noktayı) bu dışbükey noktaya yatayla birleştiren çizginin eğimini bulmamız gerekiyor.
9. Adım:
Yukarıdaki durumda, hareket sola dönüş içinse α açısı 0 ila 90 derece arasında olmalıdır. Yani tan(α) pozitif olmalıdır.
Adım 10:
Yukarıdaki durumda, hareket sağa dönüş içinse α açısı 180 ila 90 derece arasında olmalıdır. Yani tan(α) negatif olmalıdır.
Bu nedenle, Tan α pozitifse, Sola dönün. Tan α negatifse, Sağa dönün. Şimdi, en önemli durdurma komutunun nasıl tespit edileceğini görme zamanı.
Burada belirli bir oran (isabet ve deneme ile bulunan) incelenir ve maksimum durumlarda bu mesafe oranı bu belirli aralıkta kalır.
Adım 11:
Son olarak, ileriye doğru hareket hareketi OpenCV'deki matchShape() işlevi tarafından analiz edilir. Bu fonksiyon, bu durumda, yukarıdaki resimde sağdaki eğitim örneği ile yukarıdaki görüntünün sol tarafındaki kontur arasında iki sayacın şeklini karşılaştırır. İki kontur şeklindeki mevcut varyasyona göre 0 ile 2 veya 3 arasında bir değer döndürür. Aynı kontur için 0 döndürür.
ret = cv2.matchShapes(cnt1, cnt2, 1, 0.0)
Burada cn1 ve cnt2 karşılaştırılacak iki konturdur.
Adım 12: HAREKET KONTROLÜ:
PySerial:
İşlenen verileri Arduino USB Kablosu ile Arduino Uno'ya iletmek üzere seri verilere dönüştürmek için python'un PySerial kütüphanesini kullandık. opencv tarafından belirli bir hareket algılandığında, 'x' diyen geçici bir değişken oluşturduk ve buna benzersiz bir değer atadık ve aşağıdaki komut satırını kullanarak onu seri girişe dönüştürdük: -
Pyserial kitaplığını içe aktarmak için seriyi içe aktar
serial. Serial('', baudrate = '9600', timeout = '0') # seri çıkışın ayarlanması.. PORT ADI, veri iletiminin gerçekleşeceği portun adıdır.
serial.write(b'x') # x bağlantı noktasına gönderilen alfabedir …b bu dizgiyi baytlara dönüştürmektir.
Arduino İşleme:
Şimdi arduino, her bir farklı seri x'in robotun düzgün hareketinden sorumlu belirli bir eyleme doğrusal olarak eşleneceği şekilde kodlanmıştır (diyelim ki sol hareketin algılanması, sağdaki motorları sola çevirmek için tetikleyecektir). Kodu doğru bir şekilde değiştirerek her bir tekerleğin hareketini hem öteleme hem de dönme yönünde kontrol edebiliriz.
L298N Motor sürücüsü:-
Motor Sürücüsü, düşük voltaj değerleri nedeniyle motorlara doğrudan güç verilemediğinden motor ve güç kaynağı arasında aracı olarak kullanılır. Li-Po Batarya, 12V giriş terminaline bağlanır ve arduino'nun 5V soketini motor sürücüsünün 5V giriş soketine bağlarız, son olarak Li-Po'nun yanı sıra arduino'yu motor sürücüsünün ortak bir toprak soketine bağlarız.
Artık motorların klemensleri verilen soketlere bağlanmıştır. Son olarak, motor için giriş terminallerini arduino'nun PWM çıkış soketlerine bağlayarak, hareketin dönme ve öteleme yönlerine doğru bir şekilde karar vermemizi sağladık.
Önerilen:
Görüntü İşleme Tabanlı Yangın Tanıma ve Söndürme Sistemi: 3 Adım
Görüntü İşleme Tabanlı Yangın Tanıma ve Söndürme Sistemi : Merhaba arkadaşlar Arduino kullanan görüntü işleme tabanlı yangın algılama ve söndürme sistemidir
Raspberry Pi ile Görüntü İşleme: OpenCV Kurulumu ve Görüntü Renk Ayrımı: 4 Adım
Raspberry Pi ile Görüntü İşleme: OpenCV Kurulumu ve Görüntü Renk Ayrımı: Bu gönderi, takip edilecek birkaç görüntü işleme eğitiminden ilkidir. Bir görüntüyü oluşturan piksellere daha yakından bakıyoruz, Raspberry Pi'ye OpenCV yüklemeyi öğreniyoruz ve ayrıca bir görüntü yakalamak için test komut dosyaları yazıyoruz ve ayrıca c
Arduino Tabanlı Temassız Kızılötesi Termometre - Arduino Kullanan IR Tabanlı Termometre: 4 Adım
Arduino Tabanlı Temassız Kızılötesi Termometre | Arduino Kullanan IR Tabanlı Termometre: Merhaba arkadaşlar, bu talimatta arduino kullanarak temassız bir Termometre yapacağız. Bazen sıvının/katının sıcaklığı çok yüksek veya çok düşük olduğundan, onunla temas kurmak ve okumak zordur. o sahnede sıcaklık
Moyamoya Görüntü İşleme: 8 Adım
Moyamoya Görüntü İşleme: Moyamoya, "duman pufu"; Beynin tabanındaki bir bölge olan bazal ganglionlardaki arterlerin tıkanması sonucu oluşan nadir bir hastalıktır. Hastalık çoğunlukla çocukları etkileyen ilerleyici bir serebrovasküler hastalıktır. sim
Kuantimetrik Görüntü İşleme: 5 Adım
Kuantimetrik Görüntü İşleme: (Yukarıdaki şekil, mevcut görüntü işleme yönteminin niceliksel görüntü işleme ile karşılaştırmasını göstermektedir. İyileştirilmiş sonuca dikkat edin. Sağ üstteki görüntü, resimlerin böyle bir şeyi ölçtüğüne dair yanlış varsayımdan kaynaklanan garip artefaktları gösteriyor