简体   繁体   English

如何使用 Django 中的 FileSystemStorage 上传由 OpenCV 修改的图像文件?

[英]How to upload an Image File modified by OpenCV using FileSystemStorage in Django?

I am taking an uploaded image from the user and then sending it to a YOLO model which then returns me an image.我正在从用户那里获取上传的图片,然后将其发送到 YOLO model,然后它会返回给我一张图片。

I want to store that returned image in my Local Directory and then display it on the user interface.我想将返回的图像存储在我的本地目录中,然后将其显示在用户界面上。

This is the Code of views.py that takes in an image and sends it to the Yolo Model,这是views.py的代码,它接收图像并将其发送到Yolo Model,

def predictImage(request):
    # print(request)
    # print(request.POST.dict())
    fileObj = request.FILES['filePath']
    fs = FileSystemStorage()
    filePathName = fs.save(fileObj.name, fileObj)
    filePathName = fs.url(filePathName)
    testimage = '.'+filePathName
    # img = image.load_img(testimage, target_size=(img_height, img_width))
    img = detect_image(testimage)
    filePathName = fs.save(fileObj.name + "_result", img) # -> HERE IS THE ERROR
    filePathName = fs.url(filePathName)

This is the function of YOLO Model that uses OpenCV to read the image (Image is sent as argument to the function) and then returns that image,这是 YOLO Model 的 function 使用 OpenCV 读取图像(图像作为参数发送给函数)然后返回该图像,

import numpy as np
import cv2

def detect_image(img_path):

    confidenceThreshold = 0.5
    NMSThreshold = 0.3

    modelConfiguration = 'cfg/yolov3.cfg'
    modelWeights = 'yolov3.weights'

    labelsPath = 'coco.names'
    labels = open(labelsPath).read().strip().split('\n')

    np.random.seed(10)
    COLORS = np.random.randint(0, 255, size=(len(labels), 3), dtype="uint8")

    net = cv2.dnn.readNetFromDarknet(modelConfiguration, modelWeights)

    image = cv2.imread(img_path)
    (H, W) = image.shape[:2]

    #Determine output layer names
    layerName = net.getLayerNames()
    layerName = [layerName[i - 1] for i in net.getUnconnectedOutLayers()]

    blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416), swapRB = True, crop = False)
    net.setInput(blob)
    layersOutputs = net.forward(layerName)

    boxes = []
    confidences = []
    classIDs = []

    for output in layersOutputs:
        for detection in output:
            scores = detection[5:]
            classID = np.argmax(scores)
            confidence = scores[classID]
            if confidence > confidenceThreshold:
                box = detection[0:4] * np.array([W, H, W, H])
                (centerX, centerY,  width, height) = box.astype('int')
                x = int(centerX - (width/2))
                y = int(centerY - (height/2))

                boxes.append([x, y, int(width), int(height)])
                confidences.append(float(confidence))
                classIDs.append(classID)

    #Apply Non Maxima Suppression
    detectionNMS = cv2.dnn.NMSBoxes(boxes, confidences, confidenceThreshold, NMSThreshold)

    if(len(detectionNMS) > 0):
        for i in detectionNMS.flatten():
            (x, y) = (boxes[i][0], boxes[i][1])
            (w, h) = (boxes[i][2], boxes[i][3])

            color = [int(c) for c in COLORS[classIDs[i]]]
            cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
            text = '{}: {:.4f}'.format(labels[classIDs[i]], confidences[i])
            cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
    
    return image 
    
    #cv2.imshow('Image', image)
    #cv2.waitKey(0)

On this line,在这条线上,

filePathName = fs.save(fileObj.name + "_result", img)

I am getting this following error,我收到以下错误,

'numpy.ndarray' object has no attribute 'read'

I am not sure how can I resolve this.我不确定如何解决这个问题。 I tried searching how can I store OpenCV Modified file usnig FileSystemStorage but found nothing of help.我尝试搜索如何存储 OpenCV 修改文件 usnig FileSystemStorage 但没有找到任何帮助。 Can anyone help me regarding this?任何人都可以帮我解决这个问题吗?

You can use the imwrite function of cv2 library to store your files in the local directory, ie,您可以使用imwrite库的 imwrite cv2将文件存储在本地目录中,即

In your case, simply do this:在您的情况下,只需执行以下操作:

img = detect_image(testimage)
cv2.imwrite(fileObj.name+"_result.jpg", img=img) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM