[TIL_Carrotww] 32 - 22/10/18

유형석·2022년 10월 19일
0

TIL

목록 보기
39/138
post-thumbnail

📝Carrotww의 코딩 기록장

🧲 client의 이미지를 받아 식별하여 보여주기

🔍 Django 이미지 처리

from django.test import TestCase
import torch
import cv2

# Create your tests here.
def change_img(file_path):
    # file_path -> img_upload
    model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

    fixed_path = f'./media/images/{file_path}'
    changed_file_store_path = f'./media/images/after_image{file_path}'

    origin_img = cv2.imread(fixed_path)
    changed_img = cv2.imread(fixed_path)

    results = model(origin_img)
    result = results.pandas().xyxy[0].to_numpy()

    for i in range(len(result)):
        cv2.rectangle(changed_img, (int(results.xyxy[0][i][0].item()), int(results.xyxy[0][i][1].item())), 
              (int(results.xyxy[0][i][2].item()), int(results.xyxy[0][i][3].item())), (0,255,255))

    cv2.imwrite(changed_file_store_path, changed_img)
    # filename, changed_img

    category_list = list({x[6] for x in result})

    changed_img_file_path = f'after_image{file_path}'

    return changed_img_file_path, category_list

django의 tweet app을 만들어 tests.py 파일에 함수를 넣어 이미지에 객체를 그려주는 함수를 막 짜봤다

client가 사진이미지를 올리면 해당 이미지의 이름을 가져와 /media/images 경로로 사진 이름으로 저장을 한다.

중복처리는 기능 구현을 일단 해보기 위해서 해주지 않았다. django에서는 동일한 이름이 들어오면 알아서 이름을 변경하여 저장을 한다.

upload_img = request.FILES['upload_img']

tweet.upload_img = upload_img  # tweet은 db를 담을 변수
tweet.save()

View의 POST 부분은 위와 같이 request.FILES 로 받아야 한다.

<form action="{% url 'home' %}" enctype="multipart/form-data" id="imageUploadForm" method="POST">

<input id="id_image" type="file" name="upload_img" ></input>

위 코드는 이미지를 받아 전달해주는 front 부분의 사용할 태그의 속성들

🧲 Django ORM

🔍 테스트용으로 한 필드, 혹은 모델의 모든 value 값을 GET을 통하여 전달해 줄 때

temp = TweetModel.objects.get()
temp = TweetModel.objects.all()
temp = TweetModel.objects.filter()

위와 같은 함수밖에 몰라 난항을 겪고 있었는데 찾아보니

temp = TweetModel.objects.values('key값')

values 라는 함수를 찾아서 너무 행복했다 ㅠㅠ all()로 다 가져와서 필드마다 나눠줄라고 했었는데 ... ㅎㅎ

근데 이게 끝이 아니다.
해당 모델의 필드가 3개 였는데 나는

temp = TweetModel.objects.values('upload_img')
temp2 = TweetModel.objects.values('upload_label_img')
temp3 = TweetModel.objects.values('temp3')
result = zip(temp, temp2, temp3)

과 같은 식으로 3개를 만들어 result에 합쳐서 전달해주었다.
django templates 에서 잘 받아서 동작하여 잘 되는구나 만족하고 있었는데

temp = TweetModel.objects.values()

위와 같이 쓰면 그냥 모든 필드의 value 값을 key 값과 같이 dict 형식으로 잘 가져오는걸 알았다 ㅎㅎㅎ
또한 values() 를 사용하면 dict()로 value() 는 list() 로 값을 전달해 주니 나중에 쓸일이 있을 것 같다.

profile
Carrot_hyeong

0개의 댓글