python

Python OpenCV를 이용한 라이즈 오브 킹덤즈 매크로(2)

yssy431 2020. 2. 9. 18:01

이제 매크로를 위해 가장 중요한 geetest의 인증기를 해결해야 한다.

 

아래의 사진을 보면 윗 부분의 아이콘들을 보고서 아래의 그림에 순서맞게 클릭을 하여야 한다.

 

먼저 윗 테두리의 아이콘들을 읽어야한다. 하지만 아이콘의 갯수가 항상 랜덤하기 때문에

먼저 아이콘의 갯수와 영역을 나누는 것을 먼저 시작하여야 한다.

이미지 전 처리를 한 후 findcontours로 외곽선을 가져와 object의 갯수를 가져와 아이콘의 숫자를 파악 하였다.

    _, contours, _ = cv2.findContours(sure_bg, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

contours에는 np.array로 값들이 담겨 있는대 len(contours)를 하게 되면 외곽선검출로 오브젝트의 갯수를 찾을 수있다.

 

아이콘의 contours를 바로 찾게 되면 중간 중간 끈어진 선들이 있을때가 있게되어 오브젝트의 갯수를 정확히 찾을 수가 없다. 그렇기에 이미지의 전 처리를 해주어야 만 한다. washered coin의 이미지 전처리 하는 과정을 보고 적용하였다.

이미지 전처리 후 사진

위의 사진처럼 여러가지 방법들이 있는대 Sure BG처리가 object를 뭉개서 내부의 빈 공간들을 매꾸어준다.

def divide_icon(input_img):
    gray = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
    ret , thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
    
    kernel = np.ones((2,2),np.uint8)
    opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2)
    
    sure_bg = cv2.dilate(opening,kernel,iterations=3)
    dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
    ret, sure_fg = cv2.threshold(dist_transform,0.5*dist_transform.max(),255,0)
    sure_fg = np.uint8(sure_fg)

    unknown = cv2.subtract(sure_bg, sure_fg)

    ret, markers = cv2.connectedComponents(sure_fg)
    markers = markers + 1
    markers[unknown == 255] = 0

    markers = cv2.watershed(img,markers)
    img[markers == -1] = [255,0,0]
       
    images = [gray,thresh,sure_bg,  dist_transform, sure_fg, unknown, markers, img]
    titles = ['Gray','Binary','Sure BG','Distance','Sure FG','Unknow','Markers','Result']

    for i in range(len(images)):
        plt.subplot(2,4,i+1),plt.imshow(images[i]),plt.title(titles[i]),plt.xticks([]),plt.yticks([])

    plt.show()
    return img

sure_bg의 image를 findcontours를 해서 영역을 가져온 후 len(contours)로 오브젝트의 갯수를 정확히 가져 왔는지 확인 가능

쉽게 영역을 가져오기 위해 opencv의 boundinRect로 사각형 좌표를 가져온 후 y좌표는 항상 고정이기에 제외하며 x좌표만으로 영역을 나누었다.