繁体   English   中英

Flask 错误:在服务器上找不到请求的 URL。 如果您手动输入 URL 请检查您的拼写并重试

[英]Flask error: The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again

我是 Flask 的新手,我正在创建名为 Image Processing using OpenCV 的 Flask 项目。 在这个项目中,用户可以通过上传图像来进行图像处理,它将在后端使用相应的 OpenCV function 进行转换。 主页看起来像这个主页

它由描述各种操作的可点击卡片组成,点击这些操作将指向相应的页面。但点击卡片时,我收到错误请求的 URL 在服务器上找不到。 如果您手动输入了 URL,请检查您的拼写并重试。请帮帮我

这里是项目结构项目结构

这是 routes.py 代码

    from flask import Flask,render_template,url_for
import os
from app import app
from app.forms import PhotoForm
import cv2
import numpy as np

@app.route('/')
@app.route('/options',methods=['GET','POST'])
def options():
    return render_template('options.html')

UPLOAD_FOLDER = './upload'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

@app.route('/scaling',methods=['GET','POST'])
def scaling():
    #f=request.files['file']
    #f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    #full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    #img = cv2.imread(full_filename)
    #res = cv2.resize(img,(2*width, 2*height))
    return render_template('scaling.html')

@app.route('/rotation')
def rotation():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)
    rows,cols = img.shape
    M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
    dst = cv2.warpAffine(img,M,(cols,rows))
    return render_template('rotation.html')

@app.route('/grayconversion')
def grayconversion():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)
    gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    render_template('grayconverison.html')

@app.route('/facedetection')
def facedetection():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
       res_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)    
    render_template('facedetction.html')

@app.route('/edgedetection')           
def edgedetection():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename) 
    edges = cv2.Canny(img,100,200)
    render_template('edgedetection.html')

@app.route('/cornerdetection')
def cornerdetection():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    gray = np.float32(gray)
    dst = cv2.cornerHarris(gray,2,3,0.04)

#result is dilated for marking the corners, not important
    dst = cv2.dilate(dst,None)

# Threshold for an optimal value, it may vary depending on the image.
    img[dst>0.01*dst.max()]=[0,0,255]
    render_template('cornerdetection.html')


@app.route('/linedetection')
def linedetection():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename) 
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray,50,150,apertureSize = 3)

    lines = cv2.HoughLines(edges,1,np.pi/180,200)
    for rho,theta in lines[0]:
       a = np.cos(theta)
       b = np.sin(theta)
       x0 = a*rho
       y0 = b*rho
       x1 = int(x0 + 1000*(-b))
       y1 = int(y0 + 1000*(a))
       x2 = int(x0 - 1000*(-b))
       y2 = int(y0 - 1000*(a))

    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)     
    cv2.imwrite('linedetection.jpg',img)
    render_template('linedetection.html')     

@app.route('/circledetection')
def circledetection():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)   
    img = cv2.medianBlur(img,5)
    cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

    circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                            param1=50,param2=30,minRadius=0,maxRadius=0)

    circles = np.uint16(np.around(circles))
    for i in circles[0,:]:
    # draw the outer circle
        cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
        cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
    render_template('circledetection.html')

@app.route('/imagesegmentation')
def imagesegmentation():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)   
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
    # noise removal
    kernel = np.ones((3,3),np.uint8)
    opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)

# sure background area
    sure_bg = cv2.dilate(opening,kernel,iterations=3)

# Finding sure foreground area
    dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
    ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)

# Finding unknown region
    sure_fg = np.uint8(sure_fg)
    unknown = cv2.subtract(sure_bg,sure_fg)

    # Marker labelling
    ret, markers = cv2.connectedComponents(sure_fg)

# Add one to all labels so that sure background is not 0, but 1
    markers = markers+1

# Now, mark the region of unknown with zero
    markers[unknown==255] = 0
    markers = cv2.watershed(img,markers)
    img[markers == -1] = [255,0,0]
    render_template('imagesegmentation.html')

@app.route('/erosion')
def erosion():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)   
    kernel = np.ones((5,5),np.uint8)
    erosion = cv2.erode(img,kernel,iterations = 1)
    render_template('erosion.html')

@app.route('/dilation')
def dilation():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)  
    kernel = np.ones((5,5),np.float32)/25
    dilate = cv2.dilate(img,kernel,iterations = 1)
    render_template('dilation.html')

@app.route('/blurring')
def blurring():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)   
    kernel = np.ones((5,5),np.float32)/25
    dst = cv2.filter2D(img,-1,kernel)
    render_template('blurring.html')

@app.route('/foregroundextraction')
def foregroundextraction():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)
    mask = np.zeros(img.shape[:2],np.uint8)

    bgdModel = np.zeros((1,65),np.float64)
    fgdModel = np.zeros((1,65),np.float64)

    rect = (50,50,450,290)
    cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)

    mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
    res = img*mask2[:,:,np.newaxis]   
    render_template('foregroundextraction')

@app.route('/laplacianderivative')
def laplacianderivative():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)  
    laplacian = cv2.Laplacian(img,cv2.CV_64F)
    render_template('laplacianderivative.html')


@app.route('/sobelderivative')
def sobelderivative():
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)   
    sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
    sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
    render_template('sobelderivative.html')

@app.route('/masking')
def masking(): 
    f=request.files['file']
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
    full_filename = os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
    img = cv2.imread(full_filename)                                  

if __name__== "__main__":
    app.run(debug=True)

这是卡片将指向的 html 页面之一的代码

<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content="width=device-width, initial-scale=1.0,shrink-to-fit=no">
    <meta name = "content" author = "Rigved Alankar">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <link rel = "stylesheet" type = "text/css" href = "{{url_for('static',filename='styles/style.css')}}">
    <title>Scaling</title>
</head>
<body>
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
    <nav class="navbar navbar-expand-sm bg-dark navbar-dark justify-content-center">
        <a class="navbar-brand" href="#">Image Processing using OpenCV</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>
    </nav>
    <br>
    <br>
    <div class="container">
        <div class="row">
          <div class="col-12">
              <p> Please enter the image </p> 
          </div>
        </div>  
        <form method = "POST" action="/scaling" enctype="multipart/form-data" >
              <div class="form-group">
                  <input type="file" class="form-control-file" id="exampleFormControlFile1">
              </div>
        </form> 
    </div>
    <form method='POST' action='http://localhost:5000/'>
        <div class="form-group">
            <label for="label2">Enter the amount of scaling in the x direction</label>
            <input type = "number" class = 'form-control'> 
        </div>
        <div class="form-group">
            <label for="label2">Enter the amount of scaling in the y direction</label>
            <input type = "number" class = 'form-control'> 
        </div>
    </form>
</body>
</html>

帮助将不胜感激

您必须为 method='POST' 添加一个 if 语句,如下所示:

@app.route('/scaling',methods=['GET','POST'])
def scaling():
    if method==['POST']:
        #f=request.files['file']
        #f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
        #full_filename = 
        os.path.join(app.config['UPLOAD_FOLDER'],f.filename)
        #img = cv2.imread(full_filename)
        #res = cv2.resize(img,(2*width, 2*height))
        return render_template('scaling.html')

从 forms 接收数据的所有其他路由也是如此。 或者,您可以将“POST”声明为唯一方法,这样就不需要 if 语句。

暂无
暂无

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

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