wuti 2

本文介绍了如何在C++中使用预处理器指令屏蔽代码、宏定义与取消定义的方法,并详细解析了C++类的定义与使用,包括成员函数、构造函数等关键概念。

  在程序中要屏蔽大段代码的时候使用
#if 0
  statements
#endif
可以有效的将代码从程序中屏蔽,而使用/* */注释时可能会因为代码内部含有注释而失败。

typedef char * ptrtochar
ptrtochar a, b; 
a, b都是字符指针
#define ptrtochar char *
ptrtochar a, b;
a是字符指针,b是字符

#undef name
这条指令用于移除一个宏定义,如果一个现存的名字需要重新定义,那么它的旧定义首先必须用#undef移除。

条件编译
#if condition
  statements
#endif

是否定义
#if defined(symbol)
#ifdef symbol

#if !defined(symbol)
#ifndef symbol

int fuc()[];这个函数是非法的,函数只能返回标量值,不能返回数组。
int f[]();也是非法的,数组元素必须具有相同的长度,而不同的函数显然可能具有不同的长度。
int (*f[])();是合法的,首先f是一个数组,它的元素是某种类型的指针,数组元素的类型是个函数指针。它所指向的函数的返回值是整形。
int *(*f[])();和上一个类似,只不过数组元素指向的函数的返回值是整形指针。

类定义与使用说明

    (1) 函数成员与数据成员一样在函数中定义;外部函数调用类成员
        与结构调用一样,但只能调用公共成员.
    (2) 类成员函数能够直接访问类中所有定义的成员.
    (3) 每个类均有一个所属类的指针this.
    (4) 函数可以在类中定义,也可在函数外定义.
        在外部定义格式如下: 类型 类::函数(参数)
        但在类中要进行函数原形说明;
    (5) 成员函数也可以定义为内联函数;
    (6) 成员函数也可以说明为可选参数函数;
    (7) 类的大小应为每个成员的字节数和;
    (8) 成员函数也允许操作符重载;

构造函数

    (1) 构造函数与析构函数属于类中的成员函数.
    (2) 构造函数与所在的类具有相同的名字,并且不带返回类型,
        也不需要返回任何值.
    (3) 构造函数的作用是为类对象中有数据成员赋初值.
    (4) 构造函数在定义类对象时自动调用,完成赋值任务.
    (5) 一般构造函数均定义为公用成员.
    (6) 如果类中没有定义构造函数,则系统默认为:
            类名() { }    如: aaa() {}
    (7) 给类对象赋初值时
         ①采用赋值语句把表达式的值赋给成员变量;
            若只带一个参数,可以使用赋值号代替.
             例: aaa x(5) 或 aaa x=5
         ②初始化表的办法;
            格式: 函数名: 数据成员名(初始化表达式)
             例: aaa():a(NULL),n(0){}
    (8) 动态分配一个类对象,有无参数参照如下格式:
           aaa *s1= new aaa;
           aaa *s2= new aaa(a,6);

 

 

逐行解释matlab代码clc; close all; clear all; load ('E:\镜面实验数据\20240816\Calib_Results.mat','fc','cc','KK'); data=load('E:\镜面实验数据\20240816\pmxs.txt'); R = load('E:\镜面实验数据\20240816\R.txt'); Point = load('E:\镜面实验数据\20240816\P.txt'); phase_shift_num=4; l_imgs = cell(1,phase_shift_num); for i=1 for j=1:phase_shift_num l_imgs{i,j} = double(imread(['E:\镜面实验数据\20240816\wuti2\' num2str(phase_shift_num*(i-1)+j),'.bmp'])); end end %%求极线参数 a=data(1,1);b=data(1,2);c=data(1,3);d=data(1,4); D=abs(d)/(sqrt(a*a+b*b+c*c)); n=[a,b,c]'; I=[1,0,0;0,1,0;0,0,1]; D1=I-2*n*n'; D2=2*D*n; N0 = [-1,0,0;0,1,0;0,0,1]; I0=[-1;1;1]; R=R;T=Point*R; fx=fc(1,1);fy=fc(2,1);u0=cc(1,1);v0=cc(2,1); %内参 M=KK*[R,T']; M0=M(1:3,1:3);m0=M(:,4); % m=M0*D2+m0-M0*D1*inv(M0)*m0; % mx=[0,-m(3,1),m(2,1);m(3,1),0,-m(1,1);-m(2,1),m(1,1),0]; % F=mx*M0*D1*inv(M0); M01 = inv(M0); m=m0-M0*N0*M01*m0; mx=[0,-m(3,1),m(2,1);m(3,1),0,-m(1,1);-m(2,1),m(1,1),0]; F = mx*M0*N0*M01; c1 = -inv(M0)*m0 ; c2 = [-1,0,0;0,1,0;0,0,1]*c1; K = R*[0;0;1]; V = c2 - c1; % 将向量 V 单位化 r1 = V / norm(V); % r2 = R*[0;1;0]; r2 = cross(K,r1); r3 = cross(r1,r2); R1 = [r1';r2';r3']'; R2 = -R1*c2; M2 = KK*[R1 R2]; left_M2 = M2(:,1:3); Ma = left_M2*inv(M0); Ma = double(Ma); % 假设 Ma 是每张图像对应的 3x3 仿射变换矩阵,这里只是一个示例 Mz = cell(1, phase_shift_num); % 创建一个单元数组来存储每个相移图像的变换矩阵 for j = 1:phase_shift_num Mz{j} = Ma;% 计算或加载 Ma{j} end % 初始化校正后的图像数组 l_imgs_corrected = cell(1, phase_shift_num); % 对每张图像进行校正 for j = 1:phase_shift_num % 读取原始图像 img = l_imgs{1, j}; % 计算校正后图像的边界框 s1 = size(img); corners = [0, 0, s1(2), s1(2); 0, s1(1), 0, s1(1)]; corners_x = p2t(Mz{j}, corners); minx = floor(min(corners_x(1,:))); maxx = ceil(max(corners_x(1,:))); miny = floor(min(corners_x(2,:))); maxy = ceil(max(corners_x(2,:))); bb1 = [minx; miny; maxx; maxy]; % 应用校正变换 [img_corrected, alpha] = imwarp(img, Mz{j}, 'Bilinear', bb1); % 存储校正后的图像 l_imgs_corrected{j} = double(img_corrected); end ROIL=[]; imgL=[]; for i=1:phase_shift_num imgL(:,:,i)= l_imgs_corrected{1,i}; end ROILg=max(imgL,[],3); figure,imshow(ROILg,[]) %闭运算 freq = 64; ROI1=imclose(ROILg,strel('disk',10)); ROI1 = ROI1<80; ROI1 = ~ROI1; [ROIR,ROIL]=findLargeBlocks_D(ROI1, 8); figure,imshow(ROI1,[]) figure,imshow(ROIL,[]) figure,imshow(ROIR,[]) l_uph1=calculatePhase(l_imgs_corrected,phase_shift_num,freq,10); l_uph1 = double(l_uph1); figure,imshow(l_uph1,[]),title('相机截断相位'); l_uph1ROIL=l_uph1.*ROIL; figure,imshow(l_uph1ROIL,[]),title('相机截断相位'); [LPx,~]=gradient(l_uph1ROIL); figure,imshow(LPx,[]),title('左相机截断相位x梯度'); BWL = (LPx >= -4 & LPx <= -2.9) | (LPx >= 2.9 & LPx <= 4); BWLXX=imclose(BWL,strel('rectangle',[3 100])); % figure,imshow(BWLXX,[]) BWL=bwareaopen(BWL,10,8); % BWL=imclose(BWL|~ROIL,strel('rectangle',[15 1])); BWL=imdilate(BWL,strel('rectangle',[5 1]));%图形膨胀 BWL=imclose(BWL&ROIL,strel('disk',8)); BWL=imclose(BWL|~ROIL,strel('rectangle',[15 3])); BWL=BWL&ROIL; figure,imshow(BWL+ROIL*2,[]),title('左相机截断相位x梯度'); figure,imshow(BWL,[]),title('左相机截断相位x梯度'); LL=bwlabel(~BWL&ROIL); LLA=regionprops(LL); LLy=[]; for i=1:size(LLA,1) LLy(i)=LLA(i).Centroid(2); end figure,imshow(LL,[]),title('左相机'); l_uph1ROIR=l_uph1.*ROIR; figure,imshow(l_uph1ROIR,[]),title('相机截断相位'); [RPx,~]=gradient(l_uph1ROIR); figure,imshow(RPx,[]),title('左相机截断相位x梯度'); BWR = (RPx >= -4 & RPx <= -2.9) | (RPx >= 2.9 & RPx <= 4); BWRXX=imclose(BWR,strel('rectangle',[3 100])); BWR=bwareaopen(BWR,10,8); BWR=imdilate(BWR,strel('rectangle',[5 1]));%图形膨胀 BWR=imclose(BWR&ROIR,strel('disk',8)); BWR=imclose(BWR|~ROIR,strel('rectangle',[15 3])); BWR=BWR&ROIR; figure,imshow(BWR+ROIR*2,[]),title('左相机截断相位x梯度'); figure,imshow(BWR,[]),title('左相机截断相位x梯度'); LR=bwlabel(~BWR&ROIR); LRA=regionprops(LR); LRy=[]; for i=1:size(LRA,1) LRy(i)=LRA(i).Centroid(2); end figure,imshow(LR,[]),title('右相机'); for i=1:size(LLy,2) LineL=LL(round(LLy(i)),:); LineR=LR(round(LLy(i)),:); PmL{i,1}=unique(LineL);%数组中的唯一值 PmL{i,2}=unique(LineR); end for i=1:size(LRy,2) LineL=LL(round(LRy(i)),:); LineR=LR(round(LRy(i)),:); PmR{i,1}=unique(LineL); PmR{i,2}=unique(LineR); end
05-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值