Tesseract识别图片提取文字&字库训练-程序员宅基地

技术标签: git  java  runtime  

   文中测试了3.0和4.0两个版本。发现3.0识别效率不准确,需要训练词库。4.0识别效率就比较高了,而且支持结果生成pdf、txt等格式。所以推荐使用4.0版本。

  这个工具可以用在爬虫的时候获取验证码进行识别且自动输入验证码的功能。

  git地址:https://github.com/tesseract-ocr/tesseract

  下载地址:https://digi.bib.uni-mannheim.de/tesseract/

1.下载安装

  我下载的是 3.05.01,自带了中文词库。

下载完成后目录结构:

 

2.测试识别

0.准备一张文字图片

1.添加环境变量到path中,可以直接使用tesseract命令。检查是否配置成功

C:\Users\Administrator\Desktop\新建文件夹>tesseract -v
tesseract 3.05.01
 leptonica-1.74.1
  libgif 4.1.6(?) : libjpeg 8d (libjpeg-turbo 1.5.0) : libpng 1.6.20 : libtiff 4.0.6 : zlib 1.2.8 : libwebp 0.4.3 : libopenjp2 2.1.0

 

查看命令可以携带的参数:

PS C:\Users\Administrator\Desktop\新建文件夹> tesseract
Usage:
  E:\tesseract\Tesseract-OCR\tesseract.exe --help | --help-psm | --help-oem | --version
  E:\tesseract\Tesseract-OCR\tesseract.exe --list-langs [--tessdata-dir PATH]
  E:\tesseract\Tesseract-OCR\tesseract.exe --print-parameters [options...] [configfile...]
  E:\tesseract\Tesseract-OCR\tesseract.exe imagename|stdin outputbase|stdout [options...] [configfile...]

OCR options:
  --tessdata-dir PATH   Specify the location of tessdata path.
  --user-words PATH     Specify the location of user words file.
  --user-patterns PATH  Specify the location of user patterns file.
  -l LANG[+LANG]        Specify language(s) used for OCR.
  -c VAR=VALUE          Set value for config variables.
                        Multiple -c arguments are allowed.
  --psm NUM             Specify page segmentation mode.
  --oem NUM             Specify OCR Engine mode.
NOTE: These options must occur before any configfile.

Page segmentation modes:
  0    Orientation and script detection (OSD) only.
  1    Automatic page segmentation with OSD.
  2    Automatic page segmentation, but no OSD, or OCR.
  3    Fully automatic page segmentation, but no OSD. (Default)
  4    Assume a single column of text of variable sizes.
  5    Assume a single uniform block of vertically aligned text.
  6    Assume a single uniform block of text.
  7    Treat the image as a single text line.
  8    Treat the image as a single word.
  9    Treat the image as a single word in a circle.
 10    Treat the image as a single character.
 11    Sparse text. Find as much text as possible in no particular order.
 12    Sparse text with OSD.
 13    Raw line. Treat the image as a single text line,
                        bypassing hacks that are Tesseract-specific.
OCR Engine modes:
  0    Original Tesseract only.
  1    Cube only.
  2    Tesseract + cube.
  3    Default, based on what is available.

Single options:
  -h, --help            Show this help message.
  --help-psm            Show page segmentation modes.
  --help-oem            Show OCR Engine modes.
  -v, --version         Show version information.
  --list-langs          List available languages for tesseract engine.
  --print-parameters    Print tesseract parameters to stdout.

 

 2.进入cmd,进入到要识别的图片的路径下。

C:\Users\Administrator\Desktop\新建文件夹>tesseract ./1.jpg re
Error opening data file \tesseract\Tesseract-OCR\tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!
Could not initialize tesseract.

 

发现报错没有语言,解决办法: 将  tesseract 安装目录下的  tessdata 文件夹配置到环境变量  TESSDATA_PREFIX  

C:\Users\Administrator>set TESSDATA_PREFIX
TESSDATA_PREFIX=E:\tesseract\Tesseract-OCR\tessdata

3.再次测试

C:\Users\Administrator\Desktop\新建文件夹>tesseract ./1.png re
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

 

   会生成一个re.txt文件,内容如下:(发现中文乱码)

 4.解决中文乱码问题:加 -l 参数指定语言即可

(1)查看支持的语言

C:\Users\Administrator\Desktop\新建文件夹>tesseract --list-langs
List of available languages (107):
afr
amh
ara
。。。

 

(2)使用  chi_sim 识别图片

C:\Users\Administrator\Desktop\新建文件夹>tesseract -l chi_sim ./1.png re
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

 

 3.测试复杂的中文识别---词库训练

 1.原来图片如下

 

 

2. 识别之后的内容如下

 

3.解决上面的问题---利用jTessBoxEditor工具进行Tesseract3.02.02样本训练

  此工具基于java运行,所以需要安装java环境。

1.下载   jTessBoxEditor :http://tenet.dl.sourceforge.net/project/vietocr/jTessBoxEditor/jTessBoxEditor-1.5.zip

2.解压运行

$ java -jar jTessBoxEditor.jar

 

 

3. 将上面的图片转换成tif格式,用于后面生成box文件。可以通过画图,然后另存为tif即可

tif文面命名格式[lang].[fontname].exp[num].tif
lang是语言 fontname是字体 
比如我们要训练自定义字库 mylan 字体名normal
那么我们把图片文件重命名 mylan.normal.exp0.jpg在转tif。(画图工具中另存为就可以)

 

4.生成box文件。

tesseract mylan.normal.exp0.jpg mylan.normal.exp0 -l chi_sim batch.nochop makebox

 

box文件和对应的tif一定要在相同的目录下,不然后面打不开。会生产一个box文件。

 

 

5.打开jTessBoxEditor矫正错误并训练

 打开train.bat

 

 找到tif图,打开,并校正。(校正完保存即可)

 

 6、训练。

(1) 只要在命令行输入命令即可。(执行第一条命令会生产.tr文件,也可以先执行一次然后删掉tr测试是否可以训练)

tesseract  mylan.normal.exp0.jpg mylan.normal.exp0  nobatch box.train


unicharset_extractor mylan.normal.exp0.box

或者输入两个合并执行的命令:

tesseract  mylan.normal.exp0.jpg mylan.normal.exp0  nobatch box.train && unicharset_extractor mylan.normal.exp0.box

 

 如下证明全部识别完毕:

 

(2)新建一个font_properties文件

里面内容写入 normal 0 0 0 0 0 表示默认普通字体 (要求normal与上面的字体名称必须一致),下面是命令直接重定向(注意重定向>和>>的区别是>是覆盖模式,>>是追加模式):

echo normal 0 0 0 0 0 >> font_properties

 

(3)继续敲命令:

shapeclustering -F font_properties -U unicharset mylan.normal.exp0.tr

mftraining -F font_properties -U unicharset -O unicharset mylan.normal.exp0.tr

cntraining mylan.normal.exp0.tr

或者一次性执行下面命令:

shapeclustering -F font_properties -U unicharset mylan.normal.exp0.tr && mftraining -F font_properties -U unicharset -O unicharset mylan.normal.exp0.tr && cntraining mylan.normal.exp0.tr

 

最后会生成五个文件,把目录下的unicharset、inttemp、pffmtable、shapetable、normproto这五个文件前面都加上normal.

如图:

或者执行如下命令进行重命名:

mv ./unicharset ./normal.unicharset && mv ./inttemp ./normal.inttemp && mv ./pffmtable ./normal.pffmtable && mv ./shapetable ./normal.shapetable && mv ./normproto ./normal.normproto

 

(4)命令行输入,合并五个文件:

combine_tessdata normal.

得到训练好的字库。

 

(5)把 normal.traineddata 复制到Tesseract-OCR 安装目录下的tessdata文件夹中

或者执行以下命令即可:( TESSDATA_PREFIX 是配置的环境变量)

mv ./normal.traineddata $TESSDATA_PREFIX

或者执行复制命令:

cp ./normal.traineddata $TESSDATA_PREFIX

 

 7.测试:

识别命令:(可以使用两种语言,也可以使用一种语言)

Administrator@MicroWin10-1535 MINGW64 ~/Desktop/新建文件夹
$ tesseract mylan.normal.exp0.jpg result -l normal
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

Administrator@MicroWin10-1535 MINGW64 ~/Desktop/新建文件夹
$ tesseract mylan.normal.exp0.jpg result2 -l normal+chi_sim
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

 

结果:(上面的   result   是指定生成的txt文件的前缀   )

 

补充:用notepad++打开之后会发现有换行:

 

  这个需要大量的训练词库。不知道是否有更好的解决办法。

 

补充:一个Java程序调用runtime执行本地命令,并读取生成的文件内容:

package cn.xm.exam.test;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;
import org.apache.xmlbeans.impl.common.IOUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ibm.wsdl.util.IOUtils;

@SuppressWarnings("all")
public class PlainTest {
    private static final Logger logger = LoggerFactory.getLogger(Test.class);

    public static void main(String[] args) throws IOException {
        // 执行命令生成文件
        String cmd = "E:/tesseract/Tesseract-OCR/tesseract.exe G://test.jpg G://tmp -l normal+chi_sim";
        boolean exec = exec(cmd);
        if (exec) {
            String readFileToString = FileUtils.readFileToString(new File("G://tmp.txt"));
            System.out.println(readFileToString);
        }
    }

    public static boolean exec(String command) {
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        try {
            logger.debug("exec cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
            InputStream errorStream = process.getErrorStream();
            InputStream inputStream = process.getInputStream();
        } catch (IOException e) {
            logger.error(" exec {} error", command, e);
            return false;
        }

        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  exec {}", command, e);
            return false;
        }

        if (exitStatus != 0) {
            logger.error("exec cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("exec cmd exitStatus {}", exitStatus);
        }

        process.destroy(); // 销毁子进程
        process = null;

        return true;
    }
}

结果:(会将换行也读取出来)

1 23456
这是一告测试中文
不能告诉@154856.text
电话:1 8434391 711

 

=====下面研究 Tesseract  4.0版本的使用(推荐使用这个版本)=========

  官方对  Tesseract4.0 版本做了很多的改进,而且自带的语言库也增加了很多。下面研究在4.0版本的识别。经过研究,4.0版本是可以直接拿来就用的,都不用训练词。识别为pdf的准确率更加高,所以在实际中可以识别为pdf然后用apache-tika提取pdf的内容。这样识别率更加的高效。

1. 下载安装

2.修改环境变量为最新的4.0版本并测试

$ tesseract --version
tesseract v4.0.0.20181030
 leptonica-1.76.0
  libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.5.3) : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.2.0

 

3.接下来还是对上面的带中文的进行识别

tesseract ./1.jpg result -l chi_sim

 

结果:(识别率已经非常准确了)

 

 4.测试将识别结果直接提取为字符串、存储为pdf(双层pdf)或者xml

(1)直接提取为文本

$ tesseract ./1.jpg stdout -l chi_sim
123456
这是一个测试中文

不能告诉@154856 .text
电话:18434391711

 

(2)提取为pdf

   在4.0之后可以自动将识别结果提取为pdf\txt\xml等格式的数据。

Administrator@MicroWin10-1535 MINGW64 ~/Desktop/新建文件夹
$ tesseract ./1.jpg result -l chi_sim pdf
Tesseract Open Source OCR Engine v4.0.0.20181030 with Leptonica

 结果:

(3)当然可以一次性提取为多个文件,只需要在后面空格分割就可以了

tesseract ./0101.jpg result -l chi_sim pdf txt

 

结果会生成三个文件

 

5.测试识别复杂的中文图片

图片内容如下:

(1)直接提取内容到输出控制台

$ tesseract ./0101.jpg stdout -l chi_sim


一个车者对禅师说: “我放不下一-些事放不下一些人。”

禅师说没有什么东西是真正放不下的。苦者说: 可我就信信放不下.

禅师递给他一个水杯然后就入里面侠     -直例到水溢出来。贡者被通到马_上松开了手,水杯掉在
地上摔坏了。

禅师说:其实,这个世界_上没有什么事是放不下的,痛了,你自然就会放下

土者说到“我能换个水杯吗?

禅师微微一笑道:“可以”他从包里拿出一一个水杯 ,说到再试试吧 , 禅师又往水杯里倒水,水溢出
来 , 这次他没有放手

祥岳问道:“不汤吗”?苦者说“和”

禅师又问“为何不放手?”葫者说道“这水杯是她送的。禅师回头叹“番狗是真的牛通

 

 

(2)查看提取tx和pdf的效率

$ tesseract ./0101.jpg result -l chi_sim pdf txt

 

txt和控制台的结果一样:

 

pdf识别结果更加准确:(接近百分之百)

 

   经过上面的实验发现啊,pdf的识别是识别的双层pdf,我自己的一种思路就是:将识别结果存到pdf,然后用ApacheTika提取pdf的内容,这样识别效率应该会更加准确。

 

6. java中调用runtime获取识别结果和提取为pdf之后用ApacheTika提取pdf内容

(1)读取内容到字符串中

package zd.dms.utils.ebuy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.tika.exception.TikaException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;

@SuppressWarnings("all")
public class PlainTest {
    private static final Logger logger = LoggerFactory.getLogger(PlainTest.class);

    public static void main(String[] args) throws IOException, SAXException, TikaException {
        // 执行命令生成文件
        String cmd = "E:/tesseract4/Tesseract-OCR/tesseract.exe G://0101.jpg stdout -l chi_sim";
        boolean exec = exec(cmd);
    }

    public static boolean exec(String command) {
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        String result = "";
        try {
            logger.debug("exec cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
            InputStream errorStream = process.getErrorStream();

            // 获取其正常的输出流
            InputStream inputStream = process.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader br = new BufferedReader(inputStreamReader);
            String line = null;
            while ((line = br.readLine()) != null) {
                result += line;
            }

        } catch (IOException e) {
            logger.error(" exec {} error", command, e);
            return false;
        }

        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  exec {}", command, e);
            return false;
        }

        if (exitStatus != 0) {
            logger.error("exec cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("exec cmd exitStatus {}", exitStatus);
        }

        process.destroy(); // 销毁子进程
        process = null;

        // result就是获取到的结果
        System.out.println(result);
        return true;
    }
}

结果:

  一个车者对禅师说: “我放不下一-些事放不下一些人。”禅师说没有什么东西是真正放不下的。苦者说: 可我就信信放不下.禅师递给他一个水杯然后就入里面侠     -直例到水溢出来。贡者被通到马_上松开了手,水杯掉在地上摔坏了。禅师说:其实,这个世界_上没有什么事是放不下的,痛了,你自然就会放下土者说到“我能换个水杯吗?禅师微微一笑道:“可以”他从包里拿出一一个水杯 ,说到再试试吧 , 禅师又往水杯里倒水,水溢出来 , 这次他没有放手祥岳问道:“不汤吗”?苦者说“和”禅师又问“为何不放手?”葫者说道“这水杯是她送的。禅师回头叹“番狗是真的牛通     

 

(2)读取内容到pdf中然后tika读取pdf

package zd.dms.utils.ebuy;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.pdf.PDFParser;
import org.apache.tika.sax.BodyContentHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;

@SuppressWarnings("all")
public class PlainTest {
    private static final Logger logger = LoggerFactory.getLogger(PlainTest.class);

    public static void main(String[] args) throws IOException, SAXException, TikaException {
        // 执行命令生成文件
        String cmd = "E:/tesseract4/Tesseract-OCR/tesseract.exe G://0101.jpg G://result -l chi_sim pdf";
        boolean exec = exec(cmd);
        if (exec) {
            BodyContentHandler handler = new BodyContentHandler();
            Metadata metadata = new Metadata();
            FileInputStream inputstream = new FileInputStream(new File("G://result.pdf"));
            ParseContext pcontext = new ParseContext();

            // parsing the document using PDF parser
            PDFParser pdfparser = new PDFParser();
            pdfparser.parse(inputstream, handler, metadata, pcontext);

            // getting the content of the document
            System.out.println("Contents of the PDF :" + handler.toString());
        }
    }

    public static boolean exec(String command) {
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        try {
            logger.debug("exec cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
            InputStream errorStream = process.getErrorStream();
            InputStream inputStream = process.getInputStream();
        } catch (IOException e) {
            logger.error(" exec {} error", command, e);
            return false;
        }

        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  exec {}", command, e);
            return false;
        }

        if (exitStatus != 0) {
            logger.error("exec cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("exec cmd exitStatus {}", exitStatus);
        }

        process.destroy(); // 销毁子进程
        process = null;

        return true;
    }
}

结果:

个对禅师说 “我放 不 一-些事放不一 。”
禅师说没有什么东西是真正不下的 者可我信不.
禅师递给一水杯然后入里面侠 -直例到水溢出来 者通到马上松了手,水掉
摔了。
禅师 :其,这个世界上没有什么事是不下 , 痛了 , 你自然就放下
者到 “我能换个水杯?
禅师微微笑 :“可以”他里拿出一水,说到再试试吧 , 禅师又往水杯里倒水 ,水溢出

 

来 , 这次他没有放手
祥岳 问 不汤”? 者 “和”
禅师又 何不放手?”者 “这水杯她送的 禅师回头 “番真牛通

 

 

  git上面的文档对4.0最新的每个命令都有介绍,参照git上的doc文件夹下面对每个文件的介绍:https://github.com/tesseract-ocr/tesseract/tree/master/doc

 

转载于:https://www.cnblogs.com/qlqwjy/p/10273543.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30426065/article/details/98838892

智能推荐

51单片机的中断系统_51单片机中断篇-程序员宅基地

文章浏览阅读3.3k次,点赞7次,收藏39次。CPU 执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对异常情况或特殊请求进行处理,处理完毕后再返回现行程序断点处,继续执行原程序。void 函数名(void) interrupt n using m {中断函数内容 //尽量精简 }编译器会把该函数转化为中断函数,表示中断源编号为n,中断源对应一个中断入口地址,而中断入口地址的内容为跳转指令,转入本函数。using m用于指定本函数内部使用的工作寄存器组,m取值为0~3。该修饰符可省略,由编译器自动分配。_51单片机中断篇

oracle项目经验求职,网络工程师简历中的项目经验怎么写-程序员宅基地

文章浏览阅读396次。项目经验(案例一)项目时间:2009-10 - 2009-12项目名称:中驰别克信息化管理整改完善项目描述:项目介绍一,建立中驰别克硬件档案(PC,服务器,网络设备,办公设备等)二,建立中驰别克软件档案(每台PC安装的软件,财务,HR,OA,专用系统等)三,能过建立的档案对中驰别克信息化办公环境优化(合理使用ADSL宽带资源,对域进行调整,对文件服务器进行优化,对共享打印机进行调整)四,优化完成后..._网络工程师项目经历

LVS四层负载均衡集群-程序员宅基地

文章浏览阅读1k次,点赞31次,收藏30次。LVS:Linux Virtual Server,负载调度器,内核集成, 阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现。NATTUNDR优点端口转换WAN性能最好缺点性能瓶颈服务器支持隧道模式不支持跨网段真实服务器要求anyTunneling支持网络private(私网)LAN/WAN(私网/公网)LAN(私网)真实服务器数量High (100)High (100)真实服务器网关lvs内网地址。

「技术综述」一文道尽传统图像降噪方法_噪声很大的图片可以降噪吗-程序员宅基地

文章浏览阅读899次。https://www.toutiao.com/a6713171323893318151/作者 | 黄小邪/言有三编辑 | 黄小邪/言有三图像预处理算法的好坏直接关系到后续图像处理的效果,如图像分割、目标识别、边缘提取等,为了获取高质量的数字图像,很多时候都需要对图像进行降噪处理,尽可能的保持原始信息完整性(即主要特征)的同时,又能够去除信号中无用的信息。并且,降噪还引出了一..._噪声很大的图片可以降噪吗

Effective Java 【对于所有对象都通用的方法】第13条 谨慎地覆盖clone_为继承设计类有两种选择,但无论选择其中的-程序员宅基地

文章浏览阅读152次。目录谨慎地覆盖cloneCloneable接口并没有包含任何方法,那么它到底有什么作用呢?Object类中的clone()方法如何重写好一个clone()方法1.对于数组类型我可以采用clone()方法的递归2.如果对象是非数组,建议提供拷贝构造器(copy constructor)或者拷贝工厂(copy factory)3.如果为线程安全的类重写clone()方法4.如果为需要被继承的类重写clone()方法总结谨慎地覆盖cloneCloneable接口地目的是作为对象的一个mixin接口(详见第20_为继承设计类有两种选择,但无论选择其中的

毕业设计 基于协同过滤的电影推荐系统-程序员宅基地

文章浏览阅读958次,点赞21次,收藏24次。今天学长向大家分享一个毕业设计项目基于协同过滤的电影推荐系统项目运行效果:项目获取:https://gitee.com/assistant-a/project-sharing21世纪是信息化时代,随着信息技术和网络技术的发展,信息化已经渗透到人们日常生活的各个方面,人们可以随时随地浏览到海量信息,但是这些大量信息千差万别,需要费事费力的筛选、甄别自己喜欢或者感兴趣的数据。对网络电影服务来说,需要用到优秀的协同过滤推荐功能去辅助整个系统。系统基于Python技术,使用UML建模,采用Django框架组合进行设

随便推点

你想要的10G SFP+光模块大全都在这里-程序员宅基地

文章浏览阅读614次。10G SFP+光模块被广泛应用于10G以太网中,在下一代移动网络、固定接入网、城域网、以及数据中心等领域非常常见。下面易天光通信(ETU-LINK)就为大家一一盘点下10G SFP+光模块都有哪些吧。一、10G SFP+双纤光模块10G SFP+双纤光模块是一种常规的光模块,有两个LC光纤接口,传输距离最远可达100公里,常用的10G SFP+双纤光模块有10G SFP+ SR、10G SFP+ LR,其中10G SFP+ SR的传输距离为300米,10G SFP+ LR的传输距离为10公里。_10g sfp+

计算机毕业设计Node.js+Vue基于Web美食网站设计(程序+源码+LW+部署)_基于vue美食网站源码-程序员宅基地

文章浏览阅读239次。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:项目技术:Express框架 + Node.js+ Vue 等等组成,B/S模式 +Vscode管理+前后端分离等等。环境需要1.运行环境:最好是Nodejs最新版,我们在这个版本上开发的。其他版本理论上也可以。2.开发环境:Vscode或HbuilderX都可以。推荐HbuilderX;3.mysql环境:建议是用5.7版本均可4.硬件环境:windows 7/8/10 1G内存以上;_基于vue美食网站源码

oldwain随便写@hexun-程序员宅基地

文章浏览阅读62次。oldwain随便写@hexun链接:http://oldwain.blog.hexun.com/ ...

渗透测试-SQL注入-SQLMap工具_sqlmap拖库-程序员宅基地

文章浏览阅读843次,点赞16次,收藏22次。用这个工具扫描其它网站时,要注意法律问题,同时也比较慢,所以我们以之前写的登录页面为例子扫描。_sqlmap拖库

origin三图合一_神教程:Origin也能玩转图片拼接组合排版-程序员宅基地

文章浏览阅读1.5w次,点赞5次,收藏38次。Origin也能玩转图片的拼接组合排版谭编(华南师范大学学报编辑部,广州 510631)通常,我们利用Origin软件能非常快捷地绘制出一张单独的绘图。但是,我们在论文的撰写过程中,经常需要将多种科学实验图片(电镜图、示意图、曲线图等)组合在一张图片中。大多数人都是采用PPT、Adobe Illustrator、CorelDraw等软件对多种不同类型的图进行拼接的。那么,利用Origin软件能否实..._origin怎么把三个图做到一张图上

51单片机智能电风扇控制系统proteus仿真设计( 仿真+程序+原理图+报告+讲解视频)_电风扇模拟控制系统设计-程序员宅基地

文章浏览阅读4.2k次,点赞4次,收藏51次。51单片机智能电风扇控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0042。_电风扇模拟控制系统设计