프로그래밍/영상처리공학

[영상처리공학/OpenCV with python]연주 영상 인식 피아노

수학가형 2022. 12. 19. 16:12


findsound()

 #손가락 좌표점 표시를 위한 이미지
    whiteboard=np.zeros((480,640,1))
    
    
    #단일 픽셀 지정시 Perspective Transform 이 제대로 적용되지 않아 손가락 좌표를 영역으로 표시
    center = (int(x), int(y))
    whiteboard = cv2.drawMarker(whiteboard, center, (255,255,255), cv2.MARKER_CROSS, markerSize=2,thickness=2)
    
    
    #plt.imshow(whiteboard,cmap="gray")
    #plt.title("fingermap_before transform")
    #plt.show()
    
    #손가락 위치가 저장되는 이미지
    fingerlocation = cv2.warpPerspective(whiteboard, PM, (640,480))
    center = (600, 450)
    fingerlocation = cv2.drawMarker(fingerlocation, center, (255,255,255), cv2.MARKER_CROSS, markerSize=2,thickness=2)
    
    #plt.imshow(fingerlocation,cmap="gray")
    #plt.title("fingermap_after transform")
    #plt.show()
    
    #fingerlocation 이미지에서 0이 아닌 좌표값 찾기
    #TRUE 인 곳의 인덱스 반환
    if(np.where(fingerlocation != 0) != None):
        idx_TRUE=np.where(fingerlocation != 0)
    else:
        idx_TRUE=np.zeros([1,1])
        
    idx_TRUE_X, idx_TRUE_Y = idx_TRUE
    
    #해당 인덱스 중 최초 인덱스의 X좌표 반환. 이는 변환된 좌표값임.
    locationX=idx_TRUE[1][0]
    
        
        
    #건반을 누른것으로 인지
    if(minY<y<maxY):
        #검은 건반인지 흰 건반인지 판단하는 부분
        if(y<midY): #하얀색 버튼 누름
            #누른 손가락이 무슨 건반을 누른것인지 판단
            #이때 판단하는 x좌표는 기존의 좌표가 아닌 PM 행렬을 통해 시점변환된 좌표
            for n in range(0,6):
                if(locationX > key_white[n]):
                    return sound_white[n]
                
            return sound_white[6]
        
        else: #검은색 건반 누름
            #누른 손가락이 무슨 건반을 누른것인지 판단
            #이때 판단하는 x좌표는 기존의 좌표가 아닌 PM 행렬을 통해 시점변환된 좌표
            for n in range(0,5): 
                if(key_black[2*n] < locationX < key_black[2*n+1]):
                    return sound_black[n]
                
            return 'detect fail'
    else:
        return "no touch"    

locationfilter()

    #검출 좌표 배열. 최대 7개만 검출되는 상황 가정.
    '''
    fingerlocation = np.zero([1,2,10]) # X좌표, Y좌표, 좌표 인덱스
    '''
    for i in range(0,6):
        if(minY < fingerset[0][1][i] < maxY): #건반을 누른 손가락이 있다면
            print("output coordinate is ",fingerset[0][0][i], fingerset[0][1][i])
            return fingerset[0][0][i], fingerset[0][1][i] # x좌표, y좌표 리턴
    
    #print("output coordinate is ",0 , 0)
    return 0,0 #없으면 0,0 리턴(안 눌린 상황)

https://www.youtube.com/watch?app=desktop&v=m7SFeYl6IZE