파이썬

[파이썬] OpenCV, Pandas를 이용하여 LATCH 정보 출력

IntegerString 2020. 9. 12. 23:47
def make_dataframe(txt_path):
    name = []
    size = []
    country = []
    file_name = []
    breeds = []
    life = []
    with open(txt_path, encoding='utf8') as txt:
        lines = txt.read().splitlines()
        for line in lines:
            split_line = line.split(' ')
            for i, j in enumerate(split_line):
                if i == 0:
                    name.append(j)
                elif i == 1:
                    size.append(j)
                elif i == 2:
                    country.append(j)
                elif i == 3:
                    file_name.append(j)
                elif i == 4:
                    breeds.append(j)
                elif i == 5:
                    life.append(j)
    dic = {'name': name, 'size': size, 'country': country, 'file_name': file_name, 'breeds': breeds, 'life': life}
    df = pd.DataFrame(dic)

    return df

텍스트를 참조하여 데이터프레임을 만드는 함수


def sort_and_show(df, sort_by):
    # 형태가 문자열로 된 숫자를 숫자형으로 형변환 (정렬을 올바르게 하기 위해)
    if sort_by != 'name':
        df[sort_by] = pd.to_numeric(df[sort_by])
    df = df.sort_values(by=[sort_by])
    file_name_list = df['file_name']
    sort_by_list = list(df[sort_by])
    frame_h_list = []
    temp_list = []

    for index, file_name in enumerate(file_name_list):
        frame = cv2.imread(f"dogs/{file_name}")
        if sort_by != 'name':
            cv2.putText(frame, f"{index + 1}. {sort_by}: {sort_by_list[index]}", (0, 20),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)
        else:
            cv2.putText(frame, f"{index + 1}.", (0, 20),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)
        temp_list.append(frame)
        if index % 4 == 3:
            frame_h = cv2.hconcat(temp_list)
            frame_h_list.append(frame_h)
            temp_list.clear()

    frame_t = cv2.vconcat(frame_h_list)
    cv2.imshow(f"sorted_by_{sort_by}", frame_t)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

데이터프레임과 정렬 기준이 되는 속성(name, size, life)을 입력받아 데이터프레임을 정렬하고 그림으로 출력하는 함수


def sort_and_show_2(df, sort_by):
    column_list = df[sort_by].drop_duplicates()
    frame_h_list = []
    for column in column_list:
        file_name_list = list(df[df[sort_by] == column]['file_name'])
        temp_list = []
        for file_name in file_name_list:
            frame = cv2.imread(f"dogs/{file_name}")
            temp_list.append(frame)
        frame_h = cv2.hconcat(temp_list)
        cv2.putText(frame_h, f"{sort_by}: {column}", (0, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)
        frame_h_list.append(frame_h)
    for index, frame_h in enumerate(frame_h_list):
        cv2.imshow(f"sorted_by_{sort_by}_{index}", frame_h)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

데이터프레임과 정렬 기준이 되는 속성(country, breeds)을 입력받아 데이터프레임을 정렬하고 그림으로 출력하는 함수


txt_path = "E:/승이/2-2/데이터시각화/강아지.txt"
sort_and_show_2(make_dataframe(txt_path), 'country')  # Location
sort_and_show(make_dataframe(txt_path), 'name')  # Alphabet
sort_and_show(make_dataframe(txt_path), 'life')  # Time
sort_and_show_2(make_dataframe(txt_path), 'breeds')  # Category
sort_and_show(make_dataframe(txt_path), 'size')  # Hierarchy

Location (출생지)
Alphabet (이름)
Time (평균 수명)
Category (견종)
Hierarchy (크기)