简 介: 测试了七段数字图片段角度对于识别的影响。可以看到对于6,9两个数字,在旋转过程中他们之间会相互转换。2,5在旋转180°之后,它们与自己相同,会出现两个识别相同。0,8与其他数字自检有着比较多的差异。 1,7两个数字有着较强的交叉。

关键词七段数字LCD

#mermaid-svg-V1oEDEal6v6oziCP .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-V1oEDEal6v6oziCP .label text{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP .node rect,#mermaid-svg-V1oEDEal6v6oziCP .node circle,#mermaid-svg-V1oEDEal6v6oziCP .node ellipse,#mermaid-svg-V1oEDEal6v6oziCP .node polygon,#mermaid-svg-V1oEDEal6v6oziCP .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-V1oEDEal6v6oziCP .node .label{text-align:center;fill:#333}#mermaid-svg-V1oEDEal6v6oziCP .node.clickable{cursor:pointer}#mermaid-svg-V1oEDEal6v6oziCP .arrowheadPath{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-V1oEDEal6v6oziCP .flowchart-link{stroke:#333;fill:none}#mermaid-svg-V1oEDEal6v6oziCP .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-V1oEDEal6v6oziCP .edgeLabel rect{opacity:0.9}#mermaid-svg-V1oEDEal6v6oziCP .edgeLabel span{color:#333}#mermaid-svg-V1oEDEal6v6oziCP .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-V1oEDEal6v6oziCP .cluster text{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-V1oEDEal6v6oziCP .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-V1oEDEal6v6oziCP text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-V1oEDEal6v6oziCP .actor-line{stroke:grey}#mermaid-svg-V1oEDEal6v6oziCP .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-V1oEDEal6v6oziCP .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-V1oEDEal6v6oziCP #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-V1oEDEal6v6oziCP .sequenceNumber{fill:#fff}#mermaid-svg-V1oEDEal6v6oziCP #sequencenumber{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP #crosshead path{fill:#333;stroke:#333}#mermaid-svg-V1oEDEal6v6oziCP .messageText{fill:#333;stroke:#333}#mermaid-svg-V1oEDEal6v6oziCP .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-V1oEDEal6v6oziCP .labelText,#mermaid-svg-V1oEDEal6v6oziCP .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-V1oEDEal6v6oziCP .loopText,#mermaid-svg-V1oEDEal6v6oziCP .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-V1oEDEal6v6oziCP .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-V1oEDEal6v6oziCP .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-V1oEDEal6v6oziCP .noteText,#mermaid-svg-V1oEDEal6v6oziCP .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-V1oEDEal6v6oziCP .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-V1oEDEal6v6oziCP .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-V1oEDEal6v6oziCP .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-V1oEDEal6v6oziCP .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP .section{stroke:none;opacity:0.2}#mermaid-svg-V1oEDEal6v6oziCP .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-V1oEDEal6v6oziCP .section2{fill:#fff400}#mermaid-svg-V1oEDEal6v6oziCP .section1,#mermaid-svg-V1oEDEal6v6oziCP .section3{fill:#fff;opacity:0.2}#mermaid-svg-V1oEDEal6v6oziCP .sectionTitle0{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP .sectionTitle1{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP .sectionTitle2{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP .sectionTitle3{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-V1oEDEal6v6oziCP .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP .grid path{stroke-width:0}#mermaid-svg-V1oEDEal6v6oziCP .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-V1oEDEal6v6oziCP .task{stroke-width:2}#mermaid-svg-V1oEDEal6v6oziCP .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP .taskText:not([font-size]){font-size:11px}#mermaid-svg-V1oEDEal6v6oziCP .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-V1oEDEal6v6oziCP .task.clickable{cursor:pointer}#mermaid-svg-V1oEDEal6v6oziCP .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-V1oEDEal6v6oziCP .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-V1oEDEal6v6oziCP .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-V1oEDEal6v6oziCP .taskText0,#mermaid-svg-V1oEDEal6v6oziCP .taskText1,#mermaid-svg-V1oEDEal6v6oziCP .taskText2,#mermaid-svg-V1oEDEal6v6oziCP .taskText3{fill:#fff}#mermaid-svg-V1oEDEal6v6oziCP .task0,#mermaid-svg-V1oEDEal6v6oziCP .task1,#mermaid-svg-V1oEDEal6v6oziCP .task2,#mermaid-svg-V1oEDEal6v6oziCP .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-V1oEDEal6v6oziCP .taskTextOutside0,#mermaid-svg-V1oEDEal6v6oziCP .taskTextOutside2{fill:#000}#mermaid-svg-V1oEDEal6v6oziCP .taskTextOutside1,#mermaid-svg-V1oEDEal6v6oziCP .taskTextOutside3{fill:#000}#mermaid-svg-V1oEDEal6v6oziCP .active0,#mermaid-svg-V1oEDEal6v6oziCP .active1,#mermaid-svg-V1oEDEal6v6oziCP .active2,#mermaid-svg-V1oEDEal6v6oziCP .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-V1oEDEal6v6oziCP .activeText0,#mermaid-svg-V1oEDEal6v6oziCP .activeText1,#mermaid-svg-V1oEDEal6v6oziCP .activeText2,#mermaid-svg-V1oEDEal6v6oziCP .activeText3{fill:#000 !important}#mermaid-svg-V1oEDEal6v6oziCP .done0,#mermaid-svg-V1oEDEal6v6oziCP .done1,#mermaid-svg-V1oEDEal6v6oziCP .done2,#mermaid-svg-V1oEDEal6v6oziCP .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-V1oEDEal6v6oziCP .doneText0,#mermaid-svg-V1oEDEal6v6oziCP .doneText1,#mermaid-svg-V1oEDEal6v6oziCP .doneText2,#mermaid-svg-V1oEDEal6v6oziCP .doneText3{fill:#000 !important}#mermaid-svg-V1oEDEal6v6oziCP .crit0,#mermaid-svg-V1oEDEal6v6oziCP .crit1,#mermaid-svg-V1oEDEal6v6oziCP .crit2,#mermaid-svg-V1oEDEal6v6oziCP .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-V1oEDEal6v6oziCP .activeCrit0,#mermaid-svg-V1oEDEal6v6oziCP .activeCrit1,#mermaid-svg-V1oEDEal6v6oziCP .activeCrit2,#mermaid-svg-V1oEDEal6v6oziCP .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-V1oEDEal6v6oziCP .doneCrit0,#mermaid-svg-V1oEDEal6v6oziCP .doneCrit1,#mermaid-svg-V1oEDEal6v6oziCP .doneCrit2,#mermaid-svg-V1oEDEal6v6oziCP .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-V1oEDEal6v6oziCP .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-V1oEDEal6v6oziCP .milestoneText{font-style:italic}#mermaid-svg-V1oEDEal6v6oziCP .doneCritText0,#mermaid-svg-V1oEDEal6v6oziCP .doneCritText1,#mermaid-svg-V1oEDEal6v6oziCP .doneCritText2,#mermaid-svg-V1oEDEal6v6oziCP .doneCritText3{fill:#000 !important}#mermaid-svg-V1oEDEal6v6oziCP .activeCritText0,#mermaid-svg-V1oEDEal6v6oziCP .activeCritText1,#mermaid-svg-V1oEDEal6v6oziCP .activeCritText2,#mermaid-svg-V1oEDEal6v6oziCP .activeCritText3{fill:#000 !important}#mermaid-svg-V1oEDEal6v6oziCP .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-V1oEDEal6v6oziCP g.classGroup text .title{font-weight:bolder}#mermaid-svg-V1oEDEal6v6oziCP g.clickable{cursor:pointer}#mermaid-svg-V1oEDEal6v6oziCP g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-V1oEDEal6v6oziCP g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-V1oEDEal6v6oziCP .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-V1oEDEal6v6oziCP .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-V1oEDEal6v6oziCP .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-V1oEDEal6v6oziCP .dashed-line{stroke-dasharray:3}#mermaid-svg-V1oEDEal6v6oziCP #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V1oEDEal6v6oziCP #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V1oEDEal6v6oziCP #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-V1oEDEal6v6oziCP #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-V1oEDEal6v6oziCP #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V1oEDEal6v6oziCP #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V1oEDEal6v6oziCP #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V1oEDEal6v6oziCP #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V1oEDEal6v6oziCP .commit-id,#mermaid-svg-V1oEDEal6v6oziCP .commit-msg,#mermaid-svg-V1oEDEal6v6oziCP .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-V1oEDEal6v6oziCP g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-V1oEDEal6v6oziCP g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-V1oEDEal6v6oziCP g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-V1oEDEal6v6oziCP .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-V1oEDEal6v6oziCP .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-V1oEDEal6v6oziCP .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-V1oEDEal6v6oziCP .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-V1oEDEal6v6oziCP .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-V1oEDEal6v6oziCP .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-V1oEDEal6v6oziCP .edgeLabel text{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V1oEDEal6v6oziCP .node circle.state-start{fill:black;stroke:black}#mermaid-svg-V1oEDEal6v6oziCP .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-V1oEDEal6v6oziCP #statediagram-barbEnd{fill:#9370db}#mermaid-svg-V1oEDEal6v6oziCP .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-V1oEDEal6v6oziCP .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-V1oEDEal6v6oziCP .statediagram-state .divider{stroke:#9370db}#mermaid-svg-V1oEDEal6v6oziCP .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-V1oEDEal6v6oziCP .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-V1oEDEal6v6oziCP .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-V1oEDEal6v6oziCP .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-V1oEDEal6v6oziCP .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-V1oEDEal6v6oziCP .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-V1oEDEal6v6oziCP .note-edge{stroke-dasharray:5}#mermaid-svg-V1oEDEal6v6oziCP .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-V1oEDEal6v6oziCP .error-icon{fill:#522}#mermaid-svg-V1oEDEal6v6oziCP .error-text{fill:#522;stroke:#522}#mermaid-svg-V1oEDEal6v6oziCP .edge-thickness-normal{stroke-width:2px}#mermaid-svg-V1oEDEal6v6oziCP .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-V1oEDEal6v6oziCP .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-V1oEDEal6v6oziCP .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-V1oEDEal6v6oziCP .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-V1oEDEal6v6oziCP .marker{fill:#333}#mermaid-svg-V1oEDEal6v6oziCP .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-V1oEDEal6v6oziCP {color: rgba(0, 0, 0, 0.75);font: ;}

旋转图片
目 录
Contents
旋转图片
分割形成旋转图片
模型识别结果
网络识别代码
绘制结果
旋转总结
模型识别数字

▲ 图1 旋转的模式

§01 旋转图片


  在博文 模型扫描识别图片 对于 七段数码数字模型 进行扫描测试,也就是利用对七段数码图片进行扫描识别,给出了波动的结果。

  下面测试一下数字旋转对应的输出结果。

1.1 旋转图片

  选择下面LED图片中的数码图像作为旋转测试。

▲ 图1.1.1 用于旋转测试的图片

1.1.1 分割形成旋转图片

(1)分割代码

from headm import *                 # =
import cv2
from paddle.vision.transforms import rotatebackgroundfile = '/home/aistudio/work/7seg/rotate/220112235650.BMP'
img = cv2.imread(backgroundfile)
printt(img.shape)backcolor = mean(mean(mean(img, axis=0), axis=0))
printt(backcolor)imgfile1 = '/home/aistudio/work/7seg/rotate/052-01234.JPG'
imgfile2 = '/home/aistudio/work/7seg/rotate/053-56789.JPG'cutdir = '/home/aistudio/work/7seg/rotate/cutdir'outsize = 48
rotateangle = range(0, 360, 10)def cutimg(imgfile):img = cv2.imread(imgfile)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)imgwidth = gray.shape[1]imgheight = gray.shape[0]for i in range(5):left = int(imgwidth * i // 5)right = int(imgwidth * (i + 1) // 5)data = gray[:, left:right]data = cv2.resize(data, (outsize,outsize))for r in rotateangle:bgdim = ones((512,512)) * backcolorn1 = 256-24n2 = 256+24bgdim[n1:n2, n1:n2] = datarotdata = rotate(bgdim, r)data1 = rotdata[n1:n2,n1:n2]fn = os.path.join(cutdir, '%d_%03d.BMP'%(i+5, r))cv2.imwrite(fn, data1)cutimg(imgfile2)

(2)分割旋转结果

▲ 图1.1.2 旋转后的结果

from headm import *                 # =
import cv2cutdir = '/home/aistudio/work/7seg/rotate/cutdir'
filedim = os.listdir(cutdir)rotateangle = range(0, 360, 10)gifpath = '/home/aistudio/GIF'
if not os.path.isdir(gifpath):os.makedirs(gifpath)
gifdim = os.listdir(gifpath)
for f in gifdim:fn = os.path.join(gifpath, f)if os.path.isfile(fn):os.remove(fn)count = 0
for r in rotateangle:plt.clf()plt.figure(figsize=(10, 4))for i in range(2):for j in range(5):n = i*5+jfn = os.path.join(cutdir, '%d_%03d.BMP'%(n, r))img = cv2.imread(fn)plt.subplot(2,5,i*5+j+1)plt.imshow(img)savefile = os.path.join(gifpath, '%03d.jpg'%count)count += 1plt.savefig(savefile)

▲ 图 数字旋转

1.2 模型识别结果

1.2.1 网络识别代码

import sys,os,math,time
sys.path.append("/home/aistudio/external-libraries")
import matplotlib.pyplot as plt
from numpy import *import paddle
import paddle.fluid as fluid
import cv2
import cv2imgwidth = 48
imgheight = 48
inputchannel = 1
kernelsize   = 5
targetsize = 10
ftwidth = ((imgwidth-kernelsize+1)//2-kernelsize+1)//2
ftheight = ((imgheight-kernelsize+1)//2-kernelsize+1)//2class lenet(paddle.nn.Layer):def __init__(self, ):super(lenet, self).__init__()self.conv1 = paddle.nn.Conv2D(in_channels=inputchannel, out_channels=6, kernel_size=kernelsize, stride=1, padding=0)self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=kernelsize, stride=1, padding=0)self.mp1    = paddle.nn.MaxPool2D(kernel_size=2, stride=2)self.mp2    = paddle.nn.MaxPool2D(kernel_size=2, stride=2)self.L1     = paddle.nn.Linear(in_features=ftwidth*ftheight*16, out_features=120)self.L2     = paddle.nn.Linear(in_features=120, out_features=86)self.L3     = paddle.nn.Linear(in_features=86, out_features=targetsize)def forward(self, x):x = self.conv1(x)x = paddle.nn.functional.relu(x)x = self.mp1(x)x = self.conv2(x)x = paddle.nn.functional.relu(x)x = self.mp2(x)x = paddle.flatten(x, start_axis=1, stop_axis=-1)x = self.L1(x)x = paddle.nn.functional.relu(x)x = self.L2(x)x = paddle.nn.functional.relu(x)x = self.L3(x)return xmodel = lenet()
model.set_state_dict(paddle.load('/home/aistudio/work/seg7model4_1_all.pdparams'))
cutdir = '/home/aistudio/work/7seg/rotate/cutdir'
rotateangle = range(0, 360, 10)def modelpre(n, degree):fn = os.path.join(cutdir, '%d_%03d.BMP'%(n, degree))img = cv2.imread(fn)data = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)data = data - mean(data)stdd = std(data)data = data/stddinputs = data[newaxis, :, :]preid = model(paddle.to_tensor([inputs], dtype='float32'))return preid.numpy()outdim = []for r in rotateangle:out = modelpre(0, r)outdim.append(out[0])print(outdim)

1.2.2 绘制结果

plt.clf()
plt.figure(figsize=(10,6))
for i in range(10):plt.plot([a[i] for a in outdim], label='Out=%d'%i)plt.xlabel("Angle")
plt.ylabel("Value")
plt.grid(True)
plt.tight_layout()
plt.legend(loc='upper right')
plt.savefig('/home/aistudio/stdout.jpg')
plt.show()

▲ 图 数字0旋转

▲ 图1.2.1 数字0旋转输出结果

▲ 图 数字1旋转

▲ 图1.2.2 数字1旋转识别结果

▲ 图 数字2旋转

▲ 图1.2.3 数字2旋转识别结果

▲ 图 数字3旋转

▲ 图1.2.4 数字3旋转识别结果

▲ 图 数字4旋转

▲ 图1.2.6 数字4旋转识别结果

▲ 图 数字5旋转

▲ 图1.2.7 数字5旋转识别结果

▲ 图 数字6旋转

▲ 图1.2.8 数字6旋转识别结果

▲ 图 数字7旋转

▲ 图1.2.10 数字7旋转识别结果

▲ 图 数字8旋转

▲ 图1.2.12 数字8旋转识别结果

▲ 图 数字9旋转

▲ 图1.2.13 数字9旋转识别结果

※ 旋转总结 ※


  测试了七段数字图片段角度对于识别的影响。可以看到对于6,9两个数字,在旋转过程中他们之间会相互转换。2,5在旋转180°之后,它们与自己相同,会出现两个识别相同。0,8与其他数字自检有着比较多的差异。 1,7两个数字有着较强的交叉。


■ 相关文献链接:

  • 模型扫描识别图片
  • 对于七段数码数字模型进行改进:一个关键的数字1的问题

● 相关图表链接:

  • 图1.1.1 用于旋转测试的图片
  • 图1.1.2 旋转后的结果
  • 图 数字旋转
  • 图 数字0旋转
  • 图1.2.1 数字0旋转输出结果
  • 图 数字1旋转
  • 图1.2.2 数字1旋转识别结果
  • 图 数字2旋转
  • 图1.2.3 数字2旋转识别结果
  • 图 数字3旋转
  • 图1.2.4 数字3旋转识别结果
  • 图 数字4旋转
  • 图1.2.6 数字4旋转识别结果
  • 图 数字5旋转
  • 图1.2.7 数字5旋转识别结果
  • 图 数字6旋转
  • 图1.2.8 数字6旋转识别结果
  • 图 数字7旋转
  • 图1.2.10 数字7旋转识别结果
  • 图 数字8旋转
  • 图1.2.12 数字8旋转识别结果
  • 图 数字9旋转
  • 图1.2.13 数字9旋转识别结果

模型识别数字

▲ 图2.1 识别数字

from headm import *                 # =import paddle
import paddle.fluid as fluid
import cv2
import cv2imgwidth = 48
imgheight = 48
inputchannel = 1
kernelsize   = 5
targetsize = 10
ftwidth = ((imgwidth-kernelsize+1)//2-kernelsize+1)//2
ftheight = ((imgheight-kernelsize+1)//2-kernelsize+1)//2class lenet(paddle.nn.Layer):def __init__(self, ):super(lenet, self).__init__()self.conv1 = paddle.nn.Conv2D(in_channels=inputchannel, out_channels=6, kernel_size=kernelsize, stride=1, padding=0)self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=kernelsize, stride=1, padding=0)self.mp1    = paddle.nn.MaxPool2D(kernel_size=2, stride=2)self.mp2    = paddle.nn.MaxPool2D(kernel_size=2, stride=2)self.L1     = paddle.nn.Linear(in_features=ftwidth*ftheight*16, out_features=120)self.L2     = paddle.nn.Linear(in_features=120, out_features=86)self.L3     = paddle.nn.Linear(in_features=86, out_features=targetsize)def forward(self, x):x = self.conv1(x)x = paddle.nn.functional.relu(x)x = self.mp1(x)x = self.conv2(x)x = paddle.nn.functional.relu(x)x = self.mp2(x)x = paddle.flatten(x, start_axis=1, stop_axis=-1)x = self.L1(x)x = paddle.nn.functional.relu(x)x = self.L2(x)x = paddle.nn.functional.relu(x)x = self.L3(x)return xmodel = lenet()
model.set_state_dict(paddle.load('/home/aistudio/work/seg7model4_1_all.pdparams'))cutdir = '/home/aistudio/work/7seg/rotate/cutdir'
rotateangle = range(0, 360, 10)def modelpre(n, degree):fn = os.path.join(cutdir, '%d_%03d.BMP'%(n, degree))img = cv2.imread(fn)data = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)data = data - mean(data)stdd = std(data)data = data/stddinputs = data[newaxis, :, :]preid = model(paddle.to_tensor([inputs], dtype='float32'))return preid.numpy()outdim = []for r in rotateangle:out = modelpre(9, r)outdim.append(out[0])plt.clf()
plt.figure(figsize=(10,6))
for i in range(10):plt.plot([a[i] for a in outdim], label='Out=%d'%i)plt.xlabel("Angle")
plt.ylabel("Value")
plt.grid(True)
plt.tight_layout()
plt.legend(loc='upper right')
plt.savefig('/home/aistudio/stdout.jpg')
plt.show()imgfile = '/home/aistudio/work/7seg/rotate/220113000554.JPG'
OUT_SIZE    = 48
def pic2netinput(imgfile):img = cv2.imread(imgfile)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)imgwidth = gray.shape[1]imgheight = gray.shape[0]f = os.path.basename(imgfile)numstr = '1234'numnum = len(numstr)imgarray = []labeldim = []for i in range(numnum):left = imgwidth * i // numnumright = imgwidth * (i + 1) // numnumdata = gray[0:imgheight, left:right]dataout = cv2.resize(data, (OUT_SIZE, OUT_SIZE))dataout = dataout - mean(dataout)stdd = std(dataout)dataout = dataout / stddif numstr[i].isdigit():imgarray.append(dataout[newaxis,:,:])labeldim.append(int(numstr[i]))test_i = paddle.to_tensor(imgarray, dtype='float32')test_label = array(labeldim)test_l = paddle.to_tensor(test_label[:, newaxis], dtype='int64')return test_i, test_ldef checkimglabel(imgfile):inp, label = pic2netinput(imgfile)preout = model(inp)preid = paddle.argmax(preout, axis=1).numpy().flatten()label = label.numpy().flatten()error = where(label != preid)[0]printt(preid:, label:)checkimglabel(imgfile)

图片旋转对于识别模式带来的变化相关推荐

  1. 旋转图片验证码(识别/破解)解决(一)

    旋转图片验证码防御能力到底有多高.人机校验现巨大漏洞?旋转图片验证码(识别/破解)解决(一) 旋转图片验证码,一个为防止爬虫攻击的行为验证产品.它是由最初的字符验证码演变而来,与其相似的产品还有滑动拼 ...

  2. android 实现图片旋转,移动,缩放,并且记录变化值,用另外一张图片显示出来

    最近公司要做一个戒指试戴的功能,就是把戒指通过手势移动到你指定的手指处,并且保存状态,方便下次进入时显示,可以参考APP"钻石快线"的试戴功能, 图片网上有很多的教程教你怎么把图片 ...

  3. MVP模式的Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题

    Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题 直接上代码 首先添加拍照需要的权限 <uses-permission android:name="andr ...

  4. IE下及标准浏览器下的图片旋转(二)—— Canvas(1)

    文章过长,一篇无法保存. IE下及标准浏览器下的图片旋转(一)--滤镜,CSS3 3. canvas canvas 是html5中的新标签,使用canvas之前我们先看下它的定义:<canvas ...

  5. 可折叠Web可能会给我们带来的变化

    简介:可折叠Web即将到来,我们应该去思考可折叠Web可能会给我们带来什么变化,如果这一天真的到来,我们的技术能否支持该设备? 作者 | 大漠 可折叠Web的说法是可折叠设备带来的.可折叠设备形式多样 ...

  6. flex 图片旋转(解决公转和自转问题)

    在Flex中图片的旋转是既有公转和自转的.这样在图片旋转的时候就有一定小麻烦: 为了更好地说明问题,先引入两个概念:"自转"和"公转".想象一下,地球在绕着太阳 ...

  7. 计算机对农业领域带来的变革,智慧农业将给农业带来哪些变化?

    原标题:智慧农业将给农业带来哪些变化? 一.什么是智慧农业? 智慧农业是指充分应用信息技术成果,集成应用计算机与网络技术.物联网技术.音视频技术.3S技术.无线通信技术及专家智慧与知识实现农业可视化远 ...

  8. 聊聊安卓折叠屏给交互设计和开发带来的变化

    很多年前,前端同学都觉得PC端的适配(兼容处理)难,都认为移动端的时代适配会容易得多,也无需考虑那么多的事情.事实并非如此,移动端的时代同样面临着各种适配的处理.特别是刘海机的出现,前端需要考虑刘海机 ...

  9. 体验QQ2011Beta3带来的变化和惊喜

    体验QQ2011Beta3带来的变化和惊喜<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:offic ...

最新文章

  1. 大手笔 !Julia Computing 获 2400 万美元融资,前 Snowflake CEO 加入董事会
  2. JavaScript中的静态成员
  3. 软件项目版本号的命名格式
  4. 在centos7中安装MySQL5.7
  5. 【转】1.1【MySQL】基本SQL语句大全
  6. 素数对(信息学奥赛一本通-T1403)
  7. Android 使用URLConnection下载音频文件
  8. java使用httpclient封装post请求和get的请求
  9. 本田与索尼宣布将成立合资企业 计划2025年开始销售电动汽车
  10. linux支持arm架构么_全球首次!中国推出一款支持X86、ARM等各种芯片架构的操作系统...
  11. PMON和SMON的功能
  12. 支付业务与技术架构学习总结(6)——对账系统的设计
  13. javascript深入浅出——学习笔记(六种数据类型和隐式转换)
  14. 17、Java并发性和多线程-避免死锁
  15. 微pe添加网络组件_为微PE添加网络组件win10 64位纯净维护系统集合常见网卡驱动支持BIOS/UEFI量产NVME...
  16. python 蓝桥杯排序
  17. 使用chrome console检查css selector/xpath的有效性|百度云盘如何获取文件库中的目录文字
  18. 【图】max51开发板(手工焊接)
  19. Java编程:颜色色带图片的生成
  20. 皮卡丘(pikachu)文件包含

热门文章

  1. UIDatePicker | 时间选择器
  2. Mysql 面试复习
  3. Android 进程常驻(使用第三方MarsDaemon)(虽然不可用,但是还是保留下。)
  4. jquery ajax return值不能取得的解决方案
  5. Python3内置模块之Pickle和cPickle数据持久化方法小结
  6. 数据中台:宜信敏捷数据中台建设实践
  7. 深入Vue - 源码目录及构建过程分析
  8. vue源码构建代码分析
  9. 详解Clojure的递归(下)——相互递归和trampoline
  10. 静态类和非静态类中静态变量