条纹投影三维测量相位展开方法
基于时间相位解包裹的条纹投影三维测量方法研究
![基于时间相位解包裹的条纹投影三维测量方法研究](https://img.taocdn.com/s3/m/98bcd368a32d7375a41780fe.png)
基于时间相位解包裹的条纹投影三维测量方法研究三维测量技术影响着生活方式、生产方式,其中具有非接触、快速、高精度、低成本、操作简单等优点的数字条纹投影三维形貌测量技术,更是成为了研究的热点,在快速测量、工业检测、质量控制、虚拟现实、反向工程、生物医学等领域被广泛应用。
随着生活质量的提高、工业生产的发展,对数字条纹投影三维形貌测量技术的要求越来越高,期望能够更快速,更高精度的测量。
在数字条纹投影三维形貌测量技术中具有较高的可靠性和测量精度的是基于时间相位解包裹方法的条纹投影测量技术。
但是,该方法投影和采集的条纹图数量较多,处理的数据量大、测量时间较长,无法进行快速、实时和动态测量。
本论文针对基于时间相位解包裹方法的条纹投影测量技术实现快速,高精度测量的关键问题展开研究。
1.详细研究线性增长法、拟合指数法、拟合负指数法时间相位解包裹方法的原理,这些方法需要采集和处理大量的数据,测量速度慢。
基于此,本文提出一种如何减少数据获取时间的方法。
该方法在四步相移条纹的基础上增加了两幅条纹图,六幅条纹图可以得到一个包裹相位和一个辅助相位,利用两相位间的联系能够得到一个频率是包裹相位一半的新的包裹相位。
也就是说,该方法的一套条纹可以得到两个不同频率的包裹相位。
拟合指数法、拟合负指数法需要log<sub>2</sub> s(s为条纹的最大周期数)套条纹,在采用四步相移的情况下,则需要4log<sub>2</sub> s幅条纹图。
而本方法需要3log<sub>2</sub> s,减少了log<sub>2</sub> s幅条纹图,可以缩短投影和采集时间、数据处理时间,一定程度上提高测量速度。
通过实验证明了该方法的可行性。
2.详细阐述了双频外差法和三频外差法的原理,并分析了每种方法的不足。
双频外差方法中相位主值的误差限制了使用高频条纹进行高精度的测量,三频外差方法,虽然可以使用高频条纹,但是两次的外差操作会放大主值相位的误差,可能会造成外差相位不够准确,进而会使展开的连续相位出现跳跃性误差。
相移条纹投影三维形貌测量技术综述
![相移条纹投影三维形貌测量技术综述](https://img.taocdn.com/s3/m/55e9f26aa36925c52cc58bd63186bceb19e8ed3c.png)
相移条纹投影三维形貌测量技术综述毛翠丽;卢荣胜;董敬涛;张育中【摘要】结构光三维形貌测量系统目前得到了越来越广泛的应用和研究,相移条纹投影三维形貌精密测量技术是其重要的发展方向.对结构光相移条纹投影三维形貌测量系统的应用发展、工作过程、不同系统构成方式、相移条纹的各种形式及特点、相位误差校正方法、不同相位解包裹算法及其优缺点和适用场合、测量系统数学模型的实现方法及其相应的优缺点、高动态范围测量技术等进行了详细的分析.对相移条纹投影系统的工作流程、实现方法、关键技术的发展及其存在问题等进行了比较全面的梳理,为三维形貌精密测量技术进一步满足先进制造中更高精度的要求指出了后续的研究方向.【期刊名称】《计量学报》【年(卷),期】2018(039)005【总页数】13页(P628-640)【关键词】计量学;三维形貌测量;相移轮廓术;相移条纹;相位解包裹;误差修正【作者】毛翠丽;卢荣胜;董敬涛;张育中【作者单位】合肥工业大学仪器科学与光电工程学院,安徽合肥230009;南阳理工学院机械与汽车工程学院,河南南阳473004;合肥工业大学仪器科学与光电工程学院,安徽合肥230009;合肥工业大学仪器科学与光电工程学院,安徽合肥230009;合肥工业大学仪器科学与光电工程学院,安徽合肥230009【正文语种】中文【中图分类】TB92;TP391.41 引言光学三维形貌测量技术在工业三维测量、文物保护、逆向工程、质量控制、医疗诊断等众多领域中具有广泛的应用,随着计算机技术、投影技术、激光技术、数字图像获取设备等的快速发展,多种光学三维测量技术已经进入商业应用阶段,同时各种新的三维测量方法还在不断涌现。
光学三维测量方法是通过运用适当的光学和电子仪器非接触地获取被测物体形貌的方法和技术[1~2],主要分为被动三维测量和主动三维测量方法。
被动三维测量技术无需辅助的结构光照明设备,直接从多视角二维图像序列中提取物体的三维信息。
条纹投影三维测量相位展开方法
![条纹投影三维测量相位展开方法](https://img.taocdn.com/s3/m/a8ba3e01c850ad02de804163.png)
由于时间相位展开方法并不在 二维相位图中寻找展开路径,而 是沿着时间轴分别对每一个像素 进行相位展开,从而实现了各像 素点相互独立的相位展开,因此, 边界以及信噪比较低区域不会影 响其它较好的数据点,也即从算 法上避免了空间相位展开中误差 传播的发生。
条纹投影三维测量 相位展开方法
条纹投影三维测量的流程
• 对投影到被测物体表面的条纹图进行采集 • 通过计算采集到条纹图上点的相位得到折叠相位
图(方法:相移法、傅里叶变换法、小波变换法等) • 将折叠相位图展成展开相位图(方法:空间相位展开、
时间相位展开、相位跟踪等) • 通过已标定好的系统根据展开相位图得到采集的
5. BurtonnadLalor提出的多频傅里叶条纹分析法要求 向物体表面基于时间相位展开的三维轮廓测量研究投 射多于一种频率的条纹,这些频率条纹的不同空间频 率带宽可使它们在傅里叶变换的频域中完全分开,因 此从本质上来说,它也是时间相位展开方法。
时间相位展开的应用前景
时间相位展开方法的主要优点是简单,并且可以 很容易准确测量表面不连续物体的轮廓;它不仅可 用于静态物体的轮廓测量当中,还可以用于物体实 时动态测量,即实时的相位展开。
PU算法大体上分为两大类:空域相位展开和时域 相位展开。
空域展开只采用一幅折叠相位图,通过分析空域相 邻元素之间的相位值,根据相位连续性适当调整折 叠相位值,恢复出连续的相位分布;而时域相位展 开是将不同分辨力的折叠相位图沿时间轴展开。空源自相位展开一维空间相位展开的过程
相位展开(phaseunwrapping)算法研究与实践
![相位展开(phaseunwrapping)算法研究与实践](https://img.taocdn.com/s3/m/af237481cd22bcd126fff705cc17552707225e86.png)
相位展开(phaseunwrapping)算法研究与实践1. 什么是相位展开?相位展开(Phase Unwrapping)是⼀个经典的信号处理问题,它指的是从值区间中恢复原始相位值(原因在于:计算相位时,运⽤反正切函数,则相位图中提取的相位都是包裹在⼀个周期相位区间的包裹相位值,并不是真实得到的相位)。
⼆维相位展开问题⼴泛存在于诸如光学测量技术(数字全息⼲涉和条纹投影轮廓术、合成孔径雷达(SAR)[2]和磁共振成像(MRI)[3]...)等许多应⽤中。
从这些应⽤中估算出的相位与考虑到的物体形状、地形⾼程和磁场不均匀性等物理参数有关。
理想情况下,相位展开可以通过在每个像素上根据相邻像素之间的相位差加减来实现(最简单的⼆维相位展开就是将这个⼆维展开的问题划为两个⼀位相位展开,即⾸先在⾏⽅向或者列⽅向进⾏⼀维相位展开,然后将得到的⼀列值或者⼀⾏值在另⼀个⽅向进⾏⼀维相位展开,得到展开好的⼆维图像)。
然⽽,在实际应⽤中,相位展开是⼀个⾮常具有挑战性的问题,因为存在噪声严重、相位突变和相位不连续等情况。
2.相位展开应⽤场景(以光学三维测量为例)(具体原理图省略...),原⽂算法是⽤C编写,MATLAB调⽤的算法://This program is written by Munther Gdeisat etc. to program the two-dimensional unwrapper//entitled "Fast two-dimensional phase-unwrapping algorithm based on sorting by//reliability following a noncontinuous path"//by M. A. Herraez, D. R. Burton, M. J. Lalor, and M. A. Gdeisat//published in the Applied Optics, Vol. 41, No. 35, pp. 7437, 2002.//This program is written on 15th August 2007//The wrapped phase map is floating point data type. Also, the unwrapped phase map is foloating point#include <malloc.h>#include<stdio.h>#include <stdlib.h>#include <string.h>#include "mex.h" //--This one is requiredstatic float PI = 3.141592654;static float TWOPI = 6.283185307;//pixel informationstruct PIXEL{//int x; //x coordinate of the pixel//int y; //y coordinateint increment; //No. of 2*pi to add to the pixel to unwrap itint number_of_pixels_in_group; //No. of pixels in the pixel groupfloat value; //value of the pixelfloat reliability;int group; //group No.int new_group;struct PIXEL *head; //pointer to the first pixel in the group in the linked liststruct PIXEL *last; //pointer to the last pixel in the groupstruct PIXEL *next; //pointer to the next pixel in the group};//the EDGE is the line that connects two pixels.//if we have S PIXELs, then we have S horizental edges and S vertical edgesstruct EDGE{float reliab; //reliabilty of the edge and it depends on the two pixelsPIXEL *pointer_1; //pointer to the first pixelPIXEL *pointer_2; //pointer to the second pixelint increment; //No. of 2*pi to add to one of the pixels to unwrap it with respect to the second};//another version of Mixtogether but this function should only be use with the sort programvoid Mix(EDGE *Pointer1, int *index1, int *index2, int size){int counter2 = 0;int *TemporalPointer = index1;int *Result = (int *)calloc(size * 2, sizeof(int));int *Follower = Result;while ((counter1 < size) && (counter2 < size)){if ((Pointer1[*(index1 + counter1)].reliab <= Pointer1[*(index2 + counter2)].reliab)) {*Follower = *(index1 + counter1);Follower++;counter1++;}else{*Follower = *(index2 + counter2);Follower++;counter2++;}}//whileif (counter1 == size){memcpy(Follower, (index2 + counter2), sizeof(int)*(size - counter2));}else{memcpy(Follower, (index1 + counter1), sizeof(int)*(size - counter1));}Follower = Result;index1 = TemporalPointer;int i;for (i = 0; i < 2 * size; i++){*index1 = *Follower;index1++;Follower++;}free(Result);}//this is may be the fastest sort program;//see the explination in quickSort function belowvoid sort(EDGE *Pointer, int *index, int size){if (size == 2){if ((Pointer[*index].reliab) > (Pointer[*(index + 1)].reliab)){int Temp;Temp = *index;*index = *(index + 1);*(index + 1) = Temp;}}else if (size > 2){sort(Pointer, index, size / 2);sort(Pointer, (index + (size / 2)), size / 2);Mix(Pointer, index, (index + (size / 2)), size / 2);}}//this function tries to implement a nice idea explained below//we need to sort edge array. Each edge element conisists of 16 bytes.//In normal sort program we compare two elements in the array and exchange//their place under some conditions to do the sorting. It is very probable// that an edge element may change its place hundred of times which makes//the sorting a very time consuming operation. The idea in this function//is to give each edge element an index and move the index not the edge//element. The edge need 4 bytes which makes the sorting operation faster.// After finishingthe sorting of the indexes, we know the position of each index. //So we know how to sort edgesvoid quick_sort(EDGE *Pointer, int size){int *index = (int *)calloc(size, sizeof(int));int i;for (i = 0; i < size; ++i)sort(Pointer, index, size);EDGE * a = (EDGE *)calloc(size, sizeof(EDGE));for (i = 0; i < size; ++i)a[i] = Pointer[*(index + i)];memcpy(Pointer, a, size * sizeof(EDGE));free(index);free(a);}void read_data(char *inputfile, float *Data, int length){printf("Reading the Wrapped Values form Binary File.............>"); FILE *ifptr;ifptr = fopen(inputfile, "rb");if (ifptr == NULL) printf("Error opening the file\n");fread(Data, sizeof(float), length, ifptr);fclose(ifptr);printf(" Done.\n");}void write_data(char *outputfile, float *Data, int length){printf("Writing the Unwrapped Values to Binary File.............>"); FILE *ifptr;ifptr = fopen(outputfile, "wb");if (ifptr == NULL) printf("Error opening the file\n");fwrite(Data, sizeof(float), length, ifptr);fclose(ifptr);printf(" Done.\n");}//---------------start quicker_sort algorithm --------------------------------#define swap(x,y) {EDGE t; t=x; x=y; y=t;}#define order(x,y) if (x.reliab > y.reliab) swap(x,y)#define o2(x,y) order(x,y)#define o3(x,y,z) o2(x,y); o2(x,z); o2(y,z)typedef enum { yes, no } yes_no;yes_no find_pivot(EDGE *left, EDGE *right, float *pivot_ptr){EDGE a, b, c, *p;a = *left;b = *(left + (right - left) / 2);c = *right;o3(a, b, c);if (a.reliab < b.reliab){*pivot_ptr = b.reliab;return yes;}if (b.reliab < c.reliab){*pivot_ptr = c.reliab;return yes;}for (p = left + 1; p <= right; ++p){if (p->reliab != left->reliab){*pivot_ptr = (p->reliab < left->reliab) ? left->reliab : p->reliab;return yes;}return no;}}EDGE *partition(EDGE *left, EDGE *right, float pivot){while (left <= right){while (left->reliab < pivot)++left;while (right->reliab >= pivot)--right;if (left < right){swap(*left, *right);++left;--right;}}return left;}void quicker_sort(EDGE *left, EDGE *right){EDGE *p;float pivot;if (find_pivot(left, right, &pivot) == yes){p = partition(left, right, pivot);quicker_sort(left, p - 1);quicker_sort(p, right);}}//--------------end quicker_sort algorithm -----------------------------------//--------------------start initialse pixels ----------------------------------//initialse pixels. See the explination of the pixel class above.//initially every pixel is a gorup by its selfvoid initialisePIXELs(float *WrappedImage, PIXEL *pixel, int image_width, int image_height) {PIXEL *pixel_pointer = pixel;float *wrapped_image_pointer = WrappedImage;int i, j;for (i = 0; i < image_height; i++){for (j = 0; j < image_width; j++){//pixel_pointer->x = j;//pixel_pointer->y = i;pixel_pointer->increment = 0;pixel_pointer->number_of_pixels_in_group = 1;pixel_pointer->value = *wrapped_image_pointer;pixel_pointer->reliability = 9999999 + rand();pixel_pointer->head = pixel_pointer;pixel_pointer->last = pixel_pointer;pixel_pointer->next = NULL;pixel_pointer->new_group = 0;pixel_pointer->group = -1;pixel_pointer++;wrapped_image_pointer++;}}}//-------------------end initialise pixels -----------//gamma function in the paperfloat wrap(float pixel_value){float wrapped_pixel_value;if (pixel_value > PI) wrapped_pixel_value = pixel_value - TWOPI;else if (pixel_value < -PI) wrapped_pixel_value = pixel_value + TWOPI;else wrapped_pixel_value = pixel_value;return wrapped_pixel_value;}// pixelL_value is the left pixel, pixelR_value is the right pixelint find_wrap(float pixelL_value, float pixelR_value){float difference;int wrap_value;difference = pixelL_value - pixelR_value;if (difference > PI) wrap_value = -1;else if (difference < -PI) wrap_value = 1;else wrap_value = 0;return wrap_value;}void calculate_reliability(float *wrappedImage, PIXEL *pixel, int image_width, int image_height) {int image_width_plus_one = image_width + 1;int image_width_minus_one = image_width - 1;PIXEL *pixel_pointer = pixel + image_width_plus_one;float *WIP = wrappedImage + image_width_plus_one; //WIP is the wrapped image pointerfloat H, V, D1, D2;int i, j;for (i = 1; i < image_height - 1; ++i){for (j = 1; j < image_width - 1; ++j){H = wrap(*(WIP - 1) - *WIP) - wrap(*WIP - *(WIP + 1));V = wrap(*(WIP - image_width) - *WIP) - wrap(*WIP - *(WIP + image_width));D1 = wrap(*(WIP - image_width_plus_one) - *WIP) - wrap(*WIP - *(WIP + image_width_plus_one));D2 = wrap(*(WIP - image_width_minus_one) - *WIP) - wrap(*WIP - *(WIP + image_width_minus_one)); pixel_pointer->reliability = H * H + V * V + D1 * D1 + D2 * D2;pixel_pointer++;WIP++;}pixel_pointer += 2;WIP += 2;}}//calculate the reliability of the horizental edges of the image//it is calculated by adding the reliability of pixel and the relibility of//its right neighbour//edge is calculated between a pixel and its next neighbourvoid horizentalEDGEs(PIXEL *pixel, EDGE *edge, int image_width, int image_height){int i, j;EDGE *edge_pointer = edge;PIXEL *pixel_pointer = pixel;for (i = 0; i < image_height; i++){for (j = 0; j < image_width - 1; j++){edge_pointer->pointer_1 = pixel_pointer;edge_pointer->pointer_2 = (pixel_pointer + 1);edge_pointer->reliab = pixel_pointer->reliability + (pixel_pointer + 1)->reliability;edge_pointer->increment = find_wrap(pixel_pointer->value, (pixel_pointer + 1)->value);pixel_pointer++;edge_pointer++;}pixel_pointer++;}}//calculate the reliability of the vertical EDGEs of the image//it is calculated by adding the reliability of pixel and the relibility of//its lower neighbour in the image.void verticalEDGEs(PIXEL *pixel, EDGE *edge, int image_width, int image_height){int i, j;PIXEL *pixel_pointer = pixel;EDGE *edge_pointer = edge + (image_height) * (image_width - 1);for (i = 0; i < image_height - 1; i++){for (j = 0; j < image_width; j++){edge_pointer->pointer_1 = pixel_pointer;edge_pointer->pointer_2 = (pixel_pointer + image_width);edge_pointer->reliab = pixel_pointer->reliability + (pixel_pointer + image_width)->reliability;edge_pointer->increment = find_wrap(pixel_pointer->value, (pixel_pointer + image_width)->value);pixel_pointer++;edge_pointer++;} //j loop} // i loop}//gather the pixels of the image into groupsvoid gatherPIXELs(EDGE *edge, int image_width, int image_height){int k;//Number of rialiable edges (not at the borders of the image)int no_EDGEs = (image_width - 1) * (image_height)+(image_width) * (image_height - 1);PIXEL *PIXEL1;PIXEL *PIXEL2;PIXEL *group1;PIXEL *group2;EDGE *pointer_edge = edge;int incremento;for (k = 0; k < no_EDGEs; k++){PIXEL1 = pointer_edge->pointer_1;PIXEL2 = pointer_edge->pointer_2;//PIXEL 1 and PIXEL 2 belong to different groups//initially each pixel is a group by it self and one pixel can construct a group//no else or else if to this ifif (PIXEL2->head != PIXEL1->head){//PIXEL 2 is alone in its group//merge this pixel with PIXEL 1 group and find the number of 2 pi to add//to or subtract to unwrap itif ((PIXEL2->next == NULL) && (PIXEL2->head == PIXEL2)){PIXEL1->head->last->next = PIXEL2;PIXEL1->head->last = PIXEL2;(PIXEL1->head->number_of_pixels_in_group)++;PIXEL2->head = PIXEL1->head;PIXEL2->increment = PIXEL1->increment - pointer_edge->increment;}//PIXEL 1 is alone in its group//merge this pixel with PIXEL 2 group and find the number of 2 pi to add//to or subtract to unwrap itelse if ((PIXEL1->next == NULL) && (PIXEL1->head == PIXEL1)){PIXEL2->head->last->next = PIXEL1;PIXEL2->head->last = PIXEL1;(PIXEL2->head->number_of_pixels_in_group)++;PIXEL1->head = PIXEL2->head;PIXEL1->increment = PIXEL2->increment + pointer_edge->increment;}//PIXEL 1 and PIXEL 2 both have groupselse{group1 = PIXEL1->head;group2 = PIXEL2->head;//the no. of pixels in PIXEL 1 group is large than the no. of PIXELs//in PIXEL 2 group. Merge PIXEL 2 group to PIXEL 1 group//and find the number of wraps between PIXEL 2 group and PIXEL 1 group//to unwrap PIXEL 2 group with respect to PIXEL 1 group.//the no. of wraps will be added to PIXEL 2 grop in the futureif (group1->number_of_pixels_in_group > group2->number_of_pixels_in_group){//merge PIXEL 2 with PIXEL 1 groupgroup1->last->next = group2;group1->last = group2->last;group1->number_of_pixels_in_group = group1->number_of_pixels_in_group + group2->number_of_pixels_in_group; incremento = PIXEL1->increment - pointer_edge->increment - PIXEL2->increment;//merge the other pixels in PIXEL 2 group to PIXEL 1 groupwhile (group2 != NULL){group2->head = group1;group2->increment += incremento;group2 = group2->next;}}//the no. of PIXELs in PIXEL 2 group is large than the no. of PIXELs//in PIXEL 1 group. Merge PIXEL 1 group to PIXEL 2 group//and find the number of wraps between PIXEL 2 group and PIXEL 1 group//to unwrap PIXEL 1 group with respect to PIXEL 2 group.//the no. of wraps will be added to PIXEL 1 grop in the futureelse{//merge PIXEL 1 with PIXEL 2 groupgroup2->last->next = group1;group2->last = group1->last;group2->number_of_pixels_in_group = group2->number_of_pixels_in_group + group1->number_of_pixels_in_group; incremento = PIXEL2->increment + pointer_edge->increment - PIXEL1->increment;//merge the other pixels in PIXEL 2 group to PIXEL 1 groupwhile (group1 != NULL){group1->head = group2;group1->increment += incremento;group1 = group1->next;} // while} // else} //else};//ifpointer_edge++;}}//unwrap the imagevoid unwrapImage(PIXEL *pixel, int image_width, int image_height){int i;int image_size = image_width * image_height;PIXEL *pixel_pointer = pixel;for (i = 0; i < image_size; i++){pixel_pointer->value += TWOPI * (float)(pixel_pointer->increment);pixel_pointer++;}}//the input to this unwrapper is an array that contains the wrapped phase map.//copy the image on the buffer passed to this unwrapper to over write the unwrapped//phase map on the buffer of the wrapped phase map.void returnImage(PIXEL *pixel, float *unwrappedImage, int image_width, int image_height){int i;int image_size = image_width * image_height;float *unwrappedImage_pointer = unwrappedImage;PIXEL *pixel_pointer = pixel;for (i = 0; i < image_size; i++){*unwrappedImage_pointer = pixel_pointer->value;pixel_pointer++;unwrappedImage_pointer++;}}//the main function of the unwrappervoid mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){//Declarations of getting two arrays from Matlab//1)input wrapped image of type float and 2)mask of type unsigned charfloat *WrappedImage = (float *)mxGetData(prhs[0]);int image_width = mxGetM(prhs[0]);int image_height = mxGetN(prhs[0]);//declare a place to store the unwrapped image and return it to Matlabconst mwSize *dims = mxGetDimensions(prhs[0]);plhs[0] = mxCreateNumericArray(2, dims, mxSINGLE_CLASS, mxREAL);float *UnwrappedImage = (float *)mxGetPr(plhs[0]);int i, j;int image_size = image_height * image_width;int two_image_size = 2 * image_size;int No_of_Edges = (image_width)*(image_height - 1) + (image_width - 1)*(image_height);PIXEL *pixel = (PIXEL *)calloc(image_size, sizeof(PIXEL));EDGE *edge = (EDGE *)calloc(No_of_Edges, sizeof(EDGE));;//initialise the pixelsinitialisePIXELs(WrappedImage, pixel, image_width, image_height);calculate_reliability(WrappedImage, pixel, image_width, image_height);horizentalEDGEs(pixel, edge, image_width, image_height);verticalEDGEs(pixel, edge, image_width, image_height);//sort the EDGEs depending on their reiability. The PIXELs with higher relibility (small value) first //if your code stuck because of the quicker_sort() function, then use the quick_sort() function//run only one of the two functions (quick_sort() or quicker_sort() )//quick_sort(edge, No_of_Edges);quicker_sort(edge, edge + No_of_Edges - 1);//gather PIXELs into groupsgatherPIXELs(edge, image_width, image_height);//unwrap the whole imageunwrapImage(pixel, image_width, image_height);//copy the image from PIXEL structure to the wrapped phase array passed to this function returnImage(pixel, UnwrappedImage, image_width, image_height);free(edge);free(pixel);return;}。
实验讲义_条纹投影三维面性测量实验
![实验讲义_条纹投影三维面性测量实验](https://img.taocdn.com/s3/m/e3894a742e3f5727a5e962f2.png)
光学传感三维面形测量实验GCS-SWCL实验讲义大恒新纪元科技股份有限公司版权所有不得翻印光学传感三维面形测量1. 引言非接触三维自动测量是随着计算机技术的发展而开展起来的新技术研究,它包括三维形体测量﹑应力形变分析和折射率梯度测量等方面。
应用到的技术有莫尔条纹、散斑干涉、全息干涉和光阑投影等光学技术和计算机条纹图像处理技术。
条纹投影以及各种光阑投影自动测量技术在工业生产控制与检测、医学诊断和机器人视觉等领域正占有越来越重要的地位。
本试验是利用投影式相移技术,对形成的被测物面条纹进行计算机相移法自动处理的综合性实验。
2. 实验目的通过本实验了解投影光栅相位法的形成机理;了解一种充分发挥计算机特长的条纹投影相位移处理技术。
对于非接触测量有一定的感性认识。
3. 基本原理投影光栅相位法是三维轮廓测量中的热点之一,其测量原理是光栅图样投射到被测物体表面,相位和振幅受到物面高度的调制使光栅像发生变形,通过解调可以得到包含高度信息的相位变化,最后根据三角法原理完成相位---高度的转换。
根据相位检测方法的不同,主要有Moire轮廓术、Fourier变换轮廓术,相位测量轮廓术,本实验就是采用了相位测量轮廓术。
相位测量轮廓术采用正弦光栅投影相移技术。
基本原理是利用条纹投影相移技术将投影到物体上的正弦光栅依次移动一定的相位,由采集到的移相变形条纹图计算得到包含物体高度信息的相位。
基于相位测量的光学三维测量技术本质上仍然是光学三角法,但与光学三角法的轮廓术有所不同,它不直接去寻找和判断由于物体高度变动后的像点,而是通过相位测量间接地实现,由于相位信息的参与,使得这类方法与单纯基于光学三角法有很大区别。
相位测量轮廓术的基本原理将规则光栅图像投射到被测物表面,从另一角度可以观察到由于受物体高度的影响而引起的条纹变形。
这种变形可解释为相位和振幅均被调制的空间载波信号。
采集变形条纹并对其进行解调,从中恢复出与被测物表面高度变化有关的相位信息,然后由相位与高度的关系确定出高度,这就是相位测量轮廓术的基本原理。
先验知识辅助的条纹投影动态三维形貌测量
![先验知识辅助的条纹投影动态三维形貌测量](https://img.taocdn.com/s3/m/712a8c00effdc8d376eeaeaad1f34693daef1014.png)
先验知识辅助的条纹投影动态三维形貌测量楚冬娅;张广汇;宋仁杰;张晓松;应晓霖;李勇【期刊名称】《光电工程》【年(卷),期】2022(49)8【摘要】为改进条纹投影动态三维测量系统性能,根据动态物体三维形貌测量的特点提出了两步法测量方案:1)通过测量运动前物体或CAD模型,获得物体初始三维形貌及二维图像中特征点对应的三维坐标;2)进行物体运动变化过程的三维测量。
通过检测动态图像中的特征点,根据二维、三维坐标对应关系计算物体不同时刻的运动参数,再由初始形貌估计出物体的近似形貌,以此来计算该时刻条纹图的近似相位。
然后结合该近似相位及实际条纹的截断相位计算得到展开相位,最后获得该时刻物体的三维形貌。
与时间相位展开法相比,该方案在相同测量精度下提高了测量速度;而与空间相位展开法相比,该方案在相同测量速度下提高了测量可靠度,并且不受条纹不连续影响。
采用DLP投影仪和高速摄像机搭建了静态、动态双模式三维测量系统,实现了1280×1024点及70 f/s的三维形貌测量。
实验结果表明该方案不但可以对刚体运动物体进行测量,而且对非刚体运动物体,只要其形变引起的条纹变化不超过半个周期也能够测量。
同时,提出的方法对相邻时刻物体位姿变化有较大的容限。
【总页数】9页(P55-63)【作者】楚冬娅;张广汇;宋仁杰;张晓松;应晓霖;李勇【作者单位】浙江师范大学信息光学研究所;浙江省光信息检测与显示技术重点实验室【正文语种】中文【中图分类】TN206【相关文献】1.相移条纹投影三维形貌测量技术综述2.条纹投影三维形貌测量的变分模态分解相位提取3.基于数字条纹投影的三维形貌测量技术研究与实现4.基于二进制条纹加相位编码条纹离焦投影的三维测量方法5.基于彩色条纹投影术的三维形貌测量因版权原因,仅展示原文概要,查看原文内容请购买。
用于三维测量的快速相位解包裹算法
![用于三维测量的快速相位解包裹算法](https://img.taocdn.com/s3/m/783347e6900ef12d2af90242a8956bec0975a59b.png)
用于三维测量的快速相位解包裹算法王霖;韩旭;伏燕军;黄春志;史耀群【摘要】减少条纹投影轮廓术的条纹图数量一直是本领域的研究热点.传统的时间相位解包裹算法,一般需要额外的条纹信息来确定条纹级次,导致条纹图数量过多.提出一种用于三维测量的快速相位解包裹算法,只需要N步标准相移正弦条纹图,就可以完成绝对相位的计算.首先,利用标准相移算法计算包裹相位和消除背景的掩膜;然后,直接利用包裹相位和掩膜,根据连通域标记算法计算条纹级次,进而求得绝对相位.该方法最少只需3幅条纹图,就可以完成三维测量,数据处理速度快.计算机仿真和实验结果验证了该方法的有效性和鲁棒性.【期刊名称】《应用光学》【年(卷),期】2019(040)002【总页数】7页(P271-277)【关键词】三维测量;相位解包裹;条纹投影;相移【作者】王霖;韩旭;伏燕军;黄春志;史耀群【作者单位】南昌航空大学无损检测技术教育部重点实验室,江西南昌330063;南昌航空大学测试与光电工程学院,江西南昌330063;南昌航空大学无损检测技术教育部重点实验室,江西南昌330063;南昌航空大学测试与光电工程学院,江西南昌330063;南昌航空大学无损检测技术教育部重点实验室,江西南昌330063;南昌航空大学测试与光电工程学院,江西南昌330063;南昌航空大学无损检测技术教育部重点实验室,江西南昌330063;南昌航空大学测试与光电工程学院,江西南昌330063;南昌航空大学无损检测技术教育部重点实验室,江西南昌330063;南昌航空大学测试与光电工程学院,江西南昌330063【正文语种】中文【中图分类】TN29;TP274引言条纹投影三维测量方法,又称条纹投影轮廓术(FPP),具有非接触、低成本、高精度和高效率的优点,因此被广泛应用在三维测量中[1-4]。
通过投影仪将条纹投影到被测物体表面,条纹由于受物体高度的调制发生变形。
相机采集变形的条纹图像,然后通过计算机对其进行处理,解调出物体高度的相位信息,再结合系统标定参数获得物体的三维高度信息[1-2]。
大学物理实验实验条纹投影三维测量介绍课件
![大学物理实验实验条纹投影三维测量介绍课件](https://img.taocdn.com/s3/m/047e496ef11dc281e53a580216fc700abb6852b7.png)
实验结果分析难度较大:实验结果需要进行复杂的数据处理和分析,难度较大
实验改进方向:提高仪器精度,优化实验方法,缩短实验时间,降低实验环境要求,提高实验结果的可重复性和准确性。
谢谢
调整相机参数:设置相机的曝光时间、光圈大小、ISO等参数,确保拍摄效果清晰
调整投影参数:调整投影机的焦距、亮度、对比度等参数,确保投影效果清晰
调整测量参数:设置测量软件的参数,如测量范围、精度等,确保测量结果准确
采集实验数据
准备实验器材:激光器、透镜、CCD相机等
调整实验参数:激光功率、透镜焦距等
采集实验数据:拍摄实验图像,记录数据
分析实验数据:使用图像处理软件分析图像,获取条纹信息
计算实验结果:根据条纹信息计算三维坐标
验证实验结果:与理论值进行对比,验证实验结果的准确性
数据处理与分析
数据处理方法
平均法:对数据进行平均,以减少误差
1
加权平均法:根据数据的重要性进行加权平均,以提高精度
2
标准差法:计算数据的标准差,以衡量数据的离散程度
相机:捕捉条纹图像
计算机:处理图像,计算三维数据
显示器:显示三维数据结果
控制电路:控制实验过程
测量设备:测量实验结果
安全设备:保护实验人员安全
实验步骤
准备实验器材
激光器:产生激光光源
投影仪:将激光投影到屏幕上
计算机:处理图像数据,进行三维测量分析
相机:拍摄投影图像
调整实验参数
调整光源强度:根据实验需求,调整光源的亮度和色温
03
实验结果的实际应用及意义
04
实验拓展与应用
实验拓展方向
三灰度编码相位展开方法条纹投影轮廓术
![三灰度编码相位展开方法条纹投影轮廓术](https://img.taocdn.com/s3/m/5754062b78563c1ec5da50e2524de518974bd340.png)
第30卷第5期2022年3月Vol.30No.5Mar.2022光学精密工程Optics and Precision Engineering三灰度编码相位展开方法条纹投影轮廓术张昂,孙亚琴,高楠*,孟召宗,张宗华(河北工业大学机械工程学院,天津300130)摘要:为了通过减少条纹投影轮廓术所需投影和采集的条纹图像数量,提高三维测量速度,提出了一种用于条纹投影轮廓术的三灰度编码相位展开方法。
投影仪投射5幅条纹图像到被测物体表面,包括三幅正弦相移条纹图像和两幅三灰度编码图像,由相机采集经物体表面调制的变形条纹图。
通过相机采集到的三幅变形正弦相移条纹图像计算包裹相位。
通过相机采集的三灰度编码图像,经过空间灰度平均、灰度三值化、灰色伪码去除后得到三灰度编码值,在获得编码值后利用编码值的空间邻域信息进行解码后得到展开相位级次,对包裹相位进行相位展开。
将由对准误差导致的错误相位点去除后得到最终的展开相位。
最后,通过系统标定得到的标定系数和最终的展开相位得到被测物体表面的三维形貌。
实验结果表明,与最佳三条纹结合四步相移方法相比,该方法在测量精度相当的情况下,测量速度提升了2.4倍。
本文所提方法在不牺牲测量精度的同时,提高了三维形貌测量的效率,对复杂形面的快速测量具有实际应用价值。
关键词:条纹投影轮廓术;三灰度编码;相位展开;错误相位点中图分类号:TP394.1;TH691.9文献标识码:A doi:10.37188/OPE.20223005.0518Fringe projection profilometry byternary-gray encoded phase unwrapping methodZHANG Ang,SUN Yaqin,GAO Nan*,MENG Zhaozong,ZHANG Zonghua (School of Mechanical Engineering,Hebei University of Technology,Tianjin300130,China)Corresponding author,E-mail:ngao@Abstract:Multiple fringe images are required in fringe projection profilometry for time phase expansion. To obtain faster three-dimensional(3D)measurement by reducing the number of fringe images projected and collected by fringe projection profilometry,in this paper,a ternary-gray encoded phase unwrapping method was proposed for fringe projection profilometry.First,five fringe images were projected by the projector onto the surface of the measured object,which included three sinusoidal phase-shift fringe images and two ternary-gray encoded images.The deformed fringe images modulated by the surface of the object were collected by a camera.Second,the wrapped phase was calculated from the three deformed sinusoidal phase-shift fringe images collected by the camera.After spatial gray averaging,gray ternarization,gray pseudocode removal,the ternary-gray encoding value was obtained using the ternary-gray encoded images collected by the camera.After obtaining the encoding value,the spatial neighborhood information of the encoding value was decoded to obtain the unwrap phase level,and the wrapped phase was unfolded.The ultimate unwrap phase result was obtained by removing the incorrect phase points caused by the alignment 文章编号1004-924X(2022)05-0518-09收稿日期:2021-08-19;修订日期:2021-09-16.基金项目:国家重点研发计划资助项目(No.2017YFF0106404);国家自然科学基金资助项目(No.51675160)第5期张昂,等:三灰度编码相位展开方法条纹投影轮廓术error.Third,the3D topography of the measured object surface was obtained through the calibration coeffi⁃cients obtained by the system calibration and the ultimate unwrap phase.The experimental results showed that,compared with the optimum three-frequency with four-step phase shift method,the method proposed in this paper not only had the same measurement accuracy but improved the measurement speed by2.4 times.The proposed method improved the efficiency of3D topography measurement without reducing the measurement accuracy.It has practical application value for the rapid measurement of complex surfaces. Key words:fringe projection profilometry;ternary-gray encoded;phase unwrapping;wrong phase points1引言条纹投影轮廓术[1]具有非接触、高精度等优点,被广泛应用在光学三维形貌测量中。
条纹投影技术的测量流程
![条纹投影技术的测量流程](https://img.taocdn.com/s3/m/280b099259f5f61fb7360b4c2e3f5727a4e92467.png)
条纹投影技术的测量流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!条纹投影技术是一种非接触式的三维测量技术,它通过向被测物体投射条纹图案,并使用相机捕捉反射或透射的条纹图像,来获取物体的三维形状信息。
基于光学条纹投影和反射的三维形貌测量方法及设备的制作流程
![基于光学条纹投影和反射的三维形貌测量方法及设备的制作流程](https://img.taocdn.com/s3/m/ca3de976102de2bd960588a6.png)
本技术公开了一种基于光学条纹投影和反射的三维形貌测量方法及装置。
该装置包括电脑、可见光投影仪、CCD彩色相机、显示屏、待测漫反射物体固定装置和待测镜面反射物体固定装置;所述电脑分别与投影仪、相机和显示屏连接;所述投影仪和相机安装于光学平台上;所述显示屏固定于光学平台的精密水平移动台上;所述投影仪、相机和显示屏位于同一侧,相机位于投影仪和显示屏之间;所述待测漫反射物体固定装置和待测镜面反射物体固定装置放置于光学平台上;相机的光轴分别与显示屏所在平面的法向量和投影仪的光轴之间的夹角成锐角。
该方法既能测量漫反射物体、镜面反射物体又能同时测量两种反射性质的物体,实现了柔性测量和集成测量。
技术要求1.一种基于光学条纹投影和反射的三维形貌测量装置,其特征在于该装置包括电脑、可见光投影仪、CCD彩色相机、显示屏、待测漫反射物体固定装置和待测镜面反射物体固定装置;所述电脑分别与投影仪、相机和显示屏连接;所述投影仪和相机安装于光学平台上;所述显示屏固定于光学平台的精密水平移动台上;所述投影仪、相机和显示屏位于同一侧,相机位于投影仪和显示屏之间;所述待测漫反射物体固定装置和待测镜面反射物体固定装置放置于光学平台上;相机的光轴分别与显示屏所在平面的法向量和投影仪的光轴之间的夹角成锐角。
2.根据权利要求1所述的基于光学条纹投影和反射的三维形貌测量装置,其特征在于,相机的光轴与显示屏所在平面的法向量之间的夹角为20°-45°,相机的光轴与投影仪的光轴之间的夹角为25°-60°。
3.根据权利要求1所述的基于光学条纹投影和反射的三维形貌测量装置,其特征在于所述投影仪为TI生产的型号为lightcrafter4500的DLP数字投影仪,与电脑通过USB线连接,通过棒体夹持器与光学平台上的支撑棒连接。
4.根据权利要求1所述的基于光学条纹投影和反射的三维形貌测量装置,其特征在于所述相机为型号SVCam-ECO655的彩色相机,与电脑的千兆网口连接,通过棒体夹持器与光学平台上的支撑棒连接。
条纹法之相位法
![条纹法之相位法](https://img.taocdn.com/s3/m/b5332936a517866fb84ae45c3b3567ec102ddc30.png)
条纹法之相位法
条纹法之相位法是一种用来测量光学器件或表面形貌的非接触式测量方法。
它基于条纹间的光学相位差来推断被测物体的高度或曲率等参数。
相位法通常涉及以下步骤:
1. 通过一个干涉系统产生参考光束和反射光束。
通常使用激光或白光作为光源。
2. 反射光束与参考光束在被测物体表面相交,形成明暗相间的干涉条纹图案。
这些条纹的间距与被测物体表面的高度差有关。
3. 检测和分析条纹图案的相位差。
相位差可以通过相位移量、准直光束的改变或时间的变化等方式来获得。
4. 基于相位差,使用相位解包或相位展开等算法来计算被测物体表面的高度或形貌。
这些算法可以通过数学方法或计算机处理来实现。
相位法具有高精度、非接触等优点,可以应用于检测微小变形、薄膜厚度、粗糙度、形貌等。
它在制造、质量控制、表面测量等领域有广泛的应用。
新的基于条纹投影轮廓测量的系统标定方法
![新的基于条纹投影轮廓测量的系统标定方法](https://img.taocdn.com/s3/m/6be59f9a70fe910ef12d2af90242a8956becaaf7.png)
新的基于条纹投影轮廓测量的系统标定方法安冬;达飞鹏;盖绍彦;陆可【摘要】提出一种新的光栅条纹投影轮廓测量术系统标定模型,新模型不要求投影装置和成像系统的光心连线与参考面平行、成像系统的光轴垂直于参考面及投影装置和成像系统的光轴相交.基于该模型得出了新的相位高度映射关系,其待定系数与成像点的坐标无关.实际测量中只需2个高度不同的标准块便可以求得待定系数.对4个标准块进行高度测量,得到的最大相对误差为0.6%.实验证明:该标定方法简单有效,提高了系统标定的可操作性和测量精度.【期刊名称】《应用光学》【年(卷),期】2014(035)001【总页数】4页(P81-84)【关键词】三维测量;相位法;系统标定;条纹投影轮廓术;相位高度关系【作者】安冬;达飞鹏;盖绍彦;陆可【作者单位】东南大学自动化研究所,江苏南京210096;东南大学自动化研究所,江苏南京210096;东南大学自动化研究所,江苏南京210096;东南大学自动化研究所,江苏南京210096【正文语种】中文【中图分类】TN946;TB391.41引言光栅投影轮廓测量术是把光栅投影到被测物体表面,光栅由于受物体高度的调制而发生变形,通过对变形的光栅进行处理,解调出代表物体高度的相位信息,再经过相位展开和系统标定就可以获得物体的三维信息[1-3]。
传统的光栅投影轮廓测量法对投影装置、摄像机和参考面的相对位置关系要求严格,如光轴垂直于参考面,摄像机光心和投影中心的连线平行于参考面,光轴和投影轴相交于参考面等[4-5]。
由于光心和光轴是假想的空间点和直线,实际操作中难以满足上述位置关系。
近年来,许多学者对上述问题进行了研究,如田爱玲[6]、HUQY[7]等人的方法不要求满足平行性,许庆红[8]、Xiao[9]等人的方法放宽了平行和垂直的要求,但这些算法仍然需要满足光轴和投影轴相交于参考面。
本文针对Xiao方法仍存在的位置限制条件,提出一种更为开放、限制条件更少的系统标定模型,它只要求摄像机Y轴和投影装置的Y轴互相平行,校准过程更加简便,提高了系统标定的可操作性和测量精度。
非整数倍双频光栅投影的相位测量轮廓术
![非整数倍双频光栅投影的相位测量轮廓术](https://img.taocdn.com/s3/m/cc2ec6e2b8f67c1cfad6b8d5.png)
位 利用两组截断相位 关 系,进行绝对相位展开 ,避免相位展 开中误差的传递 ,较好 地重建 了被
测物体的轮廓。计算机模拟试验结果证实,该方法与采用整数倍双频光栅投影相比,测量高度为
e ce t n ac l e c u a ey F o t e r lt n hp b t e wo g o p fd s r t h s s t e i f in l a d c lu a d a c r tl . r m h eai s i ewe n t r u s o i e ep a e , h y t o c a s l t h s - n a p n t o s e eo e u c s f l , y wh c r r r n frc n b l n td b o u ep a e u wr p i g meh d i d v lp d s c e su l b ih e r a s e a ee i ae y o t mi
adt rfe fh betob aue a e eo s u t crtl C m ue m l in h ws n e o l o te jc t e hp i o mesrd nb cnt c da ua y o p tr i uao o c r r e c e. s t s
维普资讯 tp://
第3 3卷第 1 期
20 0 6年 1 月
光 电工程
Op o E e t ncEn ie rn t - lcr i o gn e ig
v l 3 N0 1 0, , . 3
Jn 2 0 a, 06
文章编 号:1 0 — 0 X 2 0 ) 1 0 1— 4 0 3 5 1 (0 60 — 16 0
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
时间相位展开的应用前景
时间相位展开方法的主要优点是简单,并且可以 很容易准确测量表面不连续物体的轮廓;它不仅可 用于静态物体的轮廓测量当中,还可以用于物体实 时动态测量,即实时的相位展开。 它不但被应用于散斑干涉系统与剪切干涉领域中 ,还被用于波长扫描干涉术、干涉对比显微镜术的 动态干涉及光弹测量等领域中。目前基于光栅投影 和相位测量的轮廓测量技术在机器视觉、在线检测 、反求工程、计算机辅助设计与制造以及医疗诊断 等领域的应用日渐重要,所以时间相位展开方法的 应用肯定也将变得更加重要和广泛。
空间相位展开
空间相位展开的一般过程是沿 截断相位数据矩阵的行或列方向, 比较相邻两个点的相位值,如果 差值小于-π ,则后一点的相位 值应加上2π;如果差值大于π , 则后一点的相位值应减去2π。 一般的空间相位展开过程是一 个逐点扫描的积分累加过程,这 样的算法使一点的误差向后逐点 传播。在实测得到的截断相位图 中,存在有噪声、阴影以及间断 点(一般是由被测物体表面不连续 引致),这些无效点都会使一般的 相位展开方法失败或使误差传播。 在这种情况下,沿时域展开相 位将是最佳选择。
Δ φ w(m,n,t,t-1) φ w(m,n,t)-φ w(m,n,t-1)
Δ φ w(m,n,t,t-1) d (m, n, t , t 1) NINT [ ] 2 π
总的2π不连续数为:υ (m, n, s) d (m, n, t , t 1)
s
③总的展开相位差为:
t 1
φ u(m,n,s)-φ u(m,n,0)φ u(m,n,s)-φ u(m,n,0)-2 υ (m, n, s)
(m, n)表示坐标点,每一套条纹投影后, 其折叠相位可由普通相位检测方法得 到(傅里叶变换、小波变换、相移等)。
线性时间相位展开
时间相位展开Biblioteka 法1. Zhao等人采用的双频光栅法,将两种不同周期的光 栅(其中一个光栅只有一个条纹)分别投影到物体表面, 即测量两套不同灵敏度的相位图;在Li提出的双频光 栅的相位展开方法中,两种不同周期的条纹做在同一 块光栅上,使投影系统简化,当然这种空域复用的办 法是以降低条纹的对比为代价的。 2. Xie等人先后提出的绝对莫尔法和交叉光栅法,绝对 莫尔法是通过改变光栅的旋转角度来进行测量的,选 择不同光栅周期和不同的旋转角度可达到不同的测量 范围。交叉光栅法是将交又光栅(两个成一定角度的光 栅交叉形成)投影到物体上,经傅里叶变换和频域分离 后可得到两个图像,这和采用两套不同频率的光栅是 得到的效果一样的,但该方法可使投影系统简化。
一维空间相位展开的过程
时间相位展开
其基本思想是使光栅条纹的频 率随着时间而变化。光栅投影图 像可以认为是一个时间轴上的序 列,记录下的一系列的相位图形 成测量空间内的一个三维的相位 分布,每一像素点的相位沿着时 间轴进行相位展开。 由于时间相位展开方法并不在 二维相位图中寻找展开路径,而 是沿着时间轴分别对每一个像素 进行相位展开,从而实现了各像 素点相互独立的相位展开,因此, 边界以及信噪比较低区域不会影 响其它较好的数据点,也即从算 法上避免了空间相位展开中误差 传播的发生。
线性时间相位展开
时间相位展开与空间相位展开的区别
空间维只要利用某 个t时刻的4幅相移图 就可以相位展开,而 时间维则需要多个时 刻的相移图才能相位 展开,因此时间维算 法需要较长时间才能 采集完成,但它也因 此具有更多的原始信 息。
时间相位展开的一般过程
时间相位展开过程的三个步骤: ①解出每套条纹投影后的截断相位图 φw(m,n,t); ②求两套条纹投影后相邻两幅图像同 一点的展开相位差及2π的不连续数:
相位展开(PU)分类
相位截断现象是所有基于相位测量的条纹分析技 术都难以克服的问题。相位测量方法都使用反正切 函数计算相位,这样只能返回 -π到+π之间的相位 值,也就是说相位被截断了。为了重建连续相位分 布,必须进行相位展开。 PU 算法大体上分为两大类:空域相位展开和时域 相位展开。 空域展开只采用一幅折叠相位图,通过分析空域 相邻元素之间的相位值,根据相位连续性适当调整 折叠相位值,恢复出连续的相位分布;而时域相位 展开是将不同分辨力的折叠相位图沿时间轴展开。
时间相位展开方法
3. 郝煌栋和李达成等提出的非线性小数重合法,采用 了两套不同频率的光栅,增加了系统的复杂性,但提 高了条纹图像的信噪比。 4. Nadebonr等人提出的绝对相位测量法,是投影几对 倾斜光栅,每一对光栅形成一个有效的不同空间频率 的莫尔条纹,因此该方法也可以归类为时间相位展开 方法。 5. BurtonnadLalor提出的多频傅里叶条纹分析法要求 向物体表面基于时间相位展开的三维轮廓测量研究投 射多于一种频率的条纹,这些频率条纹的不同空间频 率带宽可使它们在傅里叶变换的频域中完全分开,因 此从本质上来说,它也是时间相位展开方法。
条纹投影三维测量 相位展开方法
条纹投影三维测量的流程
• 对投影到被测物体表面的条纹图进行采集 • 通过计算采集到条纹图上点的相位得到折叠相位 图(方法:相移法、傅里叶变换法、小波变换法等) • 将折叠相位图展成展开相位图(方法:空间相位展 开、时间相位展开、相位跟踪等) • 通过已标定好的系统根据展开相位图得到采集的 条纹图上每一点的深度,从而获得深度图像(标定 方法:多项式法、求解参数法、模型法等) • 将各个视角的采集的图像进行匹配从而得到它们 之间的关系,再进行视图合成得到物体的整个三 维模型