python django工程上传一张照片调用python方法时报错,请问如何处理?
PHP中文网
PHP中文网 2017-04-18 10:28:39
[Python讨论组]

python django工程上传一张照片调用python方法时报错,请问如何处理?
工程目录为:

代码为:
urls.py代码为:

# -*- coding:utf-8 -*-
"""face URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from jango import views

urlpatterns = [#路由
    url(r'^admin/', admin.site.urls),
    url(r'^$',views.index)
]

html代码为:



    
        
        
        
        

        

    



上传照片

图片

人脸识别扫描结果:

html代码对应的页面效果:

views.py代码为:

# -*- coding:utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
import time
import findface

def index(request):
    method = request.method
    if method =='POST':
        if request.POST.get('path'):
            # faceinfo = face_api.getPicInfo('http://img.sccnn.com/bimg/337/47838.jpg')
            # return HttpResponse(faceinfo)
            pass
        else:
            img = request.FILES.get('file')#获取用户上传的文件(图片)
            if not img:#img没有值
                return HttpResponse(u'上传失败')
            a = time.time()
            path = 'static/faceimg/%s.jpg' %a
            with open('jango/'+path,'wb') as fn:#w写字符串,wb写文件
                fn.write(img.read())
                print str(a)+".jpg"
                b = str(a)+".jpg"
            findface.find(b)
            return render(request,'face.html',context={'imgurl':path})
    else:
        return render(request,'face.html',context={'imgurl':'http://img.sccnn.com/bimg/337/47838.jpg'})#首页照片的默认值,如果不需要则第三个参数可以不写
        #return render(request,'face.html')#首页照片的默认值,如果不需要则第三个参数可以不写

findface.py代码为:

# -*- coding: UTF-8 -*-
import numpy as np
import time
import cv2
def find(img_pic):
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    face_cascade.load(r'E:\OpenCV 2.4.9\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml')#不加这一行报错
    eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
    eye_cascade.load(r'E:\OpenCV 2.4.9\opencv\sources\data\haarcascades\haarcascade_eye.xml')#不加这一行报错

    img = cv2.imread(img_pic)
    path = 'static/faceimg/%s.jpg' % img_pic
    with open('jango/' + path, 'wb') as fn:  # w写字符串,wb写文件
        fn.write(img.read())
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 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]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

在地址栏输入:http://localhost:8000
点击“上传照片”,想要传递一张照片guofu.jpg,并调用findface.py的find方法显示人的面部,并用方框将人的面部括起来,但是出现下图的错误,请问如何解决?

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
大家讲道理
    face_cascade.load(r'E:\OpenCV 2.4.9\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml')#不加这一行报错
    eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
    eye_cascade.load(r'E:\OpenCV 2.4.9\opencv\sources\data\haarcascades\haarcascade_eye.xml')
天蓬老师

你的路径调用出错,导致opencv无法正确的读取图像文件,这是你提问的答案。
在views.py内将b = str(a)+".jpg"改为b = 'jango/'+path
将facefind的path变量改为

import cv2
def find(img_pic):
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    face_cascade.load('/usr/local/Cellar/opencv3/HEAD-4a095e4_4/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')#这是mac下的路径,改成你自己的
    eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
    eye_cascade.load('/usr/local/Cellar/opencv3/HEAD-4a095e4_4/share/OpenCV/haarcascades/haarcascade_eye.xml')#不加这一行报错

    img = cv2.imread(img_pic)
    path = img_pic

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 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]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
    cv2.imwrite(path,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

你只是把opencv文档上的东西直接复制下来了,不理解的话没什么用。这只是改了其中的一个地方,你的程序错误很多。
第一、你把图像上传和处理的函数写在一个方法内,这时候没法知道图像什么时候处理好,你需要把图像处理函数分开写或者使用多线程的方法进行改写
第二、Django在使用ajax方法进行post操作时需要进行csrf验证,如果没有程序是无法运行的
第三、你的js写的有问题,只要加载页面就执行post操作,你自己再看一下
还有一些细节方面的东西,多注意一下

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号