扫描以上的标准模板滑动采集图像及其处理

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扫描以上的标准模板滑动采集图像及其处理相关的知识,希望对你有一定的参考价值。

简 介: 对于喷涂有黄色油漆的金属圆盘进行扫描。利用 滑轨带动圆盘V370扫描仪 上移动,利用300dpi分辨率获得金属圆盘模板在扫描仪上不同位置和高度的图片,通过后期算法研究扫描仪在不同地方的失真以及影响测量准确性的因素。

关键词 V370扫描仪cv2HoughCircles

扫描图片 目 录
Contents
喷涂黄色油
漆的阴影圈
移动距离 扫描结果 处理图片 检测圆形 检测精度问题 加速处理 图片预分割 Studio带有GPU环境 处理总结

 

§01 描图片


1.1 喷涂黄色油漆的阴影圈

  在 获取棋盘格与标准模板在扫描仪上不同位置图片 使用金属阴影圈模板在V370扫描以上进行取像的时候,由于金属表面的反射使得对应的模板图像出现亮度变化过大,会影响到后期模板圆孔面积的求取,进而使得对扫描仪的扫描精度测试产生影响。

▲ 图1.1.1 喷涂有黄色油漆的阴影圈金属模板

1.2 移动距离

  根据 获取棋盘格与标准模板在扫描仪上不同位置图片 测量蜗杆滑轨的运动系数:

蜗杆滑轨运动系数:
运动步数:3200
运动距离:15.8cm
运动常数:202.53 步/cm

  扫描以上的金属模板移动距离:130cm。根据上面测量到的蜗杆滑轨运动系数,可以知道扫描范围的步数为: 130 × 202.53 = 2646 130 \\times 202.53 = 2646 130×202.53=2646 。实际工作中定位2600。

▲ 图1.3.1 扫描以上的金属模板移动距离

1.2.1 扫描程序

from headm import *
from tsmodule.tshardware    import *

'''
rcccw(2000)
exit()

'''
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(50):
    printf("Scan time:%d"%i)
    epsonScan()
    rcccw(52)

    printf('\\a')

1.3 扫描结果

1.3.1 水平移动扫描

▲ 图1.2.2 扫描结果

1.3.2 对角线移动扫描

▲ 图2.1 对角线方向移动

  通过基于ESP8266 WiFi控制的步进升降机械平台移动固定步数,测量移动距离。

蜗杆平台移动参数:
运动步数:2000
运动距离:40mm

  因此,每移动1mm,驱动器需要驱动50个脉冲。

  驱动模块沿着对角线移动可以同时测量到扫描仪在上下以及左右方向中引起图像尺寸变化的情况。

▲ 图2.1.1 对角线移动扫描

1.3.3 上下移动扫描

  使用 基于WiFi步进电机驱动单蜗杆滑轨带动阴影圈圆盘 在扫描仪上网上移动。

移动参数:
移动距离:20mm
移动步数:100

▲ 图3.1 上下扫描结果

 

§02 理图片


2.1 检测圆形

2.1.1 利用HoughCircles检测

(1)检测程序

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=90, maxRadius=115)

    return img, circles

▲ 图2.1.1 在AI Studio上处理图片

(2)结果排序

  由于所检测到的四个圆圈在输出结果上并没有进行排序,因此通过下面程序对于四个结果进行排序。

def sortcircles(cc):
    cca = mean(cc[0], axis=0)

    angle = [math.atan2(c[1]-cca[1], c[0]-cca[0])*180/pi for c in cc[0]]
    angle = [s if s >= 0 else 360+s for s in angle]

    ar = sorted(zip(angle, cc[0].T[2]))
    sortr = [s[1] for s in ar]
    rcompare = list(array(sortr) > 100)

    for i in range(3):
        rc = roll(rcompare, i+1)
        rsr = roll(sortr, i+1)

        if rc[0] == True and rc[1] == True:
            break

    return rsr

▲ 图2.1.2 四个结果对应 圆圈的位置

▲ 图2.1.3 检测结果显示

2.1.2 检测结果

(1)对角线移动

▲ 图2.1.4 对角线移动测量

▲ 图2.1.5 四个圆圈测量结果

std(r1dim): 0.6596184372901917
std(r2dim): 0.5734277367591858
std(r3dim): 0.6673048138618469
std(r4dim): 0.5788406133651733


max(r1dim)-min(r1dim): 3.3000030517578125
max(r2dim)-min(r2dim): 2.5
max(r3dim)-min(r3dim): 3.6999969482421875
max(r4dim)-min(r4dim): 3.0
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# PROC1.PY                     -- by Dr. ZhuoQing 2022-01-25
#
# Note:
#============================================================

from headm import *                 # =
import cv2
from tqdm import tqdm
from tqdm import tqdm

scandiag = '/home/aistudio/work/Scanner/ScanDiag'
scanrow = '/home/aistudio/work/Scanner/ScanRow'
scanvert = '/home/aistudio/work/Scanner/ScanVert'

filedir = scanrow
filedim = sorted([s for s in os.listdir(filedir) if s.find('jpg') > 0])
#printt(filedim:)

#------------------------------------------------------------
'''
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)

for id,f in tqdm(enumerate(filedim)):
    fn = os.path.join(filedir, f)
    img = cv2.imread(fn)[:,:,::-1]

    img[where(img < 50)] = 0

    plt.clf()
    plt.figure(figsize=(8,12))
    plt.imshow(img)
    savefile = os.path.join(gifpath, '%03d.jpg'%id)
    plt.savefig(savefile)
'''
#------------------------------------------------------------
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=150, param2=40,
                               minRadius=90, maxRadius=115)
#    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1,
#                               50, param1=220, param2=30,
#                               minRadius=170, maxRadius=240)

    return img, circles

#------------------------------------------------------------
def circleImg(img, cc):
    for c in cc[0]:
        cv2.circle(img, (int(c[0]), int(c[1])), int(c[-1]), (0,0,255), 12)

    return img

#------------------------------------------------------------
def sortcircles(cc):
#    printt(cc[0])
    cca = mean(cc[0], axis=0)

    angle = [math.atan2(c[1]-cca[1], c[0]-cca[0])*180/pi for c in cc[0]]
    angle = [s if s >= 0 else 360+s for s in angle]

    ar = sorted(zip(angle, cc[0].T[2]))
    sortr = [s[1] for s in ar]
    rcompare = list(array(sortr) > 100)

    for i in range(3):
        rc = roll(rcompare, i+1)
        rsr = roll(sortr, i+1)

        if rc[0] == True and rc[1] == True:
            break

    return rsr

#------------------------------------------------------------

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)):
    f =<

以上是关于扫描以上的标准模板滑动采集图像及其处理的主要内容,如果未能解决你的问题,请参考以下文章

LabVIEW实现连续图像测量,采集图像后,程序运行实现尺寸测量

抑菌圈扫描校正模板

滑轨屏原理_互动滑轨屏整体解决方案

数字图像处理,中值滤波和均值滤波及其改进算法的C++实现

NI Vision for LabVIEW 基础:准备测量图像

使用标准信号检测 VM振弦采集模块测量精度修正