#python #python_3x #opencv
Пытаюсь создать функцию, которая будет возвращать обрезанное изображение, если на нем есть лицо: def upload_image(request): data = {"success": False} if request.method == 'POST': form = forms.FileUploadForm(data=request.POST, files=request.FILES) if form.is_valid(): image = grab_image(request.FILES['photo']) #fs = FileSystemStorage(); #fs.save('d', image) #path_to_image = settings.MEDIA_ROOT + '\\' + image.name #uploaded_image = im.upload_image(path_to_image, title=image.name) #uploadet_link = uploaded_image.link #fs.delete(image.name) # convert the image to grayscale, load the face cascade detector, # and detect faces in the image image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) detector = cv2.CascadeClassifier(FACE_DETECTOR_PATH) rects = detector.detectMultiScale(image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE) image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)#попытка сделать его цветым # construct a list of bounding boxes from the detection rects = [(int(x), int(y), int(x + w), int(y + h)) for (x, y, w, h) in rects] # update the data dictionary with the faces detected data.update({"num_faces": len(rects), "faces": rects, "success": True}) if(len(rects) > 1): pass elif(len(rects) < 1): pass else: rect_list = list(map(int,rects[0])) crop_img = image[rect_list[1]:rect_list[1] + rect_list[3], rect_list[0]:rect_list[0] + rect_list[2]]#обрезка изображения по лицу print(type(crop_img)) normal_image = Image.fromarray(crop_img).convert('RGB')#попытка сделать его цветым №2 print(type(normal_image)) normal_image.save( settings.MEDIA_ROOT + '\\' + str(uuid.uuid4()) + '.jpg') #fs = FileSystemStorage(); #fs.save(str(uuid.uuid4()), normal_image) crop_image() else: print(form.errors) return JsonResponse(data) def grab_image(stream): data = stream.read() # convert the image to a NumPy array and then read it into # OpenCV format image = np.asarray(bytearray(data), dtype="uint8") image = cv2.imdecode(image, cv2.IMREAD_COLOR) return image Вот какое изображение я отправляю - изображение на вход и вот, что получаю: получаю на выходе. Метод для обрезки нашел здесь. Но он как-то не правильно обрезает. Слишком большая ширина. Может проблема в самом определении лица? Пробовал и другие фотографии - тоже самое, в ширину разносит. Еще изображение возвращается в черно-белом, хотя пытаюсь его окрасить: image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)#попытка сделать его цветым normal_image = Image.fromarray(crop_img).convert('RGB')#попытка сделать его цветым №2
Ответы
Ответ 1
Попробуйте так: FACE_DETECTOR_PATH=r'...\Library\etc\haarcascades\haarcascade_frontalface_default.xml' def crop_face(img, scaleFactor=1.001, face_detector_path=FACE_DETECTOR_PATH): face_cascade = cv2.CascadeClassifier(FACE_DETECTOR_PATH) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor, 5) for (x,y,w,h) in faces: #img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) #roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] return roi_color cropped = crop_face(img, scaleFactor=1.01) cv2.imshow('1', cropped) cv2.imwrite(r'с:/temp/res.png', cropped)
Комментариев нет:
Отправить комментарий