首页/文章/ 详情

实现一个光学引伸计

1年前浏览6379

image.png

 过冷水诚挚邀请你加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载,**:*******

QQ图片20210424105303.png

 

    很多时候,市场上出售的常规仪器已不能满足测量要求,这时就需要自行设计一些测试仪器。例如上一章中用来测量试件应变的标准引伸计,在很多情况下是不能使用的(如应变太大的时候) 。这里可以告诉读者一个事实,上一章低碳钢拉伸实验中应力-应变曲线后半段的应变数据是有问题的: 曲线后半段的应变数据是直接用试验机压头的位移数据估算出来“凑数”的,这是因为普通的引伸计量程有限,不能用其测量后半段的变形(当试件屈服后,一般要将引伸计摘掉,否则会使引伸计损坏) 。 实验研究经常要面对一些新问题,因此有时常需要自行设计并实现一些特殊的测量装置。本章介绍用 MATLAB 实现一个大量程的光学引伸计的过程。 

14.1  光学引伸计 

14.1.1  引伸计及光学引伸计 

    引伸计(Extensometer)是测量试件两点间相对变形程度(应变)的标准测量工具(图 14-1) ,其应用在上一章已介绍过。常规的引伸计使用方便,但有一定缺陷:对于某一型号的引伸计来说,其标距是固定的,过大或过小的试件不能测量;需要用两个卡口接触试件传递变形,因此不能测量软材料等试件;变形由应变片来量测,其量程有限,一般不能进行超大变形的测量。

 image.png

图 14-1  引伸计及其工作原理 

    光学引伸计(optical extensometer)如图 14-2 所示。用光学引伸计测量应变时首先在试件表面制作两个标记点,之后使用数字相机实时采集标记点的数字图像(实时记录的图像序列构成一个视频,因此光学引伸计也称为视频引伸计) 。实验结束后,用图像处理的方法精确定位各幅图像中两个标记点的坐标(xA, yA)和(xB, yB) ,根据不同时刻标记点的坐标可计算出应变。 

 image.png

图 14-2  光学引伸计测量应变的示意图 

如图 14-3 所示,第 n 幅图像上两个标记点之间的应变为 

image.png

其中,lxn为第n幅图像上两点之间的距离;lx0为加载前两点之间的距离。 

image.png

图 14-3  使用标记点坐标计算应变的示意图 

    从上面的原理可知,光学引伸计是一种非接触测量手段,且测量时标距和量程不受限制,因此特别适合超常规尺度(如超大或超小试件)和软材料(如橡胶、塑料、薄膜和纤维等)试件的应变测量。 

14.1.2  光学引伸计的实现流程 

    从光学引伸计的原理介绍中可以看出,实现光学引伸计最重要的两个步骤是采集图像和处理图像:采集图像即要实时获取加载过程中的图像数据(一般还需保存下来供后面精细处理) ; 处理图像即要用图像处理方法获得标记点的精确位置(可在采集时实时处理,也可在实验后针对保存的图像处理) 。 确定标志点位置的方法较多,本部分介绍一种简单易行且适用性广的方法,即“灰度重心法” 。如果将图像看作一个密度不均匀的平板, 各像素点的灰度看作平板的密度, 则图14-4所示的一个含单个白色标记点的图像表示一个均匀且密度极低的平板中夹杂着一个密度极大的质量块。由于板和质量块密度相差很大,可以用整个板的重心代表质量块的中心。对于图像来说,就是用图 14-4  一幅图像的灰度重心图像的“灰度重心”代表白色标记点的中心。

image.png

图 14-4  一幅图像的灰度重心

     设图14-4所示的图像大小为M×N,其灰度为I(i, j) , (0<i<M,0<j<N) ,则标记点的灰度重心坐标为 

image.png

    利用光学引伸计测量时,图像中至少要有两个标记点(图 14-3) ,因此,处理数据时,需先将一幅图像分成两幅小图像分别进行处理。根据上面的原理可以设计光学引伸计的流程,如图14-5所示。 

image.png

图 14-5  光学引伸计的流程 

14.2  图像采集的实现 

    目前,光测实验中的图像采集一般用工业或科研用数字相机完成。与普通的家用数字相机最大的区别是,这类相机的图像采集可由程序精确控制,因此可以自动采集并处理或存储。用光学引伸计测量时,所获得的应变数据还要与载荷等数据对应分析,因此还需要将图像采集的时刻准确记录下来,以便与其他实验数据对准。工业和科研用数字相机在出售时均提供针对常规编程语言如VC  、VB等的接口函数库,用这些语言调用函数库中的函数可完成相应功能。一般的相机并不提供针对MATLAB的接口函数,但MATLAB中有专门的图像采集工具箱(Image Acquisition Toolbox) ,可以供用户驱动相机完成图像采集。 

14.2.1  MATLAB 图像采集工具箱 

(1) MATLAB控制相机硬件的原理 

    图像采集工具箱是MATLAB专为图像采集而设计的一个平台(图14-6) ,这个平台帮助用户建立一个与硬件进行底层交流的桥梁,同时提供一些特殊函数使用户可以用MATLAB命令实现图像的采集。 

image.png

图 14-6  MATLAB 图像采集工具箱示意图 

    使用图像采集工具箱,程序开发者无需与特定的图像采集硬件(相机或图像卡)直接打交道,在硬件安装成功后,MATLAB图像采集工具箱即“接管”了与硬件的底层交流工作。在图像采集工具箱这个平台上,不管是何种型号、何种接口的相机都是一样的,对于用户来说,可以用同样的函数进行控制。这样的操作模式将程序开发者从繁杂的底层函数中解脱出来,使程序开发变得简单。此外,当需要更换硬件时,这种模式开发的程序也无需更改代码,因此具有广泛的适用性。 

(2) 使用MATLAB图像采集工具箱进行

    图像的采集 使用MATLAB图像采集工具箱进行图像采集的具体流程如图14-7所示,下面分步骤进行具体说明。 

1)第一步:安装图像采集硬件 

image.png

图 14-7  使用 MATLAB图像采集的具体流程图

    按照数字相机的说明书正确安装相机的 驱动程序(当前的计算机操作系统上一般会进行 自带一些简易摄像头的驱动,这类相机无需 安装驱动即可使用) 。安装完成后,正确连接相机和计算机,用相机自带的测试软件进行图像采集的测试,确保相机的安装正常。 在安装好相机硬件后,还要安装MATLAB与硬件进行底层交流的“适配模块” (MATLAB与硬件驱动之间的桥梁) 。对于目前很多类别的数字相机,图像采集工具箱中已经提供了与硬件进行底层交流的“适配模块” ,因此无需特别安装。

表14-1为R2011b版本中已安装的适配模块的详细情况。 

image.png

    对于图像采集工具箱中未提供适配接口的硬件,用户需要自行安装或开发适配模块(相关方法或信息可从网络资源中获取,这里不详细叙述) 。 在安装完成后,可以通过MATLAB命令查询系统中已经安装的适配模块的信息。 

例1:查询作者电脑上安装的适配器信息。 

>> imaqhwinfo 
ans =  
    InstalledAdaptors: {'matrox'  'winvideo'}
     MATLABVersion: '7.14 (R2012a)' 
          ToolboxName: 'Image Acquisition Toolbox' 
       ToolboxVersion: '4.3 (R2012a)'

    上面的结果表明作者的电脑系统上安装了两类适配器:一种是“matrox” ,一种是“winvideo” 。还可以进一步查询某一特殊适配器的情况。 

    例2:查询作者电脑上winvideo适配器的细节。

>>imaqhwinfo('winvideo') 
ans =  
       AdaptorDllName: [1x81 char] 
    AdaptorDllVersion: '4.3 (R2012a)' 
          AdaptorName: 'winvideo' 
            DeviceIDs: {[1]  [2]} 
           DeviceInfo: [1x2 struct]

    上面结果表明作者的电脑(surface pro)上安装了两个winvideo格式的摄像头,可以分别查询两个摄像头的信息。 

例3:查询两个winwideo摄像头的信息。 

>>imaqhwinfo('winvideo',1) 
ans =  
             DefaultFormat: 'YUY2_1280x720' 
       DeviceFileSupported: 0 
                DeviceName: 'Microsoft LifeCam Rear' 
                  DeviceID: 1 
     VideoInputConstructor: 'videoinput('winvideo', 1)' 
    VideoDeviceConstructor: 'imaq.VideoDevice('winvideo', 1)' 
          SupportedFormats: {1x9 cell} 
 
>> imaqhwinfo('winvideo',2) 
ans =
 DefaultFormat: 'YUY2_1280x720' 
       DeviceFileSupported: 0 
                DeviceName: 'Microsoft LifeCam Front' 
                  DeviceID: 2 
     VideoInputConstructor: 'videoinput('winvideo', 2)' 
    VideoDeviceConstructor: 'imaq.VideoDevice('winvideo', 2)' 
          SupportedFormats: {1x9 cell}

2)第二步:建立图像采集对象 

    图像采集硬件和适配器安装完成后, 工具箱就接管了与底层硬件的交流工作,用户直接就可以用MATLAB控制相机进行图像采集。要完成对相机的控制,先要建立一个在程序中代表相机的对象。其方法很简单,用videoinput函数可以实现(函数具体用法请自行查询) 。 

    例4:建立一个winwideo摄像头对象。 

>>vid = videoinput('winvideo', 1) % 建立摄像头对象 
Summary of Video Input Object Using 'Integrated Camera'. 
 
   Acquisition Source(s):  input1 is available. 
 
  Acquisition Parameters:  'input1' is the current selected source. 
                           10 frames per trigger using the selected source. 
                           'YUY2_1024x600' video data to be logged upon 
START. 
                           Grabbing first of every 1 frame(s). 
                           Log data to 'memory' on trigger. 
 
      Trigger Parameters:  1 'immediate' trigger(s) on START. 
 
                  Status:  Waiting for START. 
                           0 frames acquired since starting. 
                           0 frames available for GETDATA.

vid表示创建的摄像头对象。 

例5:通过get函数查看摄像头对象的所有属性。

>>get(vid) % 获取相机属性值 
  General Settings: 
    DeviceID = 1 
    DiskLogger = [] 
    DiskLoggerFrameCount = 0 
    EventLog = [1x0 struct] 
    FrameGrabInterval = 1 
    FramesAcquired = 0 
    FramesAvailable = 0 
    FramesPerTrigger = 10 
    Logging = off
     LoggingMode = memory 
    Name = YUY2_1280x720-winvideo-1 
    NumberOfBands = 3 
    Previewing = off 
    ROIPosition = [0 0 1280 720] 
    Running = off 
    Tag =  
    Timeout = 10 
    Type = videoinput 
    UserData = [] 
    VideoFormat = YUY2_1280x720 
    VideoResolution = [1280 720] 
  Color Space Settings: 
    BayerSensorAlignment = grbg 
    ReturnedColorSpace = YCbCr 
  Callback Function Settings: 
    ErrorFcn = @imaqcallback 
    FramesAcquiredFcn = [] 
    FramesAcquiredFcnCount = 0 
    StartFcn = [] 
    StopFcn = [] 
    TimerFcn = [] 
    TimerPeriod = 1 
    TriggerFcn = [] 
  Trigger Settings:
  InitialTriggerTime = [] 
    TriggerCondition = none 
    TriggerFrameDelay = 0 
    TriggerRepeat = 0 
    TriggersExecuted = 0 
    TriggerSource = none 
    TriggerType = immediate 
  Acquisition Sources: 
    SelectedSourceName = input1 
    Source = [1x1 videosource]

相机对象建立后,可以打开一个窗口,实时显示采集到的图像,如图 14-8所示。

image.png

图 14-8  使用“preview”实时显示采集到的图像 

例6:利用preview命令对相机进行预览。 

  >> vid = videoinput('winvideo', 1) % 建立摄像头对象 
preview(vid) % 相机预览

3)第三步:设置图像采集参数 

    在开始图像采集之前,一般需要按要求进行相关的参数设置,用set函数可对相机参数(按照上文所介绍的使用“get”命令查看)和采集参数进行设置(也可以不设置参数,此时图像采集按默认参数进行) 。 相机参数包括Shutter(快门) 、Gain(增益) 、FrameRate(帧率)等。不同的相机,可以设定的参数也不相同,所以用户在进行设定前必须确认相机有哪些参数可以修改。需要注意的是,大部分相机的曝光模式(AutoExposureMode)默认值是 “on” , 即在整个拍摄过程中, 相机会根据环境光强的变化自动调整曝光参数。对光学测量来说,这是不希望的发生的现象,因此需要将此属性设置为“off” 。 采集参数包括TriggerRepeat(触发次数) 、FramesPerTrigger(触发采集帧数) 、FrameGrabInterval(帧抓取间隔)以及FrameAcquiredFcn(帧获取调用函数)等。为了更好地理解要设置的参数,先对工具箱控制图像采集的流程进行简要说明。 一个完整的图像采集过程如图14-9所示。图像采集时,首先对硬件创建采集 

image.png

图 14-9  一个完整的图像采集过程示意图 

对象,然后启动对象,此时数据流开始发送,但并不采集和保存。只有当对象被触发后,采集才正式开始。 “TriggerRepeat”参数让使用者指定发出触发信号的次数。如果用户希望相机能够连续采集不停止,可以将此属性设为“Inf” 。 “FramesPerTrigger”参数让用户设置在一次触发中需要采集图像的数量。 “FrameGrabInterval”参数让用户选择以间隔方式进行图像采集。具体示意图如图14-10所示。 

 image.png

图 14-10 “FrameGrabInterval”参数的释义示意图 

    “FramesAcquiredFcn”参数用来设置一个由图像采集触发的函数的函数名。任何时候一旦采集了一幅图像,就会调用这个函数。因此,用户可以在这个函数中添加图像数据处理的语句,实现图像的实时采集和处理。 

    例7:设置相机TriggerRepeat参数为Inf。 

>> vid = videoinput('winvideo', 1) % 建立摄像头对象 
 set(vid,'TriggerRepeat', Inf)

4)第四步:开始采集并处理 

    参数设定完毕后,就可以采集图像了。图像采集工具箱提供了一个非常简单的图像采集函数——getsnapshot来完成单张图像的采集。 

句法 

    frame = getsnapshot(obj) 

说明 

    Getsnapshot 函数可以采集一帧图像,该函数会返回一个矩阵,表征采集到的图像。 

    obj:图像采集对象。 

    frame:采集到的图像矩阵。  

例8:使用getsnapshot函数采集图像,将图像进行二值化处理并存储。 

>> vid = videoinput('winvideo', 1) % 建立摄像头对象 
 frame = getsnapshot(vid); % 采集单张图像 
bw_image = im2bw(frame,0.5) % 对图像进行二值化处理 
imwrite(bw_image,'image.bmp'); % 存储图像

    但是使用getsnapshot命令只能采集一张图像。如果希望能够连续采集图像,可以循环使用getsnapshot。但这并不是一个好方法,因为每执行一次getsnapshot,就要“启动”和“终止”图像采集一次,因而循环执行getsnapshot会使得程序效率很低。 

    在图像采集中,实现图像的处理可以用上面提到的FramesAcquiredFcn函数来实现。 如果在图像采集对象中设置了此函数, 则任何时候一旦采集了一幅图像,就会调用这个函数。 

例9:使用FramesAcquiredFcn函数实现图像采集、二值化处理和存储。

>> vid = videoinput('winvideo', 1) % 建立摄像头对象 
set(vid,'FramesAcquiredFcn',{'Save_frame',handles});  
% 设置调用函数名为 Save_frame  
%% Save_frame.m 文件 
function Save_frame(obj,event) 
frame = peekdata(obj,1); %采集一帧图像 
frame = frame';%图像转置 
bw_image = im2bw(frame,0.5); % 对图像进行二值化处理 
imwrite(bw_image,'image.bmp'); % 存储图像 
flushdata(obj);%清空内存

    5)第五步:采集完成后清除对象 

    所有工作完成后,需要使用delete命令清除图像采集对象,否则该对象还驻留在内存中,影响后续使用。设图像采集对象为vid,则清除方法为delete(vid) 。 

14.2.2  用 MATLAB 采集实验图像——实例 

    以一个科研用CCD相机为例,详细介绍使用MATLAB驱动相机采集图像的全过程。 

(1) 硬件与环境准备 

    所使用的数字相机为德国Basler A641f工业CCD相机, 分辨率为1 624×1 236像素,满分辨率下帧率为15 fps,相机如图14-11所示。 

image.png

图 14-11  Basler A641f 工业 CCD 相机及 Computar 镜头

    首先,需要在电脑上安装相机的驱动,如图14-12所示。相机驱动程序安装完成后,通过数据线将相机连接到电脑上,之后启动相机自带的预览软件,查看相机是否连接成功,如图14-13所示。 

image.png

图 14-12  在电脑上安装相机自带驱动 

image.png

图 14-13  使用相机自带软件查看相机是否连接成功 

    在确认相机已经连接成功后,安装用于驱动MATLAB控制相机的适配器软件。本文相机数据传输方式为1394a(火线) ,因此安装的适配器软件名称为1394camera645.exe(读者可以到以下网站上自行下载:http://www.cs.cmu.edu/~iwan/1394/index.html) ,如图14-14所示。 软件安装结束后,桌面上会自动生成一个快捷方式(1394Camera Demo) 。读者可以双击该快捷方式,打开此软件,查看相机是否连接成功,如图14-15所示。 确定软件安装正确且相机连接成功后,就已经可以使用MATLAB来控制相机了。 

image.png

  图 14-14  在电脑上安装适配器软件

image.png

  图 14-15  使用适配器软件查看相机是否连接成功

(2) 图像采集 

    在图像采集之前,先要建立采集对象,并对采集对象进行参数设置。在设置完成后,就可以实现图像采集和处理了。本例中,将图像采集和处理用一个采集调用函数实现。采集对象每成功采集一幅图像,即会调用一次该函数。该函数可按要求生成含时间信息的字符串,并以该字符串为文件名将图像存储。 在此函数中,传递了一个参数event,包含了函数调用中各种参数和数据,例如函数调用的时间(即图像采集的时间) 。前已述及,测量中必须确知每幅图像的记录时间,以便和其他被测物理量在时间轴上对齐,本例即给出了使用event获知图像采集时间的方法。 此外,函数中还用到了一个命令“peekdata” 。该命令可以从相机对象中已采集的数据中“吐出”最近一次采集的图像数据到workspace中。 

句法 

    frame = peekdata(obj) 

说明 

    peekdata 函数可以从相机已采集的数据中拿到最近一次采集的图像数据。 

    obj:相机对象。 

    frame:采集到的图像矩阵。  

具体实现的程序范例如下: 

%==================================================================% 
%% ImageAcquisition.m 
%% 本程序用于实现 BaslerA641f 数字相机的图像的连续采集和存储 
%% 本程序内部调用子函数 Save_frame.m 
%==================================================================% 
close all
clear all 
clc 
%% 设置采集参数 
vid = videoinput('dcam',1,'F7_Y8_1624x1236' ); % 建立图像采集对象 
set(vid,'TriggerRepeat', 1000); % 设置相机 TriggerRepeat 参数为 Inf 
set(vid,'FramesPerTrigger',1); % 设置相机 FramesPerTrigger 参数为 1 
set(vid,'FrameGrabInterval',1); % 设置相机 FrameGrabInterval 参数为 1 
set(src.Brightness, 'Brightness')=1; % 设置相机 Brightness 参数为 1 
set(vid,'FramesAcquiredFcn',{'Save_frame',handles});  
% 设置调用函数为 Save_frame 
%% 启动采集 
start(vid) 
%% 终止采集 
stop(vid) 
%% 清除对象 
delete(vid)
%==================================================================% 
%% 文件名 Save_frame.m 
%% 本函数为上述程序中采集图像需要调用的函数,用于实现图像的采集和存储 
%% 参数 obj:相机对象 
%% 参数 event:包含了函数调用中各种参数和数据 
%==================================================================% 
function Save_frame(obj,event) 
global k t0; %设置全局变量 
if (get(obj, 'framesavailable')) 
    frame = peekdata(obj,1); %采集一帧图像 
    frame = frame';%图像转置 
    t = event.Data.AbsTime; %记录采集的时间 
    tt = etime(t,t0); %计算相对时间 
image_name=strcat('image_',int2str(k),'_',num2str(tt),'.bmp');  
% 含时间信息的文件名 
    imwrite(frame,image_name) %存储图像 
    k=k 1; 
    flushdata(obj);%清空内存 
else 
end

(3) 使用GUI完成相机控制和图像的采集 

    前面的例子可以完成图像采集,但在实际应用中还存在一些不方便的地方。事实上,可以按照本书第6章介绍的GUI制作方面的内容,将上述程序改写成界面形式, 这样更便于操作。 作者编写的一个实验中应用的图像采集程序如图14-16所示。图像具有相机选择、放大预览、快门和增益调整、图像存储及帧率和丢帧数目实时显示等功能。程序文件可在网站上下载。 

 image.png

图 14-16  使用 GUI 完成图像采集的界面 


14.3  含标记点图像的处理 

    在图像采集完成后,就按照之前介绍的原理对图像进行处理得到应变数据。本节介绍图像处理的细节。 

14.3.1  处理图像得到应变数据 

(1) 读取图像并切分 

    首先,读取实验中采集得到的原始图像并显示,如图14-17所示。 之后,将图像切分为两部分,每部分只含有一个标记点。最简单的做法是将图像一分为二,一种更好的做法是以标记点为中心,从图像中切出一个合适大小的区域。这样做至少有两个好处:一是大大减少计算量,二是可以减小其他图像区域对重心计算的影响。 切分图像用imcrop命令来实现。为了更好地应用该函数,先要了解该函数中定义图像区域的方法。

image.png

图 14-17  实验中使用数字相机采集到的原始图像 

句法 

    [I rect] = imcrop(image) 

说明 

    imcrop 函数可以对原始图像进行裁剪。 

    image:原始图像。 

    I:裁剪后的图像。 

    rect:区域向量。 

    imcrop中图像区域由一个向量来定义,称为区域向量。区域向量由4个数字

组成,即[x0 y0 w h],其具体含义如图14-18所示。 

image.png

图 14-18  选取需要计算的标记点区域 

   用imcrop切分图像区域有两种方法:一是给定区域向量切分,函数返回切分后的图像矩阵;二是交互式操作切分,函数返回切分后图像矩阵,同时返回区域向量。本部分介绍第二种方法。 

    运行本实例的程序范例,并手动给出要切分的区域,程序会切分出所需的图像并绘制一个边框在所切分的区域上,如图14-19所示。 

image.png

 图 14-19  选取需要计算的标记点区域 

(2) 计算含标记点图像区域的灰度重心 

    对于切分后的图像区域,根据前面的原理计算其灰度重心。需要注意的是,对于本例中的黑色标记点,须在计算前先将图像反色(图 14-20(a) ) ,使标记点变为白色(图14-20(b) ) 。具体的程序实现如图14-20(c)所示。

image.png

图 14-20  图像反色及确定灰度中心 

    下面进行灰度重心的计算。按照14.1节的原理,可编写图像区域灰度重心计算的函数。 

(3) 求取两标记点间的应变 

    按上述方法分别处理两个图像区域, 可计算得到两个标记点的灰度重心坐标。利用两个坐标可以计算两点间的距离,进而计算应变。但是,直接用两个图像区域的灰度重心坐标相减计算距离的做法是错误的,因为这两个坐标计算结果是在不同的坐标系中得到的,必须将其转换到同一坐标系中才能计算。两个图像区域与整体图像坐标系的关系如图14-21所示。 

    利用图像区域切分的区域向量,可以很容易完成坐标系的转换,将标记点坐标转换到整体坐标系之后,便可计算两个标记点之间的距离了。至此,完成了一幅图像的全部处理。 用一个循环语句按同样的方法处理所有图像后,就可实现应变的计算了。其流程如图14-22所示。 

image.png

 图 14-21  两个图像区域与整体图像坐标系的示意图          

image.png

 图 14-22  处理全部图像得到应变结果的流程图 


14.3.2  实际测量中需要考虑的一些细节 

    前面介绍的数据处理方法只是针对简单和理想的情况,在实际测量中,为了改善测量效果,还需要注意一些细节。有两个问题值得关注: 

(1) 标记点之外图像区域对结果的影响 

    理论上,标记点之外图像的灰度为0时,图像区域的灰度重心与标记点的中心重合。但是,实际测量中,不可能做到使其他区域的灰度为0。而且,更重要的是,测试过程中光照可能不均匀变化,导致图像其他区域的灰度发生变化。这会使灰度重心发生偏移,从而造成测量误差。 

    为解决上述问题,可在进行灰度重心计算时,先对标记点图像进行二值化处理,使除标记点区域之外的灰度变为0。二值化的过程表示为 

image.png

    其中,It为一给定的阈值。 将图14-23(a) 进行处理, 得到的新图像如图14-23(b)所示。为了便于进行二值化操作,在实验过程中尽量制作与基底反差较大的标记点。 

image.png

图 14-23  对标记点进行二值化前后的图像 

(2) 超大变形测量时标记点“出格”的问题 

    如前所述,灰度重心的计算是针对从图像中选出一个包含标记点的小区域进行的。这个区域一般不希望太大,原因已在上文述及。但是,当测量大变形试件时,标记点可能会发生很大的移动,此时标记点很可能“出格” ,即跑出图像区域(图14-24) 。用这种图像计算灰度重心,其结果显然是错误的。 

image.png

图 14-24  标记点“出格”引起计算错误 


    对于这一问题,可设计一个“动态图像区域”跟踪标记点,即对图像实行动态切分,区域大小不变,但每幅图像要处理的图像区域是变化的。切分区域的移动可由前面图像的计算结果来估计。要注意的是,由于使用动态图像区域,计算不同幅图像之间标记点之间距离时,其坐标转换关系是不同的,这一点在编程时需要加以关注。 

    对于这一问题,可设计一个“动态图像区域”跟踪标记点,即对图像实行动态切分,区域大小不变,但每幅图像要处理的图像区域是变化的。切分区域的移动可由前面图像的计算结果来估计。要注意的是,由于使用动态图像区域,计算不同幅图像之间标记点之间距离时,其坐标转换关系是不同的,这一点在编程时需要加以关注。 

14.4  光学引伸计实例 

    实现光学引伸计可以先采集和保存图像,然后处理数据;也可以在实验过程中实时采集并处理数据,实时得到曲线。二者各有优缺点:数据后处理光学引伸计无需在实验过程处理图像,图像采集速率会稍高一些;另外,实验数据处理时可根据情况精心调节和改变数据处理参数,得到最好的结果,但是,这种方法无法实时显示实验结果,不能对实验结果有实时、直接的掌控和认识;实时测量光学引伸计与数据后处理光学引伸计的优缺点正好相反,使用时要根据不同的需求进行选择。 

14.4.1  数据后处理光学引伸计 

    先按14.2节中的方法采集图像。假设实验过程中共采集1 000幅图像,命名规则为:image_1.bmp,…,image_1000.bmp。其中一幅图像如图14-17所示。用如下的程序可实现应变的计算和存贮。 

%==================================================================% 
%% OpticaExtensometer.m 
%% 本程序用于实现光学引伸计图像的后处理,从图像数据中计算应变 
%% 本程序内部调用子函数 Locate.m 
%==================================================================% 
close all 
clear all 
clc 
%% 选取标记点的区域 
image = imread('image_1.bmp'); %读取图像 
[im1 r1]=imcrop(image); %选取标记点 1 的区域 
[im2 r2]=imcrop(image); %选取标记点 2 的区域 
%% 循环处理数据 
for i=1:1000 
    % 读取图像 
    imageName=strcat('image_',int2str(i),'.bmp') %将文件名写成字符串 
    image = imread(imageName); %读取图像 
    im1 = imcrop(image,r1); %选取标记点 1 的区域 
    im2 = imcrop(image,r2); %选取标记点 2 的区域
      % 计算标记点的灰度重心 
    th = 0.15; 
    [x1 y1] = Locate(im1,th); 
    [x2 y2] = Locate(im2,th); 
    % 求取两点间的距离 
    X1(i) = x1 r1(1); % 坐标转换 
    Y1(i) = y1 r1(2); % 坐标转换 
    X2(i) = x2 r2(1); % 坐标转换 
    Y2(i) = y2 r2(2); % 坐标转换 
    disy(i) = Y1-Y2; % 计算两个标记点在 y 方向的距离 
    %修改标记点区域的位置参数,避免出现标记点出框
     if i>2 
    r1(1)= r1(1) X1(i)-X1 (i-1); 
    r1(2)= r1(2) Y1(i)-Y1 (i-1); 
    r2(1)= r2(1) X2(i)-X2 (i-1); 
    r2(2)= r2(2) Y2(i)-Y2 (i-1); 
    end 
end 
strain=(disy-disy(1))/disy(1); % 计算每张图像中试件的应变值 
save('strain.txt','strain','-ascii') % 存储应变数据 
 
%==================================================================% 
%% 文件名 Locate.m 
%% 本函数为上述程序中,计算灰度重心的子函数 
%% 参数 image:切割后的用于计算的的图像 
%% 参数 threshold:灰度阈值  
%==================================================================% 
function [x, y] = Locate(image,threshold) 
    bw = im2bw(image, threshold); %对图像进行二值化处理 
    bw = 1-bw; %对二值化图像进行反色处理 
    % 计算灰度重心 
    sumb = sum(bw(:)); 
    [l,c] = size(bw); 
    [ii,jj] = meshgrid(1:c, 1:l); 
    sumii = sum(sum(ii.*bw)); 
    sumjj = sum(sum(jj.*bw));
    x = sumii/sumb; 
    y = sumjj/sumb;

14.4.2  实时测量光学引伸计 

    本部分给出一个利用DH-1300FM相机搭建的实时测量光学引伸计的例子。由于要在实验过程中绘图,用GUI进行了界面编程, 本部分只给出界面和说明(图14-25) ,具体程序可从网站上下载。 

image.png

图 14-25  使用 GUI 实现实时测量的光学引伸计 

14.5  光学引伸计测量实例 

    本节给出一个使用光学引伸计测量超高相对分子质量聚乙烯塑料应力-应变曲线的实例,并给出了具体的测量步骤和流程。 

14.5.1  实验布置与实验仪器 

    实验用试件如图14-26所示。实验时使用济南试金WDW3050试验机(最大载荷50 kN)对试件进行加载,加载速度1 mm/min。使用AVT相机(PIKE421B,分辨率2 048×2 048像素)和Sigma镜头(焦距105 mm)采集试件变形图像,图像采集速度设为0.1 fps,即10 s采集一幅图像。 

image.png

图 14-26  实验试件尺寸图 


试验机的加载曲线如图14-27所示,采集的其中一幅图像如图14-17所示。 

 image.png

图 14-27  试验加载曲线 

14.5.2  数据处理与分析 

    当实验结束后,从试验机输出加载数据文件中可读出每个数据点的采集时间和载荷数据,从图像数据文件中可读出每幅图像的数据和与之对应的采集时间。按前述方法处理图像,可得到应变数据文件,每个数据点包括时间和应变。

     数据处理的第一步是将这些数据结果读入,同时将载荷换算为应力。由于试验机和数字相机是两台 独立的设备,其采集速度并不相同(实际差别很大) ,因此得到的应力数据点和应变数据点在时间上是不对应的,无法直接画图。要实现应力和应变数据的一一对应,需要利用插值的方法将其在时间轴上对准,利用插值后的数据,画出实验结果,如图14-28所示。具体的程序范例如下: 

%==================================================================% 
%% StrainStressCal.m 
%% 本程序用于将载荷数据转换为应力,并通过时间与应变数据在时间轴上对准 
%==================================================================% 
close all 
clear all 
clc 
%% 读取数据 
data1=load('载荷时间数据.txt','-ascii'); % 读取数据 
data2=load('应变时间数据.txt','-ascii'); % 读取数据 
% 读取载荷和时间
time_force=data1(:,1); %单位为 s 
force=data1(:,2); %单位为 N 
stress=force/(pi*0.5*0.5);% 将载荷转换为应力,单位为 MPa 
% 读取应变和时间 
time_strain=data2(:,1); %单位为 s 
strain=data2(:,2); %单位 με 
%% 数据插值并绘制应力

image.png

图 14-28  最终绘制出的应力







图片

        过冷水发表于 仿真秀 平台原创文章,未经授权禁止私自转载,如需转载请需要和作者沟通表明授权声明,未授权文章皆视为侵权行为,必将追责。如果您希望加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载均可加群:*********。

精品回顾

 matlab绘制农夫过河动态图

分子动力学的原子空间运动轨迹演示编程

过冷水带你用matlab制作演示动画

python批量移动文件&重命名代码分享

过冷水和你分享 matlab读取存储各种文件的方法 文末有独家金曲分享

image.png


代码&命令MATLAB理论科普仿真体系
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-11-30
最近编辑:1年前
过冷水
博士 | 讲师 讨论号:927550334
获赞 361粉丝 184文章 107课程 11
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈