Selaa lähdekoodia

ai接口支持上传4张图片

lang 3 vuotta sitten
vanhempi
commit
e01fd9f086
2 muutettua tiedostoa jossa 177 lisäystä ja 5 poistoa
  1. 83 5
      AdminController/TestServeController.py
  2. 94 0
      Object/MergePic.py

+ 83 - 5
AdminController/TestServeController.py

@@ -19,6 +19,9 @@ from Object.UidTokenObject import UidTokenObject
 from Service.CommonService import CommonService
 from django.db.models import Q, F
 from time import strftime
+from Ansjer.config import BASE_DIR
+from Object import MergePic
+import os
 
 
 class TestServeView(View):
@@ -56,10 +59,41 @@ class TestServeView(View):
 
     def AItest(self, userID, request, request_dict, response):
         file = request.FILES.get('file', None)
-        if not file:
-            return response.json(444)
-        maxLabels = int(request_dict.get('maxLabels', 5))
-        minConfidence = float(request_dict.get('minConfidence', 55))
+        file2 = request.FILES.get('file_one', None)
+        file3 = request.FILES.get('file_two', None)
+        file4 = request.FILES.get('file_three', None)
+
+        post_file_list = [file, file2, file3, file4]
+        file_list = []
+        for index in range(len(post_file_list)):
+            if post_file_list[index]:
+                file_list.append(post_file_list[index])
+
+        del post_file_list
+        if len(file_list) > 1:
+            merge = []
+            now_time = int(time.time())
+            dir_path = os.path.join(BASE_DIR, 'static/', str(now_time))
+            if not os.path.exists(dir_path):
+                os.makedirs(dir_path)
+            for item in file_list:
+                if hasattr(item, 'name'):
+                    file_path = os.path.join(dir_path, item.name)
+                    with open(file_path, 'wb') as f:
+                        for c in item.chunks():
+                            f.write(c)
+                            merge.append(file_path)
+
+            image_size = 500  # 每张小图片的大小
+            image_colnum = 2  # 合并成一张图后,一行有几个小图
+            MergePic.merge_images(dir_path, image_size, image_colnum)
+            # return HttpResponse(dir_path + '.jpg')
+            photo = open(dir_path + '.jpg', 'rb')
+        else:
+            photo = file_list[0]
+
+        maxLabels = int(request_dict.get('maxLabels', 10))
+        minConfidence = float(request_dict.get('minConfidence', 30))
 
         try:
             client = boto3.client(
@@ -71,7 +105,7 @@ class TestServeView(View):
             # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rekognition.html#Rekognition.Client.detect_labels
             rekognition_res = client.detect_labels(
                 Image={
-                    'Bytes': file.read()},
+                    'Bytes': photo.read()},
                 MaxLabels=maxLabels,
                 MinConfidence=minConfidence)
             print('rekognition_res: ', rekognition_res)
@@ -79,3 +113,47 @@ class TestServeView(View):
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
+
+
+
+
+
+
+        files1 = request.FILES.get('image1')
+        files2 = request.FILES.get('image2')
+        files3 = request.FILES.get('image3')
+        files4 = request.FILES.get('image4')
+        file_list = [files1,files2,files3,files4]
+        merge = []
+        now_time = int(time.time())
+        dir_path = os.path.join(BASE_DIR,'static/', str(now_time))
+        if not os.path.exists(dir_path):
+            os.makedirs(dir_path)
+        for item in file_list:
+            if hasattr(item,'name'):
+                file_path = os.path.join(dir_path,item.name)
+                with open(file_path, 'wb') as f:
+                    for c in item.chunks():
+                        f.write(c)
+                        merge.append(file_path)
+
+        image_size = 500  # 每张小图片的大小
+        image_colnum = 2  # 合并成一张图后,一行有几个小图
+        MergePic.merge_images(dir_path, image_size, image_colnum)
+        files = open(dir_path+'.jpg','rb')
+        # return HttpResponse(files.read())
+
+
+        labels = int(request_dict.get('labels',5))
+        minConfidence = int(request_dict.get('minConfidence',99))
+        if not files:
+            return HttpResponse('请上传图片!!!!')
+        client = boto3.client('rekognition', aws_access_key_id='AKIA2E67UIMD6JD6TN3J',aws_secret_access_key='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',region_name='us-east-1')
+        # image = open('E:/photo/a615fa40b8c476bab0f6eeb332e62a5a-1000.jpg', "rb")
+        response = client.detect_labels(Image={'Bytes':files.read()},MaxLabels=labels,MinConfidence=minConfidence)
+        # for obj in response['Labels']:
+        #     exit(obj)
+        #     if obj['Name'] == 'Person':
+        #         jsonstr = json.dumps(obj)
+        return HttpResponse(json.dumps(response, ensure_ascii=False),
+                            content_type="application/json,charset=utf-8")

+ 94 - 0
Object/MergePic.py

@@ -0,0 +1,94 @@
+import os
+
+import PIL.Image as Image
+
+
+def resize_by_width(infile, image_size):
+    """按照宽度进行所需比例缩放"""
+    im = Image.open(infile)
+    (x, y) = im.size
+    lv = round(x / image_size, 2) + 0.01
+    x_s = int(x // lv)
+    y_s = int(y // lv)
+    print("x_s", x_s, y_s)
+    out = im.resize((x_s, y_s), Image.ANTIALIAS)
+    return out
+
+
+def get_new_img_xy(infile, image_size):
+    """返回一个图片的宽、高像素"""
+    im = Image.open(infile)
+    (x, y) = im.size
+    lv = round(x / image_size, 2) + 0.01
+    x_s = x // lv
+    y_s = y // lv
+    # print("x_s", x_s, y_s)
+    # out = im.resize((x_s, y_s), Image.ANTIALIAS)
+    return x_s, y_s
+
+
+# 定义图像拼接函数
+def image_compose(image_colnum, image_size, image_rownum, image_names, image_save_path, x_new, y_new):
+    to_image = Image.new('RGB', (image_colnum * x_new, image_rownum * y_new))  # 创建一个新图
+    # 循环遍历,把每张图片按顺序粘贴到对应位置上
+    total_num = 0
+    for y in range(1, image_rownum + 1):
+        for x in range(1, image_colnum + 1):
+            from_image = resize_by_width(image_names[image_colnum * (y - 1) + x - 1], image_size)
+            # from_image = Image.open(image_names[image_colnum * (y - 1) + x - 1]).resize((image_size,image_size ), Image.ANTIALIAS)
+            to_image.paste(from_image, ((x - 1) * x_new, (y - 1) * y_new))
+            total_num += 1
+            if total_num == len(image_names):
+                break
+    return to_image.save(image_save_path)  # 保存新图
+
+
+def get_image_list_fullpath(dir_path):
+    file_name_list = os.listdir(dir_path)
+    image_fullpath_list = []
+    for file_name_one in file_name_list:
+        file_one_path = os.path.join(dir_path, file_name_one)
+        if os.path.isfile(file_one_path):
+            image_fullpath_list.append(file_one_path)
+        else:
+            img_path_list = get_image_list_fullpath(file_one_path)
+            image_fullpath_list.extend(img_path_list)
+    return image_fullpath_list
+
+
+def merge_images(image_dir_path,image_size,image_colnum):
+    # 获取图片集地址下的所有图片名称
+    image_fullpath_list = get_image_list_fullpath(image_dir_path)
+    print("image_fullpath_list", len(image_fullpath_list), image_fullpath_list)
+
+    image_save_path = r'{}.jpg'.format(image_dir_path)  # 图片转换后的地址
+    print(image_save_path);
+    # image_rownum = 4  # 图片间隔,也就是合并成一张图后,一共有几行
+    image_rownum_yu = len(image_fullpath_list) % image_colnum
+    if image_rownum_yu == 0:
+        image_rownum = len(image_fullpath_list) // image_colnum
+    else:
+        image_rownum = len(image_fullpath_list) // image_colnum + 1
+
+    x_list = []
+    y_list = []
+    for img_file in image_fullpath_list:
+        img_x, img_y = get_new_img_xy(img_file, image_size)
+        x_list.append(img_x)
+        y_list.append(img_y)
+
+    print("x_list", sorted(x_list))
+    print("y_list", sorted(y_list))
+    x_new = int(x_list[len(x_list) // 5 * 4])
+    y_new = int(y_list[len(y_list) // 5 * 4])
+    print(" x_new, y_new", x_new, y_new)
+    image_compose(image_colnum, image_size, image_rownum, image_fullpath_list, image_save_path, x_new, y_new)  # 调用函数
+    # for img_file in image_fullpath_list:
+    #     resize_by_width(img_file,image_size)
+
+if __name__ == '__main__':
+
+    image_dir_path = r'E:\photo\test'  # 图片集地址
+    image_size = 500  # 每张小图片的大小
+    image_colnum = 2  # 合并成一张图后,一行有几个小图
+    merge_images(image_dir_path, image_size, image_colnum)