如何将经过cv2处理的图像保存到Django模型中?

5

我使用opencv裁剪图像,并希望将它们保存到模型中,我直接加载文件到computeLogoFromMemoryFILE进行处理,那么如何将这个图像保存到TempImage模型中?

views.py:

form = myForm(request.FILES)
if form.is_valid():
    cropped_image = computeLogoFromMemoryFILE(request.FILES.get('logo'))
    # ...
    temp_image = TempImage.objects.create(image=?)

cv2:

# (np == numpy)
def computeLogoFromMemoryFILE(logo):
    logo.seek(0)
    image = cv2.imdecode(np.fromstring(logo.read(), np.uint8), cv2.IMREAD_UNCHANGED)
    cropped_img = crop_image(image)

cropped_image变量是一个opencv数组:

array([[ 52, 218, 255],
    [ 52, 218, 255],
    [ 52, 218, 255],
    ...,
    [ 52, 218, 255],
    [ 52, 218, 255],
    [ 52, 218, 255]]...], dtype=uint8)

我该如何继续操作?


如果图像很大,您应该优先上传它并仅在数据库中存储链接。如果它相当小,您可以将np数组转换为字符串并存储它-在您想要读取它时将其转换回来。我没有太多使用Django的经验,但我猜您也可以将图像存储为BLOB。 - Zeokav
@Zeokav 当然只会存储链接,因为图像位于AWS上,但我不明白如何将opencv数组转换为新的dbb记录。这些图像也相当小(小于1MB)。 - Hiroyuki Nuri
我猜你应该很熟悉在AWS(s3?)中存储和访问对象,因为你说图片是存储在AWS上的。通常情况下,你需要将图像转换为字节字符串,上传此文件对象到AWS,然后将键(通常是文件名)存储在数据库中,因为你将使用此键来访问文件。我建议你更新你的问题,因为这实际上是一个关于如何上传文件到AWS的问题。Django部分基本上是最简单的事情。 - Borut
2个回答

4
每当您需要处理上传的文件、类似图片并将其设置为模型字段时,在Django中,您必须使用 Django File 类。您可以使用以下代码执行此操作:
from django.core.files import File

def my_view(request):
    ...
    form = myForm(request.FILES)

    if form.is_valid():
        temp_image = myForm.save(commit=False)
        cropped_image = computeLogoFromMemoryFILE(request.FILES.get('logo'))
        with open('path/of/cropped_image.png', 'rb') as destination_file:
            temp_image.image.save('dest.png', File(destination_file), save=False)
        temp_image.save()
    ...

注意: 将设置文件添加到模型字段后,此文件会被克隆到MEDIA_ROOT上。最好删除旧图像或使用BytesIO代替使用文件存储处理过的图像。


@Lindow,请给我的答案提供反馈。 - M.javid

4

模型:

class ImageModel(models.Model):
    image = models.FileField(upload_to='images/')

视图:

from django.core.files.base import ContentFile

def index(request):

    ...
    ret, buf = cv2.imencode('.jpg', cropped_image) # cropped_image: cv2 / np array
    content = ContentFile(buf.tobytes())

    img_model = ImageModel()
    img_model.image.save('output.jpg', content)

ContentFile 支持字节和字符串类型:https://docs.djangoproject.com/en/3.1/ref/files/file/#django.core.files.base.ContentFile


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接