[英]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.