WinGyu_coder

Django, API 서버로 이미지 주고 받기, OpenCV 컴퓨터 비전 본문

딥러닝 컴퓨터 비전

Django, API 서버로 이미지 주고 받기, OpenCV 컴퓨터 비전

WinGyu 2023. 12. 1. 08:23

회사에서 영상을 프레임 단위로 받아 딥러닝으로 만든 모델로 보내는 작업을 하였다. 이 부분은 정리하면 좋을거 같아서 정리를 해둔다 .

 

우선 이미지를 받을 서버는 Django REST Framework로 구현하였다. Django API 서버쪽에 받는 코드는 이렇게 된다. 

 

우선 DRF에 APIView를 가져오고 POST를 구현한다. 

 

# 서버 코드

from rest_framework.views import APIView
from rest_framework.response import Response

import requests
import numpy as np
import cv2
import base64

class DeeplearningModelAPI(APIView):
    def post(self, request):
        img_data = request.data["img"]

        img_data = base64.b64decode(img_data)
        nparr = np.frombuffer(img_data, np.uint8)
        img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
        result = 모델 img 사용
        return Response({"result":result)

 

필자는 DRF에 APIView를 썻지만 다른걸로 구현해도 된다. 이미지를 받는 방법에 대해서만 집중하면 좋을거 같다. 

 

base64를 불러온 후 b64decode 방식으로 이미지를 해석한다. 그런다음 np를 사용해 이미지를 np.frombuffer를 통해 버퍼로 만들고 

 cv2로 이미지를 가져온다. 그런다음 인공지능 모델에 사용하면 된다. 

 

 

# 클라이언트 

import requests
import cv2
import base64

# API 서버 주소
url = "http://아이피주소/api/v1/django/"

# 비디오 불러오기 
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    print(frame.shape)
    
    if not ret:
        break
        
    _, buffer = cv2.imencode(".jpg", frame)
    # 올바른 base64 인코딩
    frame_data = base64.b64encode(buffer).decode("ascii")
    response = requests.post(url, data={"img": frame_data})
    
    key = cv2.waitKey(1)
    if key == 27:  # ESC 키
        break
        
        
cap.release()

 

비디오 및 영상에서 프레임을 가져오고. base64를 통해 인코딩을 한다. 

그리고 준비해둔 Django API 서버에 POST 메소드를 사용하면 된다.