Hand Control Music Player

2570 views Nov 21, 2024

ကျွန်တော်တို့ဒီနေ့မှာတော့ hand control music player တည်ဆောက်ပါမယ်။ဘယ်လိုဆောက်မယ်ဆိုတာကို မပြောခင် ကျွန်တော်တို့တွေ လက်ရှိမှာ python သည် top language ဖြစ်နေပြီကို သိထားပြီးလောက်ပြီထင်ပါတယ်။ဘယ်လိုနေရာတွေမှာ top ဖြစ်လာတာလဲ ဆိုရင်တော့ machine learning,deep learning,data science စတာတွေမှာ python ကို တော်တော်အသုံးများလာပါတယ်။အဲ့တော့  ဒီနေ့ မှာ ကျွန်တော်တို့ website မှာ members ဝင်ထားသောသူများ python basic နားလည်လာပြီဆို computer vision အပိုင်းလေးကို ဒီ tutorial လေးနဲ့ စတင် မိတ်ဆက်ပေးတာပါ။ဒီ computer vision ကို ဝါသနာပါရင် လမ်းစလေးရသွားစေတယ်ဆို ကျွန်တော်တို့ ဒီ website ထောင်ပေးထားရကျိုးနပ်စေပါတယ်။ဒီ website မှာ လာပြီး knowledge sharing လုပ်ပေးမှာသည် ကျွန်တော်တစ်ယောက်ထဲမဟုတ်ပါ။တခြား လက်တွေ့မှာ အလုပ်လုပ်တွေမှာ လုပ်ကိုင်နေတဲ့ ဆရာများလဲ လာပြီး sharing လုပ်ပေးမှာ ဖြစ်လို့ member ကြေးက မြင့်သွားနိုင်တာမို့ အခုရက်ပိုင်းတွင်း လာရောက် join စေချင်ပါတယ်။ပြောချင်တာတွေ ပြောပြီးပြီဆိုတော့  သင်ခန်းစာကို စလိုက်ရအောင်

ဒီ tutorial မှာ ဘာတွေ လိုအပ်မလဲဆို python basic ကို သိထားရပါမယ်။computer vision basic ကိုနည်းနည်းသိထားရပါမယ်။ကျွန်တော်တို့သည် ဒီ tutorial မှာ computer vision basic ကို မိတ်မဆက်ပေးပါဘူး။Members ဝင်များတော့ စိတ်မပူပါနဲ့ သူငယ်ချင်းတို့တွက် မကြာခင် ထပ်ဖွင့်ပေးမည်ဖြစ်ပါသည်။

ဒီ tutorial ရည်ရွယ်ချက်သည် beginners များအနေနဲ့ ဘာဆက်လုပ်လို့ရတယ်ဆိုတာ သိအောင် ရေးပေးခြင်းဖြစ်ပါသည်။သုံးသွားမှာတော့ opencv နဲ့ python version 3 ကို သုံးသွားပါမယ်။သီချင်းကို play ဖို့တွက် pygame ကိုသုံးသွားပါမယ်။ဒါတွေ အားလုံး ကိုယ့်ဘာ့သာ install လုပ်ရပါမယ်။

မှတ်ချက်။။ Code အရင်ကြည့်ပါ ပြီးမှ စာဖတ်ပါ။ပြီးရင် code နဲ့ စာတွဲကြည့်ပါ။အဲ့တာမှ နားလည်နိုင်ပါမယ်။

import cv2
import numpy as np
import math
import os
import pygame
import time

အပေါ်က code အတိုင်းပဲ လိုတာများကို import လုပ်လိုက်ပါတယ်။

def get_input():
    cap = cv2.VideoCapture(0)
    current = 0
    state = None
    while(cap.isOpened()):

        ret, img = cap.read()

        #for hand area
        cv2.rectangle(img,(300,300),(50,50),(255,0,0),1)

      
        crop_img = img[50:300, 50:300]
        grey = cv2.cvtColor(crop_img, cv2.COLOR_BGR2GRAY)
        value = (35, 35)

အပေါ်မှာတော့ get_input ဆိုတဲ့ function ထဲမှာ ကျွန်တော်တို့ VideoCapture နဲ့ ကျွန်တော်တို့ camera ကနေ video ရိုက်ပြီး ရလာတဲ့ image ကို cv2.rectangle နဲ့ video ထဲမှာပေါ်သလို rectangle box လေးဆွဲလိုက်ပါတယ်။ပြီးရင်တော့ cvtColor နဲ့ grey color ကိုပြောင်းလိုက်တယ်။ဘာကြောင့်ပြောင်းတာလဲဆို single color နဲ့ကျ image feature တွေ image processing algorithm တွေက ပိုအလုပ်လုပ်ကျ လို့ပါ။

        blurred = cv2.GaussianBlur(grey, value, 0)
        _, thresh1 = cv2.threshold(blurred, 125, 255,
                                   cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
      

        image,contours, hierarchy = cv2.findContours(thresh1.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

အပေါ်က code  သုံးကြောင်းသည် image ထဲက မသေချာတဲ့ noise data တွေကို ဖယ်ထုတ်ပြီး ကျွန်တော်တို့ hand contour ကိုရှာတာဖြစ်ပါတယ်။

        cv2.imshow("thre",thresh1)

        cnt = max(contours, key =cv2.contourArea)
        
        x,y,w,h = cv2.boundingRect(cnt)
        cv2.rectangle(crop_img,(x,y),(x+w,y+h),(0,0,255),0)
        
        drawing = np.zeros(crop_img.shape,np.uint8)
        cv2.drawContours(drawing,[cnt],0,(0,255,0),0)
     
        hull = cv2.convexHull(cnt,returnPoints = False)
        defects = cv2.convexityDefects(cnt,hull)
    
        count_defects = 0
        diff = 0
        top = 0
        diff2 = 0
        right = 0
        left = 0
        for i in range(defects.shape[0]):
            M = cv2.moments(cnt)
            cX = int(M["m10"] / M["m00"])
            cY = int(M["m01"] / M["m00"])
            s,e,f,d = defects[i,0]
            top = tuple(cnt[cnt[:, :,1].argmin()][0])
            bottom = tuple(cnt[cnt[:,:,1].argmax()][0])
            right = tuple(cnt[cnt[:,:,0].argmin()][0])
            left = tuple(cnt[cnt[:,:,0].argmax()][0])
            start = tuple(cnt[s][0])
            end = tuple(cnt[e][0])
            far = tuple(cnt[f][0])
            a = math.sqrt((end[0] - start[0])**2 + (end[1] - start[1])**2)
            b = math.sqrt((far[0] - start[0])**2 + (far[1] - start[1])**2)
            c = math.sqrt((end[0] - far[0])**2 + (end[1] - far[1])**2)
            angle = math.acos((b**2 + c**2 - a**2)/(2*b*c)) * 57
            
            diff = cY-top[1]
            diff2 = bottom[1]-cX
            

            if angle <= 90:
              
                count_defects += 1
                cv2.circle(crop_img,far,1,[0,0,255],-1)
            #dist = cv2.pointPolygonTest(cnt,far,True)
            cv2.line(crop_img,start,end,[0,255,0],2)
            #cv2.line(crop_img,start,end,[0,255,0],2)
            cv2.circle(crop_img,far,5,[0,0,255],-1)
            cv2.circle(crop_img,top,8,[255,0,0],-1)
            cv2.circle(crop_img,bottom,8,[0,255,0],-1)
            cv2.circle(crop_img,right,8,[0,255,255],-1)
            cv2.circle(crop_img,left,8,[255,255,255],-1)
            cv2.circle(crop_img,(cX,cY),2,[255,255,0],-1)

ကျွန်တော်တို့ အပေါ်က code အကုန်လုံးသည် convex hull alogrithm ကိုသုံးပြီး လက်ထိပ် point လေးတွေကို ရှာတာပါ အောက်ကပုံကို ကြည့်နိုင်ပါတယ်။

ဒီလိုဆို ပိုနားလည်လွယ်ပါတယ်။ကျွန်တော်တို့covexity defects ကိုရှာပြီး လက်ကြားက angle ကို တွက်ထုတ်ကာ လက်ဘယ်နှစ်ချောင်းလဲကိုသိနိုင်ပါတယ်။လက်ချောင်းတွေရပြီဆိုတော့ music control ပဲကျန်ပါတော့တယ်။

        img = cv2.flip(img,1)
        count_defects += 1
        if top[1] < 25 or diff2 > 130:
         
            cv2.putText(img,"SORRY CAN'T RECOGNIZE", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1,(0,255,255), 2)
      
        elif count_defects == 2:
            
            cv2.putText(img,"Playing music", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1,(0,255,255), 2)
            current = current + 1
           
            
            if current == 1 and (state == None or state == "pause"):
                if state == "pause":
                    state = "play"
                    pygame.mixer.music.unpause()

                else:
                    state = "play"
                  
                    pygame.mixer.init()
                    pygame.mixer.music.load("me.ogg")
                    pygame.mixer.music.play()
          


        elif count_defects == 3:

            
            if state == "play" or state == "pause":
                    cv2.putText(img,"Volume Up", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1,(0,255,255), 2)
                    volume= pygame.mixer.music.get_volume()
                    pygame.mixer.music.set_volume(volume+0.1)
                    
            else:
                cv2.putText(img,"Please Play Music", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1,(0,255,255), 2)

            
        elif count_defects == 4:


            
            if state == "play" or state == "pause":
                    cv2.putText(img,"Volume Down", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1,(0,255,255), 2)
                    volume= pygame.mixer.music.get_volume()
                    if volume > 0.1:
                        pygame.mixer.music.set_volume(volume-0.1)
                    else:
                        pygame.mixer.music.set_volume(0.0)
                 
            else:
                cv2.putText(img,"Please Play Music", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1,(0,255,255), 2)
        elif count_defects == 5:

           
            cv2.putText(img,"Pause!!!", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1,(0,255,255), 2)
            if current > 1 and state == "play":
                pygame.mixer.music.pause()
                state = "pause"
                current = 0

        else:

            if diff > 100:
                 cv2.putText(img,"1", (50,50),cv2.FONT_HERSHEY_SIMPLEX, 2,(0,255,255), 2)
                 
            else:
                 cv2.putText(img,"Hand close!!!", (50,50),cv2.FONT_HERSHEY_SIMPLEX, 2,(0,255,255) ,2)
                
        #cv2.imshow('drawing', drawing)
        #cv2.imshow('end', crop_img)

        cv2.imshow('Gesture', img)

       #

      
        k = cv2.waitKey(10)
        if k == 27:
            break

if __name__ == '__main__':
    get_input()

ပထမဆုံး flip လုပ်လိုက်ပါတယ်။ဘာလို့ဆိုတော့ webcam က လာတယ့် image သည် ပြောင်းပြန်ကြီးပါ။အဲ့တာကြောင့် ကြည့်ရအဆင်ပြေအောင် flip လိုက်ပါတယ်။ပြီးရင်တော့ ကျွန်တေ်ာတို့ လက်ချောင်းအရေအတွက်ပေါ်မူတည်ပြီးတော့ pygame ကနေ me.ogg သီချင်းကို play ပါတော့တယ်။if case တွေပဲမို့ code ကို ကြည့်တာနဲ့နားလည်နိုင်မယ်လို့ထင်ပါတယ်။

ဒါဆိုကျွန်တော်တို့ hand control music player လေးပြီးပါပြီ။ဒီမှာ နားမလည်တာတွေ ရှိရင်စိတ်မပူပါနဲ့ ဘယ်သူမှတော့ စလာတည်းက နားမလည်ပါဘူး။အောက်က code file ကိုဒေါင်းပြီး run လို့ရအောင် အရင်စမ်းကြည့်ပါ။ဘာတွေလိုမလဲ ဘာတွေ install လုပ်ရမလဲ ကိုယ့်ဘာ့သာ error တွေ fixed ကြည့်ပါ။ဒါက လောလောဆယ် စလေ့လာတဲ့သူတွေ အတွက် အရေးကြီးဆုံးဖြစ်ပါတယ်။ကျေးဇူးတင်ပါတယ်။နောက်ကျတွေ့မယ်။

မှတ်ချက်။။ စမ်းသပ်လျှင် video ထဲကအတိုင်းနောက်ခံ background  သည် အုတ်နံရံလို ဒါမှမဟုတ် ဘာမှ မပါတဲ့ပြောင်မှ အဆင်ပြေပါလိမ့်မည်။

Click here to dowload source code