前言

  此处“张正友标定”又称“张氏标定”,是指张正友教授于1998年提出的单平面棋盘格的摄像机标定方法。张氏标定法已经作为工具箱或封装好的函数被广泛应用。张氏标定的原文为“A Flexible New Technique forCamera Calibration”。此文中所提到的方法,为相机标定提供了很大便利,并且具有很高的精度。从此标定可以不需要特殊的标定物,只需要一张打印出来的棋盘格。So great! 这样的方法让人肃然起敬。

一 算法描述

  1. 打印一张模板并贴在一个平面上
  2. 从不同角度拍摄若干张模板图象
  3. 检测出图象中的特征点
  4. 求出摄像机的内参数和外参数
  5. 求出畸变系数
  6. 优化求精

二 具体算法

1、标定平面到图像平面的单应性

  因为张氏标定是一种基于平面棋盘格的标定,所以想要搞懂张氏标定,首先应该从两个平面的单应性(homography)映射开始着手。
单应性(homography):在计算机视觉中被定义为一个平面到另一个平面的投影映射。首先看一下,图像平面与标定物棋盘格平面的单应性。
由上篇博文中讲到的摄像机模型,肯容易得到:

这里写图片描述

  其中m的齐次坐标表示图像平面的像素坐标(u,v,1),M的齐次坐标表示世界坐标系的坐标点(X,Y,Z,1)。A[R t]即是上面一篇博客推出的P。R表示旋转矩阵、t表示平移矩阵、S表示尺度因子。A表示摄像机的内参数,具体表达式如下:
这里写图片描述

  α=f/dx,β=f/dy,因为像素不是规规矩矩的正方形,分别是u,v轴的尺度因子。u0,v0是主点(通常在图像的中心)。γ代表像素点在x,y方向上尺度的偏差。
这里还有一个“梗儿”,就是S。它只是为了方便运算,对于齐次坐标,尺度因子不会改变坐标值的。因为标定物是平面,所以我们可以把世界坐标系构造在Z=0的平面上。然后进行单应性计算。令Z=0可以将上式转换为如下形式:

这里写图片描述

  既然,此变化属于单应性变化。那么我们可以给A[r1 r2 t]一个名字:单应性矩阵。并记H= A[r1 r2 t]。
那么现在就有:

这里写图片描述

  大家可以分析一下,H是一个三3*3的矩阵,并且有一个元素是作为齐次坐标。因此,H有8个未知量待解。(x,y)作为标定物的坐标,可以由设计者人为控制,是已知量。(u,v)是像素坐标,我们可以直接通过摄像机获得。对于一组对应的(x,y)-à(u,v)我们可以获得两组方程。
现在有8个未知量需要求解,所以我们至少需要八个方程。所以需要四个对应点。四点即可算出,图像平面到世界平面的单应性矩阵H。

这也是张氏标定采用四个角点的棋盘格作为标定物的一个原因。
在这里,我们可以将单应性矩阵写成三个列向量的形式,即:

这里写图片描述

2、利用约束条件求解内参矩阵A

  从上面可知,应用4个点我们可以获得单应性矩阵H。但是,H是内参阵和外参阵的合体。我们想要最终分别获得内参和外参。所以需要想个办法,先把内参求出来。然后外参也就随之解出了。我们可以仔细的“观摩”一下下面的式子。

这里写图片描述

从中可以得出下面两个约束条件,这两个约束条件都是围绕着旋转向量来的。
1、r1,r2正交 得:r1r2=0。这个很容易理解,因为r1,r2分别是绕x,y轴旋转的。应用高中立体几何中的两垂直平面上(两个旋转向量分别位于y-z和x-z平面)直线的垂直关系即可轻松推出。
2、旋转向量的模为1,即|r1|=|r2|=1。这个也很容易理解,因为旋转不改变尺度嘛。如果不信可以回到上一篇博客,找到个方向的旋转矩阵化行列式算一下。
通过上面的式子可以将r1,r2代换为h1,h2与A的组合进行表达。即 r1=A-1h1,r2=A-1h2.根据两约束条件,可以得到下面两个式子:

这里写图片描述
这里写图片描述

  大家从上面两个式子是不是看出一点端倪了。式子中,h1,h2是通过单应性求解出来的那么未知量就仅仅剩下,内参矩阵A了。内参阵A包含5个参数:α,β,u0,v0,γ。那么如果我们想完全解出这五个未知量,则需要3个单应性矩阵。3个单应性矩阵在2个约束下可以产生6个方程。这样可以解出全部的五个内参了。大家想一下,我们怎样才能获得三个不同的单应性矩阵呢?答案就是,用三幅标定物平面的照片。我们可以通过改变摄像机与标定板间的相对位置来获得三张不同的照片。(当然也可以用两张照片,但这样的话就要舍弃掉一个内参了γ=0)
到这里,大家应该就明白我们在张氏标定法时为什么要不断变换标定板的方位了吧。当然这只是一个原因。第二个原因,玉米会在讲极大似然时讲到。
下面在对我们得到的方程做一些数学上的变化,这些变化都是简单的运算变化了,相信大家动动笔,一算就可以算出。这些变化都是为了运算方便的,所以也没什么物理意义。
首先令:
这里写图片描述

  很容易发现B是一个对称阵,所以B的有效元素只剩下六个(因为有三对对称的元素是相等的,所以只要解得下面的6个元素就可以得到完整的B了),让这六个元素构成向量b。

这里写图片描述

接下来在做一步纯数学化简:

这里写图片描述
可以计算得:

这里写图片描述

利用约束条件可以得到下面,方程组:

这里写图片描述
这个方程组的本质和前面那两个用h和A组成的约束条件方程组是一样的。在此重复一遍解释:如果我们想完全解出这五个未知量,则需要3个单应性矩阵。3个单应性矩阵在2个约束下可以产生6个方程。这样可以解出全部的五个内参了。大家想一下,我们怎样才能获得三个不同的单应性矩阵呢?答案就是,用三幅标定物平面的照片。我们可以通过改变摄像机与标定板间的相对位置来获得三张不同的照片。(当然也可以用两张照片,但这样的话就要舍弃掉一个内参了γ=0)
通过至少含一个棋盘格的三幅图像,应用上述公式我们就可以估算出B了。得到B后,我们通过cholesky分解 ,就可以轻松地得到摄像机的内参阵A。

3、基于内参阵估算外参阵

通过上面的运算,我们已经获得了摄像机的内参阵。那么对于外参阵,我们很容易通过下面的公式解得:

这里写图片描述

对上面公式进行化简,可以得到:
这里写图片描述

至此,玉米已经将张氏标定的主体数学框架已经讲完了。介于篇幅关系(怕太长大机会读的昏昏欲睡,哈哈)。但其实我们做了这么多推导,仅仅是为后面的极大似然参数估计提供初值。但当然这个初值也是不可或缺的,因为没有这个初值,就无法估计出更为准确的参数。玉米将张氏标定中用于提高标定精度的极大似然算法,放到下一篇博客中进行讲解。

上文中内容引自本链接

三 张正有opencv实现

void cvCalibrateCamera2( const CvMat* object_points, const CvMat* image_points,const CvMat* point_counts, CvSize image_size,CvMat* intrinsic_matrix, CvMat* distortion_coeffs,CvMat* rotation_vectors=NULL,CvMat* translation_vectors=NULL,int flags=0 );

object_points
定标点的世界坐标,为3xN或者Nx3的矩阵,这里N是所有视图中点的总数。
image_points
定标点的图像坐标,为2xN或者Nx2的矩阵,这里N是所有视图中点的总数。
point_counts
向量,指定不同视图里点的数目,1xM或者Mx1向量,M是视图数目。
image_size
图像大小,只用在初始化内参数时。
intrinsic_matrix
输出内参矩阵(A)

fx000fy0cxcy1
,如果指定CV_CALIB_USE_INTRINSIC_GUESS和(或)CV_CALIB_FIX_ASPECT_RATION,fx、 fy、 cx和cy部分或者全部必须被初始化。
distortion_coeffs
输出大小为4x1或者1x4的向量,里面为形变参数[k1, k2, p1, p2]。
rotation_vectors
输出大小为3xM或者Mx3的矩阵,里面为旋转向量(旋转矩阵的紧凑表示方式,具体参考函数cvRodrigues2)
translation_vectors
输出大小为3xM或Mx3的矩阵,里面为平移向量。

而标定板的角点坐标由cvFindChessboardCorners()函数获得。
函数cvFindChessboardCorners试图确定输入图像是否是棋盘模式,并确定角点的位置。如果所有角点都被检测到且它们都被以一定顺序排布(一行一行地,每行从左到右),函数返回非零值,否则在函数不能发现所有角点或者记录它们地情况下,函数返回0。

int i,j,t;ifstream fin("calibdata.txt"); /* 定标所用图像文件的路径 *//*ifstream类,读取文件数据*/ofstream fout("caliberation_result.txt");  /* 保存定标结果的文件 *//*ofstream类,向文件中写入数据*//************************************************************************Step1:读取每一幅图像,从中提取出角点,然后对角点进行亚像素精确化*************************************************************************/cout<<"开始提取角点………………";int image_count=0;  /* 图像数量 */CvSize image_size;  /* 图像的尺寸*/CvSize board_size = cvSize(4,6);    /* 定标板上每行、列的角点数 */CvPoint2D32f* image_points_buf = new CvPoint2D32f[board_size.width*board_size.height];   /* 缓存每幅图像上检测到的角点,角点位置以像素坐标保存 */Seq<CvPoint2D32f> image_points_seq;  /* 保存检测到的所有角点 */string filename;int count= -1 ;//用于存储角点个数。 while (getline(fin,filename)){image_count++;if(image_count==1){GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);}if(image_count==2){GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW);}if(image_count==3){GetDlgItem(IDC_STATIC3)->ShowWindow(SW_SHOW);}if(image_count==4){GetDlgItem(IDC_STATIC4)->ShowWindow(SW_SHOW);}if(image_count==5){GetDlgItem(IDC_STATIC5)->ShowWindow(SW_SHOW);}if(image_count==6){GetDlgItem(IDC_STATIC6)->ShowWindow(SW_SHOW);}if(image_count==7){GetDlgItem(IDC_STATIC7)->ShowWindow(SW_SHOW);}if(image_count==8){GetDlgItem(IDC_STATIC8)->ShowWindow(SW_SHOW);}if(image_count==9){GetDlgItem(IDC_STATIC9)->ShowWindow(SW_SHOW);}if(image_count==10){GetDlgItem(IDC_STATIC10)->ShowWindow(SW_SHOW);}if(image_count==11){GetDlgItem(IDC_STATIC11)->ShowWindow(SW_SHOW);}if(image_count==12){GetDlgItem(IDC_STATIC12)->ShowWindow(SW_SHOW);}cout<<"image_count = "<<image_count<<endl;Image<uchar> view(filename);if (image_count == 1) {image_size.width = view.size().width;image_size.height = view.size().height;cout<<"image_size.width = "<<image_size.width<<endl;/*输出图像宽和高*/cout<<"image_size.height = "<<image_size.height<<endl;}/*角点检测失败*/
//board_size 每行和每列有多少角点,事先设定。image_points_buf 保存角点位置,count指向角点数目指针if (0 == cvFindChessboardCorners( view.cvimage, board_size,image_points_buf, &count, CV_CALIB_CB_ADAPTIVE_THRESH )){cout<<"can not find chessboard corners!\n";exit(1);} /*角点检测成功*/else {Image<uchar> view_gray(view.size(),8,1);rgb2gray(view,view_gray);cvFindCornerSubPix( view_gray.cvimage, image_points_buf, count, cvSize(11,11),cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));//对粗提取的角点进行精确化输出image_points_bufimage_points_seq.push_back(image_points_buf,count);//将检测到的每一幅图像的角点坐标都放入seq中cvDrawChessboardCorners( view.cvimage, board_size, image_points_buf, count, 1);//用于在图片中标记角点cvNamedWindow("角点检测",0);view.show("角点检测");//显示图片cvMoveWindow("角点检测",270,200);cvResizeWindow("角点检测",448,336);cvWaitKey(1000);//用于暂停,单位是毫秒view.close();}}/************************************************************************Step2:输出检测到的角点数据(利用包装后的数据结构(seq类)进行操作)*************************************************************************/      /*用于测试 not-delete!!*/                                                         int total = image_points_seq.length();cout<<"total = "<<total<<endl;//所有角点的总数量for (int ii=0 ; ii<total ;ii++){if (0 == ii%24)// 24 是每幅图片的角点个数。此判断语句是为了输出 图片号,便于控制台观看 {   int i = -1;i = ii/24;int j=i+1;cout<<"--> 第 "<<j <<"图片角点的数据 --> : "<<endl;}       if (0 == ii%2)  // 此判断语句,格式化输出,便于控制台查看{cout<<endl;}else{cout.width(10);}cout<<" -->"<<image_points_seq[ii].x;   //输出所有的角点cout<<" -->"<<image_points_seq[ii].y;}delete []image_points_buf;cout<<"角点提取完成!\n";GetDlgItem(IDC_STATIC13)->ShowWindow(SW_SHOW);/************************************************************************Step3:摄像机标定*************************************************************************/      cout<<"开始定标………………";/*棋盘三维信息*/CvSize square_size = cvSize(10,10);  /* 实际测量得到的定标板上每个棋盘格的大小 */Matrix<double> object_points(1,board_size.width*board_size.height*image_count,3); /* 保存定标板上角点的三维坐标 *//*3表示3维*/Matrix<double> image_points(1,image_points_seq.cvseq->total,2); /* 保存提取的所有角点 */Matrix<int> point_counts(1,image_count,1); /* 每幅图像中角点的数量 *//*内外参数*/Matrix<double> intrinsic_matrix(3,3,1); /* 摄像机内参数矩阵 */Matrix<double> distortion_coeffs(1,4,1); /* 摄像机的4个畸变系数:k1,k2,p1,p2 */Matrix<double> rotation_vectors(1,image_count,3); /* 每幅图像的旋转向量 */Matrix<double> translation_vectors(1,image_count,3); /* 每幅图像的平移向量 *//* 初始化定标板上角点的三维坐标 */for (t=0;t<image_count;t++) {for (i=0;i<board_size.height;i++) {for (j=0;j<board_size.width;j++) {/* 假设定标板放在世界坐标系中z=0的平面上 分三维赋值  共有3*6*4*12=864个数据*/object_points(0,t*board_size.height*board_size.width+i*board_size.width+j,0) = i*square_size.width;object_points(0,t*board_size.height*board_size.width+i*board_size.width+j,1) = j*square_size.height;object_points(0,t*board_size.height*board_size.width+i*board_size.width+j,2) = 0;}}}cvSave("objectt_points.xml",object_points.cvmat);/*保存成xml格式,便于调用*//* 将角点的存储结构转换成矩阵形式 */for (i=0;i<image_points_seq.cvseq->total;i++) {image_points(0,i,0) = image_points_seq[i].x;image_points(0,i,1) = image_points_seq[i].y;}cvSave("imagee_points.xml",image_points.cvmat);/*保存成xml格式,便于调用*//* 初始化每幅图像中的角点数量,这里我们假设每幅图像中都可以看到完整的定标板 */for (i=0;i<image_count;i++)point_counts(0,i) = board_size.width*board_size.height;/* 开始定标 */cvCalibrateCamera2(object_points.cvmat,image_points.cvmat,point_counts.cvmat,image_size,intrinsic_matrix.cvmat,distortion_coeffs.cvmat,rotation_vectors.cvmat,translation_vectors.cvmat,0);cout<<"定标完成!\n";/************************************************************************Step4:标定误差计算*************************************************************************/cout<<"开始评价定标结果………………\n";double total_err = 0.0; /* 所有图像的平均误差的总和 */double err = 0.0; /* 每幅图像的平均误差 */Matrix<double> image_points2(1,point_counts(0,0,0),2); /* 保存重新计算得到的投影点 */cout<<"\t每幅图像的定标误差:\n";fout<<"每幅图像的定标误差:\n"; /*将标定误差结果写入Text中*/for (i=0;i<image_count;i++) {/* 通过得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到新的投影点 */cvProjectPoints2(object_points.get_cols(i*point_counts(0,0,0),(i+1)*point_counts(0,0,0)-1).cvmat,rotation_vectors.get_col(i).cvmat,translation_vectors.get_col(i).cvmat,intrinsic_matrix.cvmat,distortion_coeffs.cvmat,image_points2.cvmat,0,0,0,0);/* 计算新的投影点和旧的投影点之间的误差*/err = cvNorm(image_points.get_cols(i*point_counts(0,0,0),(i+1)*point_counts(0,0,0)-1).cvmat,image_points2.cvmat,CV_L1);total_err += err/=point_counts(0,0,0);cout<<"\t\t第"<<i+1<<"幅图像的平均误差:"<<err<<"像素"<<'\n';fout<<"\t第"<<i+1<<"幅图像的平均误差:"<<err<<"像素"<<'\n';}cout<<"\t总体平均误差:"<<total_err/image_count<<"像素"<<'\n';fout<<"总体平均误差:"<<total_err/image_count<<"像素"<<'\n'<<'\n';cout<<"评价完成!\n";/************************************************************************Step5:保存定标结果*************************************************************************/cout<<"开始保存定标结果………………";Matrix<double> rotation_vector(3,1); /* 保存每幅图像的旋转向量 */Matrix<double> rotation_matrix(3,3); /* 保存每幅图像的旋转矩阵 */fout<<"相机内参数矩阵:\n";fout<<intrinsic_matrix<<'\n';fout<<"畸变系数:\n";fout<<distortion_coeffs<<'\n';/*保存成txt格式,便于观看*/cvSave("Intrinsics.xml",intrinsic_matrix.cvmat);/*保存成xml格式,便于调用*/cvSave("Distortion.xml",distortion_coeffs.cvmat);for (i=0;i<image_count;i++) {fout<<"第"<<i+1<<"幅图像的旋转向量:\n";fout<<rotation_vectors.get_col(i);/* 将旋转向量转换为相对应的旋转矩阵 */for (j=0;j<3;j++) {rotation_vector(j,0,0) = rotation_vectors(0,i,j);}cvRodrigues2(rotation_vector.cvmat,rotation_matrix.cvmat);fout<<"第"<<i+1<<"幅图像的旋转矩阵:\n";fout<<rotation_matrix;fout<<"第"<<i+1<<"幅图像的平移向量:\n";fout<<translation_vectors.get_col(i)<<'\n';}

实际操作中要注意以下几点:
1、棋盘的排放
算法是基于2D模型的,如果棋盘摆放的不平整,肯定会造成很大的影像。
2、图像的数目
一般要大于10个最好
3、图片的角度
这里注意的是图片的角度是45度最好,但是太大的角度对于角点提取的精度影像比较大,所以保持在45度以内比较好
4、要保证标定板的完整

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. php面向对象--实现购物车类(session)

    首先需要有购物车类:<?php class car {function car(){@session_start();//开启session}function addItem( $key,$object ){$_SESSION[list][$key] = $object;//增加}function getItem(){return $_SESSION[list];//获取购物车的信息}function rmItem( $key ){unset( $_SES…...

    2024/4/17 9:27:50
  2. Java类成员和实例成员

    Java类中的成员(属性和方法)可以分成两种,分别是实例成员和类成员。 一、什么是实例成员和类成员?实例成员中是属于对象的,即属于对象级别的,它包括实例成员属性(也称为实例成员变量)和实例成员方法,只有创建了对象之后才能访问实例成员属性和实例成员方法。类成员是属…...

    2024/4/18 16:08:12
  3. 考驾照全过程总结

    其实这想法,大一刚入学的时候就有了。因为没有资金,所以,一直延期。大一努力一年,拿了学校的“双金”,终于实现了可以报名考驾照的梦想了(纯属娱乐,再肤浅,也还没到这地步吧。如果说,努力读书,仅仅是为了拿奖学金考驾考,那就过于舍本逐末了)。因为这种事情对于我而言…...

    2024/5/1 23:05:43
  4. 相机标定原理

    1 相机标定的目的建立相机成像的几何模型 得到物体从三维世界映射到相机成像平面的变换矩阵,这一过程最关键的部分就是要得到相机的内参和外参。 校正透镜畸变 由于透镜的制造工艺(球面透镜),会使成像产生多种形式的畸变,通过标定计算畸变系数来校正各种像差2 相机标定原理…...

    2024/5/2 0:16:48
  5. 硅谷最有名的帮派:如果你不知道PayPal黑帮

    paypal你知道Tesla Motors,LinkedIn,SpaceX,Yelp,Yammer这几家公司的共同点吗?除了他们的市值都超过10亿美金之外,他们的创办人都是Paypal黑帮(Paypal Mafia)的一员,如果对硅谷的历史略知一二,你一定听过这个知名的「帮派」。究竟这个帮派是如何形成,对硅谷文化的深…...

    2024/4/17 9:28:44
  6. PHP对于浮点数运算问题

    首先介绍一下浮点数的二进制表示方法浮点数:以64位的长度(双精度为例):1位符号位,11位指数位,52位尾数1、符号位:表示正负,0为正,1为负 2、指数位:表示数据以2为底的幂,指数采用偏移码表示 3、尾数:表示小数点后的有效数字具体表示方法:将一个小数乘以2,取出整…...

    2024/5/2 1:11:34
  7. 三天打鱼两天晒网Java代码实现

    一:题目要求:中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。需要通过键盘录入日期,再读文件,判断是晒网还是打鱼,再将结果写出。首先…...

    2024/5/1 22:10:46
  8. OpenCV相机标定

    相机标定 相机标定:简单的说,就是获得相机参数的过程。参数如:相机内参数矩阵,投影矩阵,旋转矩阵和平移矩阵等什么叫相机参数?简单的说,将现实世界中的人、物,拍成一张图像(二维)。人或物在世界中的三维坐标,和图像上对应的二维坐标间的关系。表达两种不同维度坐标间…...

    2024/5/2 0:49:12
  9. 程序员必备的600个英语词汇(2)

    本文转载自:Simon丶Ma给大家编一个冷笑话,娱乐一下!! 可是本人的亲身经历!(声明:本人英语一般,就是单词量多一些。)有一天 ,来了2个外国人,讲英语的的,我姐夫和其他人都不懂英语,让我给他们翻译,我照做了,但是马马虎虎,大概的翻译过来了,然后就在旁边候着等待需…...

    2024/5/2 1:42:32
  10. 购物车与商城订单的关系以及技术实现深入分析

    本站所有文章均为原创,欢迎转载,来源:技术小树懒(www.drw1314.com),作者:锦焕同学接触商城开发已经有一段时间了,我们从B2C拼团项目做到了C2C视频电商系统。虽然项目都还不算成功,但还是积累了些业务经验,希望可以对大家有用。其实商城最主要的还是订单相关逻辑,例如购…...

    2024/5/2 1:59:21
  11. PHP 对金额的向上取整、向下取整

    在PHP中,一般来说如果需要向上取整,向下取整。用 ceil()、floor() 函数就可以。但是如果对金额的向上、向下取整要怎么处理那(金额一般都是要保留两位小数的)。 向上取整/*** 默认保留2位(金额向上取整算法)* @param $amount* @param int $decimals* @return float|int*/pu…...

    2024/5/2 4:03:52
  12. 最简单的针孔相机模型标定方法,使用Matlab进行快速可视化相机标定,小白专用,超详细

    相机标定是机器视觉、SLAM等绕不开的环节,今天介绍一种最为简单的可视化标定方法。这篇文章只是讲解如果标定,关于相机的标定原理,可以参考别的文章,这里推荐一篇《【机器视觉】张氏法相机标定》 一. 准备工作方格标定板一块(实际上没有也行); 已经安装Matlab的电脑一台…...

    2024/4/28 18:21:02
  13. Java图书管理系统总结分享

    实验中的问题及心得 我今天终于体会到什么叫做死去活来,什么叫做自己真的很想被一阵风吹走,想一个解决的问题我都想到自己很想不吃饭也要把这个问题解决了,现在我还是来总结哈本次项目的心得,第一就是在这个项目开始的时候我们会发现第一个问题就是我们怎样完成从键盘的读入…...

    2024/4/17 9:29:39
  14. 远大前程

    今天终于看完了英国作家狄更斯的著作《远大前程》。 小说中的主人公皮普像坐在我旁边,围在火炉前,亲切地给我讲述了他跌宕起伏的一生。皮普是个孤儿,由她姐姐和忠诚憨厚的好姐夫--乔一起带大。自从去一次阔妇人家后,他的心态和命运都悄然发生了变化,然而意外的好运也让他梦…...

    2024/4/27 18:34:21
  15. swift 问号和叹号的理解

    "!"表示这个可选变量存在,可以使用,如果用"!"访问不存在的可选变量会导致一些错误"?"表示这个变量可能不存在,如果不存在,"?"所在语句后面的内容都不会执行!是一个强制拆包,告诉编译器我绝对肯定代码能够执行, 如: strValue!.ha…...

    2024/4/17 9:28:50
  16. cookie解决 未登录加入购物车 第一次访问弹出新手引导页面

    浏览器携带cookie到服务器,点击加入购物车-->后台检查-->是否登录(有没有sessionid) 没有登录--->secookie()返回给浏览器,把传递过来的商品id, 属性(多个属性逗号拼接),数量存起来,(序列号成字符串_不同属性用下划线拼接)转载于:https://www.cnblogs.com/bj-tony/p/6…...

    2024/4/17 9:29:56
  17. 网络游戏架构

    原文:http://www.cnblogs.com/kanego/articles/2171009.html 网络游戏架构 1、 一种架构是Peer-to-Peer 对等通信结构,如下图所示,即在多个玩家参与的游戏中,各玩家之间采用Peer-to-Peer的直接通信方式。在网络通信服务的形式上,一般采用浮动服务器的形式,即其中一个玩家…...

    2024/4/20 8:37:33
  18. 相机标定原理、步骤

    在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机…...

    2024/4/20 10:19:35
  19. Android项目之android SDK视频播放与vitamio视频播放

    尊重原创,转载请注明:From zsml2016(http://blog.csdn.net/qq_29269233)Power by zsml2016侵权必究! 前言:今天我想给大家分享Android的视频播放!如今我又想起了当初我做的那个项目,那是接我姐夫单做的,不是很大的项目,我用了差不多半个月的时间完成了需求,现在回想…...

    2024/4/7 11:41:49
  20. 购物车(cookie和session各自的优缺点)

    1. cookiecookie是由服务器产生,存储在客户端的一段信息。它定义了一种Web服务器在客户端存储和返回信息的机制,cookie文件它包含域、路径、生存期、和由服务器设置的变量值等内容。当用户以后访问同一个Web服务器时,浏览器会把cookie原样发送给服务器。通过让服务器读取原先…...

    2024/4/25 23:33:16

最新文章

  1. 设计模式-状态模式(State Pattern)结构|原理|优缺点|场景|示例

    设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型&#xff08;5种&#xff09; 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型&#xff08;7种&#xff09; 适配器…...

    2024/5/2 4:32:11
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 【C++】C++中的list

    一、介绍 官方给的 list的文档介绍 简单来说就是&#xff1a; list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中…...

    2024/5/2 2:35:45
  4. 勾八头歌之分类回归聚类

    一、机器学习概述 第1关机器学习概述 B AD B BC 第2关常见分类算法 #编码方式encodingutf8from sklearn.neighbors import KNeighborsClassifierdef knn(train_data,train_label,test_data):input:train_data用来训练的数据train_label用来训练的标签test_data用来测试的数据…...

    2024/5/1 0:16:32
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57