zoukankan      html  css  js  c++  java
  • 在线中文字符识别网站(前后端分离 REST)

    还是搭建单个django项目,需要把Django项目的各模块内容输入到指定的文件中

    可查看单文件Django操作

    一.搭建个文件框架

    文件框架

    二.编写settings.py文件

    import os
    # 设置项目根目录
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    # 加密签名
    SECRET_KEY = 'b!iohd&_vv@gmva5b6gq@k9t01_k^52uludvw8@h0)1fnez^8l'
    DEBUG = True  # 设置当前为调试模式
    INSTALLED_APPS = ['app'] # 添加应用
    ROOT_URLCONF = 'ocr.urls' # 设置项目路由文件urls
    

    三.编写views.py文件

    通过导入HttpResponse函数响应前端,返回内容为一个字符串

    from django.http import HttpResponse
    
    def home1(request):
        return HttpResponse("hello world 8080!")
    
    

    四.配置路由urls.py文件

    from django.urls import path
    from app.views import home1
    urlpatterns = [
        path('',home1,name='home'), # 其实一个的话,也可以不用加','这相当于个列表
    ]
    

    五.编写manage.py文件

    if __name__ == '__main__':
        import sys
        import django
        import os
        DJANGO_SETTINGS_MODULE = 'ocr.settins'
        # 设置环境变量
        os.environ.setdefault('DJANGO_SETTINGS_MODULE','ocr.settings')
        django.setup()
        from django.core.management import execute_from_command_line
        execute_from_command_line(sys.argv)
    
    

    完成了大致的配置

    前端开发

    前端的所有开发文件全部放置在frontend文件夹中,style.css文件是为本实例的个性话样式定制文件使用。
    依然采用Bootstrap框架设计页面

    1.页面头部引入必要的CSS和JS文件

    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="css/bootstrap.min.css">
        <link rel="stylesheet" href="css/style.css">
        <script src="js/jquery.min.js"></script>
        <script src="js/bootstrap.min.js"></script>
        <title>在线中文字符识别</title>
    </head>
    

    2.页面body部分采用Bootstrap栅格布局,分为左右2个部分,各占6个栅格,左6上传图片处,右6用来显示结果

     <!--bootstrap栅格结构进行布局;左6上传图片处,右6用来显示结果-->
        <div class="container">
            <!--标题-->
            <div class="row">
                <div class="col-lg-12">
                    <p class="text-center h1">
                        在线中文字符识别
                    </p>
                </div>
            </div>
            <div class="row">
                <div class="col-lg-12">
                    <p class="text-center h3">
                        照片的尺寸窄些,效果好
                    </p>
                </div>
            </div>
            <!--分隔符-->
            <div class="hr">
                <hr> <!--可省略结束符 /hr-->
            </div>
            <!--主体内容-->
            <div class="row">
                <br>
                <!--图片上传-->
                <div class="col-md-6">
                    <img src="img/sample.jpg" alt="请上传图片" class="img-responsive" id="photoIn">
                    <!--id 和 class  有顺序关序么,在标签中==>突然的想法-->
                    <input type="file" name="photo" id="photo"/><!--单结束符标签么-->
                </div>
                <!--运行结果-->
                <div class="col-md-6">
                    <div class="col-md-12">
                        <textarea name="result" id="output" disabled class="form-control" rows="5"></textarea>
                    </div>
                    <br>
                    <div class="col-md-12">
                        <p class="text-center h4">识别结果</p>
                    </div>
                </div>       
            </div>
            <br>
            <!--下一行识别按钮-->
            <div class="row">
                <div class="text-center">
                    <button type="button" id="recognition" class="btn btn-primary">
                        识别
                    </button>
                </div>
            </div>
        </div>
    

    3.在style.css文件中添加对应的样式设计

    /*添加分割线对应的样式*/
    
    div.hr{
        height: 3px;
        background:red;
    }
    
    div.hr hr{
        display: none;
    }
    

    图像上传及时浏览功能(重点)

    小技巧:关于script放的位置:页面实现效果的脚本放在body中,与用户交互的脚本放在body外。这样好

    <script>
        $(function(){//input中的photo提取到图片数据;img中的photoIn返回数据;标签的话就这2个
            $('#photo').on('change', function(){ //.om('change',function()不理解)
                var r = new FileReader(); //定义r变量,FileReader()是不是特殊的数据类型
                f = document.getElementById('photo').files[0]; //// 把图片数据封装到f变量中,'.files'是啥呢
                // r.readAsArrayBuffer(f);//readAsArrayBuffer作用是啥
                r.readAsDataURL(f);
                r.onload = function(e){ //这段函数不理解,这里的e哪来的
                    document.getElementById('photoIn').src = this.result;
                };
            });
        });
    </script>
    

    Ajax完成图像像后端的传输以及显示从后端返回的结果(不懂)

    <script>
        // 图像发送至后台服务器进行识别
        $('#recognition').click(function(){
            formdata = new FormData(); // 定义formdata变量 Formdata是不是特殊的数据类型
            var file = $('#photo')[0].files[0]; // 把图片数据用file变量表示
            formdata.append('image',file); // 把图片数据封装到formdata变量中
            $.ajax({
                url:'/ocr/', // 发送地址是ocr url地址写错/ocr 导致Not Found: /ocr;地址后还要加/
                type:'POST', // 发送方式是post
                data:formdata, //发送的数据是formdata
                dataType:'json', // 数据类型是json
                processData:false, 
                contentType:false,
                success:ShowResult //收到结果后,执行ShowResult函数,将输出文本的值改为识别到的文字信息
            })
    
        })
        
    </script>
    <!--返回结果显示-->
    <script>
        function ShowResult(data){
            output.value = data['output'];
        }
    </script>
    
    

    后端开发

    配置静态资源文件

    将所有的静态资源文件按照文件夹路径创建对应的视图处理函数

    以文件读取方式获取文件内容并通过HttpResponse返回

    我并没有用django模板创建文件,这个只是我搭建罢了

    调用django属性,创建静态资源路径

    def read_css(request,filename):
        with open('frontend/css/{}'.format(filename),'rb') as f:
            css_content = f.read()
            print('css文件')
            return HttpResponse(content=css_content,content_type = 'text/css')
    
    def read_js(request,filename):
        with open('frontend/js/{}'.format(filename),'rb') as f:
            js_content = f.read()
            print('js文件')
            return HttpResponse(content=js_content,content_type = 'application/Jacascript')
    def read_img(request,filename):
        with open('frontend/img/{}'.format(filename),'rb') as f:
            img_content = f.read()
            print('img文件')
            return HttpResponse(content=img_content,content_type = 'image/jpeg')
    

    配置静态资源的访问路由

      path('css/<str:filename>',read_css,name='read_css'),
        path('js/<str:filename>',read_js,name='read_js'),
        path('img/<str:filename>',read_img,name='read_img'),
    

    重写编写views.py文件中的home1函数

    from django.http import HttpResponse
    
    def home1(request):
    #     return HttpResponse("hello world 8080!")
        with open('frontend/index.html','rb') as f:
            html = f.read()
            return HttpResponse(html)
    
    

    安装tesseract过程

    Tesseract的下载网址。根据系统版本进行选择,下载完成后双击进入安装界面,展开additional language data,勾选Arabic和Chinese simplified复选框使得能够同时支持阿拉伯数字和简体中文字符的识别。
    为了能够在python中使用该引擎库,需要安装对应的python库

    pip install pytesseract
    

    然后修改pytesseract库文件,进入pytesseract.py文件中,修改tesseract_cmd字段的值,将tesseractOCR的安装目录填入其中

    tesseract_cmd = r'<tesseractOCR的安装目录>'	esseract.exe
    

    开发文字识别后端处理模块(一点都不懂)

    import numpy as np # numpy不会有,至少要会用来图像分割
    import urllib # 也不熟,很少用他做爬虫
    import json # json数据返回的包
    import cv2 # 要学的,重点,但我不会
    import pytesseract # 文字识别包
    from PIL import Image # 图像处理的
    import os
    from django.views.decorators.csrf import csrf_exempt # 防止啥csrf_什么的攻击
    from django.http import JsonResponse
    
    def read_image(stream=None):
        data_temp = stream.read()
        image = np.asarray(bytearray(data_temp),dtype = 'uint8')
        image = cv2.imdecode(image,cv2.IMREAD_COLOR) # cv2处理不知
        return image
    
    @csrf_exempt # 用于规避跨站点请求攻击
    def ocrDetect(request):
        result = {'code':None}
        if request.method == 'POST':
            img = read_image(stream = request.FILES["image"])
            # OpenCV转PIL
            # frommarry写错他显示白色,就代表他不是函数;fromarray才是
            # COLOR_BAYER_BG2BGR写错这是编辑器快速提示时没看直接选的
            img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
            # 执行识别
            code = pytesseract.image_to_string(img,lang='chi_sim')
            result.update({"output":code}) # ()内加了引号,字典外加引号,这错误哎;这里字典只要值加"",键不需要
        return JsonResponse(result)
    

    最后在urls.py文件中urlpatterns中添加对应的路由(这里我也不明白)

      path('ocr/',ocrDetect,name='ocrDetect'),
    
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    五、excel末尾补0和开头补0
    MYSQL查询前30条数据
    MYSQL数据库从A表把数据插入B表
    测试用例大全
    EXTJS 5.0 资料
    fs event_socket
    centos 编译swoole
    Valgrind简单用法
    linux 大并发下 内核优化
    FS拓展设置
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15116328.html
Copyright © 2011-2022 走看看