获取棋盘格与标准模板在扫描仪上不同位置图片
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取棋盘格与标准模板在扫描仪上不同位置图片相关的知识,希望对你有一定的参考价值。
简 介: 利用滑轨带动测量模板在扫描仪上滑动,通过识别结果来测试扫描仪沿着横向和纵向变化的情况。对于V370,它的横向和纵向的变化极差都在0.05mm之内。
关键词
: 扫描仪,V370,方差
§00 背景介绍
普通的扫描仪在获取一般图片的过程中,由于平移以及光学失真所噪声的图片变形都在可以容忍的范围之内,但基于扫描仪制作的分析仪测试仪器,比如阴影圈测量仪,就需要对于扫描仪可能产生的随机和系统误差进行测试。
利用滑轨带动标准图片在扫描仪上不同位置运动,获取后期的图片之后进行处理,便可以获得扫描仪不同位置上的测量失真。
§01 测量方案
1.1 扫描与移动
1.1.1 扫描仪
利用 EPSON Perfection V370 扫描仪来获取标准测量物在不同位置上的扫描图片。利用扫描仪自身所带的扫描程序 通过Python编程进行自动扫描阴影圈模板在不同位置上的图片 。
▲ 图1.1 V370扫描过程
扫描仪 BENQ 5560 由于没有能够成功在实验计算机上安装对应的驱动程序,所以这次实验只使用V370完成图片的社区。
1.1.2 滑轨控制
用于移动测量物(棋盘格、阴影圈模板)的滑轨使用 蜗杆单轨滑轨 ,利用它移动测量物在扫描仪表面移动。这个蜗杆滑轨利用 无触点感应行程开关 SN04-N 进行极限控制。具有0.891米的 形成控制。
▲ 图1.1.2 实验平台上的蜗杆滑轨与控制器
现在利用 基于ESP8266步进电机控制器 驱动滑轨运行。
- 最大行程:0.891米
- 移动步数:18000
▲ 图 滑轨在移动
1.1.3 固定阴影圈模板与滑轨
利用杠杆将滑轨与模板进行相连,带动其在扫描仪上滑动。
▲ 图1.1.4 利用杠杆将滑轨与模板进行相连,带动其在扫描仪上滑动
▲ 图 完成一次扫描成像
滑轨带动模板移动:
▲ 图 滑轨带动模板移动
1.2 扫描图片
1.2.1 扫描参数
- 滑块移动步数:4200
- 滑块移动次数:50,对应每次移动步数:84
蜗杆滑轨移动参数:
- 移动步数:3200
- 移动距离:15.8mm
▲ 图1.2.1 扫描后的图像
从上面扫描图来看,这种通过反射获得取的阴影圈图像由于出现镜面反射,亮度出现很大的变化。下面是通过喷涂红色油漆来改善这种情况。留在明天对这种喷涂阴影圈模板进行采集对比。
▲ 图1.2.2 在金属阴影圈表面喷涂黄色油漆
1.2.2 扫描程序
from headm import *
from tsmodule.tshardware import *
epson_title = 'EPSON'
save_title = '文件保存设置'
process_title = '进程'
def epsonScan():
tspsendwindowkey(epson_title, "s", alt=1,noreturn=1)
time.sleep(.1)
if sum(tspgetwindowrect(save_title)) != 0:
tspsendwindowkey(save_title, "\\r", noreturn=1)
while True:
time.sleep(1)
if(sum(tspgetwindowrect(process_title)) != 0): break
tspbeep(800, 20)
while True:
time.sleep(1)
if(sum(tspgetwindowrect(process_title)) == 0): break
tspbeep(1800, 20)
printf('\\a')
for i in range(100):
printf("Scan time:%d"%i)
epsonScan()
rcccw(40)
time.sleep(1)
printf('\\a')
1.2.3 扫描结果
下面获得了三个移动物体之后的扫描图片数据。它们分别是:
- 阴影圈移动图片:50
- 棋盘格往下移动:80
- 棋盘格对角线移动:100
▲ 图1.2.4 拍摄的移动的模板图片
▲ 图1.2.5 扫描棋盘格
▲ 图1.2.6 倾斜方向移动
1.2.4 图片数据存储
上面三组扫描图片,另外加上 扫描标准阴影圈模板 中的扫描图像,总共四个图片集合,存储在:
- CSDN 下载数据 : https://download.csdn.net/download/zhuoqingjoking97298/77568483
- AI Studio 扫描仪性能检测项目 : https://aistudio.baidu.com/aistudio/projectdetail/3438461
/home/aistudio/work/Scanner/ChessboardModel.zip
§02 数据处理
所有数据处理过程都在 AI Studio扫描仪性能检测项目 完成数据处理。
2.1 模板往下移动
2.1.1 处理代码
from headm import * # =
import cv2
from tqdm import tqdm
modeldown = '/home/aistudio/work/Scanner/Model-down'
chessboarddown = '/home/aistudio/work/Scanner/Chessboard-down'
chessboarddiagonal = '/home/aistudio/work/Scanner/Chessboard-diagonal'
filedir = modeldown
filedim = sorted([s for s in os.listdir(filedir) if s.find('jpg') > 0])
def modelArg(filename):
img = cv2.imread(os.path.join(filedir,filename))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1,
50, param1=220, param2=30,
minRadius=40, maxRadius=60)
return img, circles[0]
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)
allcircle = []
for id,f in tqdm(enumerate(filedim)):
img,circles = modelArg(f)
img[where(img<50)]=50
if len(circles) > 0:
for c in circles:
cv2.circle(img, (c[0], c[1]), int(c[-1]), (255, 0, 0), 6)
plt.clf()
plt.figure(figsize=(12,15))
plt.imshow(img)
savefile = os.path.join(gifpath, '%03d.jpg'%id)
plt.savefig(savefile)
allcircle.append(circles)
2.1.2 处理结果
▲ 图 检测所有的圆环
def circles2ratio(c):
cm = mean(c, axis=0)
rdim = [0]*4
for cc in c:
if cc[0] <= cm[0] and cc[1] <= cm[1]:
rdim[0] = cc[2]
elif cc[0] <= cm[0] and cc[1] > cm[1]:
rdim[1] = cc[2]
elif cc[0] > cm[0] and cc[1] <= cm[1]:
rdim[2] = cc[2]
else: rdim[3] = cc[2]
return rdim
rdim1 = []
rdim2 = []
rdim3 = []
rdim4 = []
for c in allcircle:
r = circles2ratio(c)
rdim1.append(r[0])
rdim2.append(r[1])
rdim3.append(r[2])
rdim4.append(r[3])
plt.clf()
plt.figure(figsize=(10,6))
plt.plot(rdim1, label='Ratio1')
plt.plot(rdim2, label='Ratio2')
plt.plot(rdim3, label='Ratio3')
plt.plot(rdim4, label='Ratio4')
plt.xlabel("n")
plt.ylabel("value")
plt.grid(True)
plt.tight_layout()
plt.legend(loc='upper right')
plt.savefig('/home/aistudio/stdout.jpg')
plt.show()
▲ 图2.1.2 求取结果分布
print("std(rdim1): ".format(std(rdim1)),"std(rdim2): ".format(std(rdim2)),"std(rdim3): ".format(std(rdim3)),"std(rdim4): ".format(std(rdim4)))
plt.clf()
plt.figure(figsize=(10,6))
plt.hist(rdim1)
plt.hist(rdim2)
plt.hist(rdim3)
plt.hist(rdim4)
plt.xlabel('Ratio')
plt.ylabel('Hist')
plt.grid(True)
plt.tight_layout()
plt.savefig('/home/aistudio/stdout.jpg')
▲ 图2.1.4 求取结果分布
std(rdim1): 0.4690808057785034
std(rdim2): 0.5530140995979309
std(rdim3): 0.6512018442153931
std(rdim4): 0.6946914792060852
2.2 棋盘格往下移
▲ 图 棋盘格往下移动
利用所有点的方差的平方根代表等效的圆的直径。设
(
x
i
,
y
i
)
,
i
=
1
,
2
,
⋯
,
以上是关于获取棋盘格与标准模板在扫描仪上不同位置图片的主要内容,如果未能解决你的问题,请参考以下文章 Zebra DataWedge 是不是捕获扫描仪上的硬件按键? Javascript前端获取扫码枪扫描到的内容方法(区分键盘输入和扫码器输入内容)