有没有比胡晓敏更爱张正说故事

靠,爱你没碍着你全文阅读_在线阅读_第54章
第54章妹妹我有男盆友了-追书神器官网
靠,爱你没碍着你
第54章妹妹我有男盆友了
三号青年:【人捏人捏,今天怎么这么安静啊?】
我是路人:【啊泰跟扯毛线搞基去了,偶爱妹子被人强奸了,刚刚进来一个新人被贱人吓跑了,报告完毕;补充一点,刚刚的新人是妹子。】
三号青年:【路人,我交给你一个重大而远大的任务,你愿意接受吗?】
我是路人:【您请说,只要是您吩咐滴事我都会好好完成滴,绝对忠心党忠心年哥!!】
三号青年:【……把贱人给拉出去强奸一百遍!!】
一贱你就笑:【凭啥啊??不能这么欺负新人的说啊!!】
我是路人:【明白!!贱人,嘿嘿,我们继续昨天滴事吧~~】
一贱你就笑:【去死!!老子要妹子!!】
我是群主:【大清早的闹什么闹,打扰我睡美容觉!】
三号青年:【群主,不早了吧现在。】
偶爱妹子:【群主你总算出来了!!!我私Q了你好久你都没回我!!!要解释啊啊啊!!!】
三号青年:【偶爱妹子这是咋了,被人强奸了还是被人给强上了?】
我是路人:【偶爱妹子昨天被人强奸了,有图有真相!】
一贱你就笑:【擦,老子现在手机,给我省点流量行不行!!】
偶爱妹子:【你们都给我闭嘴!!群主我要解释!!!】
三号青年:【偶爱妹子这是咋了?真被人给强奸了啊?】
偶爱妹子:【年哥我不想鄙视你-_-|||】
三号青年:【那就崇拜我!!】
我是群主:【好了,偶爱妹子你说清楚,到底咋了?】
偶爱妹子:【群主你坑人!!你给我的妹子QQ号是个冷漠妹子,我跟她说了好多话他只回了我三句,我起码说了三百句好不好!!而且最后一句还是‘你对同性恋怎么看?’擦,这妹子不会是腐女吧!!!】
三号青年:【噗哈哈哈】
我是群主:【当然不是,她绝对不是腐妹子,这个你放心好了,可能是你不够努力吧,妹子嘛,都喜欢被人给哄着,你多说点话就行,她看着呢,真的,不骗人~~】
扯毛线啊扯:【打哈欠~】
一贱你就笑:【我是新人,我求妹子,求交往,求合体~~】
我是群主:【路人,管好你家贱人!!】
我是路人:【明白!!贱人,跟我回家去,不许在这里捣乱了啊,有什么事我们回家说啊,乖啊。】
扯毛线啊扯:【草,路人什么时候跟贱人勾搭上了,这两人是不是搞基了啊??我就说嘛,群里最大的威胁就路人这个人渣了!!】
偶爱妹子:【切,某人还不是跟人妖搞起来了!鄙视!!】
扯毛线啊扯:【草,你收你家妹子不就得了,管这么多干嘛,我就喜欢人妖管你毛事,我不仅喜欢人妖,我还喜欢啊泰你有意见啊,有意见也给我憋着!!】
啊泰:【……我是不是来错时间了……】
三号青年:【来得真巧……】
我是群主:【来得真巧加1】
我是路人:【来得真巧加10086】
扯毛线啊扯:【……】
偶爱妹子:【算了,我眼不见为净,你们慢慢聊吧,偶去跟妹子聊天去,今天一定要妹子说四句话,\(^o^)/】
我是路人:【没士气!】
一贱你就笑:【没志气!】
三号青年;【有点理想行不行,怎么也得说五句话吧!!】
我是群主:【……】
扯毛线啊扯:【啊泰,上次你推荐的电影挺好看的,还有没有啊?】
啊泰:【有啊,我平时就喜欢看电影,我昨晚列出了一个单子,我单发给你吧。】
扯毛线啊扯:【好啊】
我是路人:【秀恩爱回家去!!】
一贱你就笑:【我是新人,这里求交往,求妹子,求合体!!】
我是路人:【擦,贱人跟我回家去!!】
我是群主:【晕!!】
张正看着群里这些没营养的对话,本想下了的,结果看QQ有一个消息提示,是一个申请加入好友的提示。
张正看了看这个人,网名叫‘初晴’,看上去名字像是妹子的,张正也就无所谓的加了,不过对方好像一直在线似的,张正一加她她就发消息过来了。
初晴:【你好,我是初晴。】
三号青年:【啊,你好,我是三号青年-_-|||】
初晴:【(*^__^*)嘻嘻……很可爱滴名字哟~~】
三号青年:【是吗?谢了。】
初晴:【~\(≧▽≦)/~啦啦啦】
三号青年:【高兴神马?】
初晴:【命运告诉我今天偶会遇到偶命中注定滴那个人,我想你肯定就是了~~】
三号青年:【(⊙o⊙)啊!】
初晴:【我们交往吧,人家可是很羞射滴哟亲~】
三号青年:【(⊙o⊙)啊!】
初晴:【(*^__^*)嘻嘻……喵呜~~】
三号青年:【(⊙o⊙)啊!妹子有病吧-_-|||】
初晴:【才没有哦亲,人家很正常,要不要跟人家交往嘛~人家可在床上等着你哦~~】
“噗……”听到这一句张正直接喷了出来,哪来的妹子这么猖狂?!!
三号青年:【妹子略带凶残,我有交往的人了,出门右拐不送。】
初晴:【哼,骗人,人家是真心求交往滴,非诚勿扰嘛~】
三号青年:【我真的有交往的人了,出门不送-_-|||】
初晴:【哼,难道你女友有我漂亮吗?有我可爱吗?有我好看吗?】
初晴:【图片】
初晴:【这是人家滴照片,好看吧~要不要考虑一下~~】
张正看着初晴发来的照片,蕾丝裙边,一张乖乖脸蛋,齐眉的妹妹头,一眼看上去就觉得干净清晰,张正以前也挺喜欢这种类型的。
不过现在……
三号青年:【我是gay啊,对妹子没感觉,而且我有男友了,慢走不送!】
发完这句话张正就把初晴给删了,现在的妹子都太过凶残,还是老老实实的跟吴情过算了,张正知道自己不是同性恋,只不过喜欢的人恰好和自己同性罢了。
在感情上,张正可以说是一个很有洁癖的人,要是没跟吴情交往前,出去混混,偶尔玩玩小暧昧也就算了,但是一旦确定了下来,除了分手否则绝不跟任何男女扯不清楚!
这也算是张正身上那本来就不多的好处之一吧。有没有比胡晓敏更爱张正_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
有没有比胡晓敏更爱张正
我有更好的答案
绝对没有你们是彼此的唯一祝你们幸福
为您推荐:
其他类似问题
您可能关注的内容
张正的相关知识
换一换
回答问题,赢新手礼包相机标定法-张正有
  此处“张正友标定”又称“张氏标定”,是指张正友教授于1998年提出的单平面棋盘格的摄像机标定方法。张氏标定法已经作为工具箱或封装好的函数被广泛应用。张氏标定的原文为“A Flexible New Technique forCamera Calibration”。此文中所提到的方法,为相机标定提供了很大便利,并且具有很高的精度。从此标定可以不需要特殊的标定物,只需要一张打印出来的棋盘格。So great! 这样的方法让人肃然起敬。
一 算法描述
打印一张模板并贴在一个平面上
从不同角度拍摄若干张模板图象
检测出图象中的特征点
求出摄像机的内参数和外参数
求出畸变系数
二 具体算法
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&);
ofstream fout(&caliberation_result.txt&);
/************************************************************************
Step1:读取每一幅图像,从中提取出角点,然后对角点进行亚像素精确化
*************************************************************************/
cout&&&开始提取角点………………&;
int image_count=0;
CvSize image_
CvSize board_size = cvSize(4,6);
CvPoint2D32f* image_points_buf = new CvPoint2D32f[board_size.width*board_size.height];
Seq&CvPoint2D32f& image_points_
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&&
Image&uchar& view(filename);
if (image_count == 1)
image_size.width = view.size().
image_size.height = view.size().
cout&&&image_size.width = &&&image_size.width&&
cout&&&image_size.height = &&&image_size.height&&
if (0 == cvFindChessboardCorners( view.cvimage, board_size,
image_points_buf, &count, CV_CALIB_CB_ADAPTIVE_THRESH ))
cout&&&can not find chessboard corners!\n&;
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_seq.push_back(image_points_buf,count);
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类)进行操作)
*************************************************************************/
int total = image_points_seq.length();
cout&&&total = &&&total&&
for (int ii=0 ; ii&ii++)
if (0 == ii%24)
int i = -1;
i = ii/24;
int j=i+1;
cout&&&--& 第 &&&j &&&图片角点的数据 --& : &&&
if (0 == ii%2)
cout.width(10);
cout&&& --&&&&image_points_seq[ii].x;
cout&&& --&&&&image_points_seq[ii].y;
delete []image_points_
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);
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);
Matrix&double& rotation_vectors(1,image_count,3);
Matrix&double& translation_vectors(1,image_count,3);
for (t=0;t&image_t++) {
for (i=0;i&board_size.i++) {
for (j=0;j&board_size.j++) {
object_points(0,t*board_size.height*board_size.width+i*board_size.width+j,0) = i*square_size.
object_points(0,t*board_size.height*board_size.width+i*board_size.width+j,1) = j*square_size.
object_points(0,t*board_size.height*board_size.width+i*board_size.width+j,2) = 0;
cvSave(&objectt_points.xml&,object_points.cvmat);
for (i=0;i&image_points_seq.cvseq-&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);
for (i=0;i&image_i++)
point_counts(0,i) = board_size.width*board_size.
cvCalibrateCamera2(object_points.cvmat,
image_points.cvmat,
point_counts.cvmat,
image_size,
intrinsic_matrix.cvmat,
distortion_coeffs.cvmat,
rotation_vectors.cvmat,
translation_vectors.cvmat,
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&;
for (i=0;i&image_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,
err = cvNorm(image_points.get_cols(i*point_counts(0,0,0),(i+1)*point_counts(0,0,0)-1).cvmat,
image_points2.cvmat,
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';
cvSave(&Intrinsics.xml&,intrinsic_matrix.cvmat);
cvSave(&Distortion.xml&,distortion_coeffs.cvmat);
for (i=0;i&image_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_
fout&&&第&&&i+1&&&幅图像的平移向量:\n&;
fout&&translation_vectors.get_col(i)&&'\n';
实际操作中要注意以下几点:
1、棋盘的排放
算法是基于2D模型的,如果棋盘摆放的不平整,肯定会造成很大的影像。
2、图像的数目
一般要大于10个最好
3、图片的角度
这里注意的是图片的角度是45度最好,但是太大的角度对于角点提取的精度影像比较大,所以保持在45度以内比较好
4、要保证标定板的完整
本分类共有文章3篇,更多信息详见
& 2012 - 2016 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";

我要回帖

更多关于 张正说故事 的文章

 

随机推荐