cvCalibrateCamera标定的一些问题

最近研究摄像机标定,先用单目摄像机标定。发现如下问题:
1. cvCalibrateCamera第一个参数object_points是角点在世界坐标系中坐标(世界坐标系原点在第一个角点位置,标定板所有点坐标都在Z=0的平面上)。
第二个参数image_points是角点在图像坐标系中坐标(图像坐标系原点在第一个角点位置)。这个参数可以通过cvfindchessboardcorners函数得到。

提取出来的角点坐标image_points包含的是图像中先按照从左到右,再从上到下顺序存储的坐标值。理论上第一个参数的点应该和第二个参数对应上,可是我发现opencv书中的代码是先从上到下,再从左至右:

step = successes*board_n;
for( int i=step, j=0; j<board_n; ++i,++j ) {
CV_MAT_ELEM(*image_points, float,i,0) = corners[j].x;
CV_MAT_ELEM(*image_points, float,i,1) = corners[j].y;
CV_MAT_ELEM(*object_points,float,i,0) = (j/board_w)*21.5; // 个人觉得应该是CV_MAT_ELEM(*object_points,float,i,0) = j%board_w;
CV_MAT_ELEM(*object_points,float,i,1) = (j%board_w)*21.5; // 个人觉得应该是CV_MAT_ELEM(*object_points,float,i,0) = j/board_w;
CV_MAT_ELEM(*object_points,float,i,2) = 0.0f;
}

源代码坐标依次是(0,0,0),(0,1*21.5,0),(0,2*21.5,0).....是先从上到下。
我的代码坐标依次是(0,0,0),(1*21.5,0,0),(2*21.5,0,0) .....是从左至右。

而标定板上检测出的角点顺序是先从左至右,再从上到下。不知道哪个正确?? 两个方法我都试了,效果并没有明显不同。

得出的摄像机内矩阵和畸变系数分别是
<?xml version="1.0"?>


3
3

f


1.30523621e+003 0. 3.19316345e+002 0. 1.31042041e+003
1.88144318e+002 0. 0. 1.

<?xml version="1.0"?>


5
1

f


7.49643818e-002 -7.14159346e+000 2.39964016e-003 -1.75716709e-002
7.27485962e+001

////////////////////////////////////////////////////////////////////////////////////////

<?xml version="1.0"?>


3
3

f


1.30245691e+003 0. 3.19592133e+002 0. 1.30768018e+003
1.88326523e+002 0. 0. 1.

<?xml version="1.0"?>


5
1

f


7.38773346e-002 -7.05401230e+000 2.40107719e-003 -1.75304897e-002
7.13559875e+001

//////////////////////////////////////////////////////////////////////

本人使用matlab也做了校正,得出的摄像机内矩阵和畸变系数如下:

Focal Length: fc = [ 17702.95064 18428.99257 ]  [ 2237.98276 2860.08116 ]
Principal point: cc = [ 319.50000 239.50000 ]  [ 0.00000 0.00000 ]
Skew: alpha_c = [ 0.00000 ]  [ 0.00000 ] => angle of pixel axes = 90.00000  0.00000 degrees
Distortion: kc = [ -59.26465 210144.98702 0.23047 -0.55149 0.00000 ]  [ 62.11093 310619.70504 0.10025 0.08585 0.00000 ]
Pixel error: err = [ 1.10052 1.13712 ]

相差很多,不知道哪出现问题了。

  1. 如何验证校验结果,使用matlab进行标定发现得出的摄像机内矩阵和畸变系数与自己写代码得出差很多,见上面。通过右眼看校正后的图像看不出来校正效果。因为原图像本身就没有太大的畸变。

  2. 得出的旋转向量和平移向量是什么意思?为什么我得不到旋转向量和平移向量,这两个参数带NULL是没有问题的

    cvCalibrateCamera2(object_points2, image_points2, point_counts2, cvGetSize(image), intrinsic_matrix, distortion_coeffs, 0, 0,0);
    

但是带入向量就会出现unhandled exception,代码如下:

    cvCalibrateCamera2(object_points2, image_points2, point_counts2, cvGetSize(image), intrinsic_matrix, distortion_coeffs, rotation_vectors, translation_vectors, CV_CALIB_USE_INTRINSIC_GUESS);

新人刚研究opencv,希望各位出谋划策,给点帮助,谢谢了。

1个回答

作者的介绍很详细,也推荐公众号中比较不错的一篇(一分钟详解OpenCV之相机标定函数calibrateCamera()):https://mp.weixin.qq.com/s/sZNubF-pTvu8dD8bfAXCIQ

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于opencv标定(cvCalibrateCamera2)的问题

#include"opencv2/opencv.hpp" #include"opencv2/highgui/highgui.hpp" #include"opencv2/core/core.hpp" #include"opencv2/imgproc/imgproc.hpp" #include"iostream" using namespace cv; using namespace std; int main() { VideoCapture capture(1); if (!capture.isOpened()) { cout << "摄像头打开失败" << endl; return 0; } Mat frame; namedWindow("捕捉画面", WINDOW_AUTOSIZE); char filename[20]; int image_num = 1; while (true) { capture >> frame; if (!frame.data) { cout << "获取帧数失败" << endl; return 0; } imshow("捕捉画面", frame); if (waitKey(10) == ' ') { sprintf(filename, "%d.jpg", image_num); imwrite(filename, frame); cout << "截取第" << image_num << "张图片成功" << endl; image_num++; } if(waitKey(10)=='q'||waitKey(10)=='27') { cout << "总共截取" << --image_num << endl; cout << "截图程序结束" << endl; break; } } int rows = frame.rows; int cols = frame.cols; destroyWindow("捕捉画面"); Size board_size = Size(7, 7);//棋盘格每行每列的内角点个数 int per_image_point = board_size.height*board_size.width;//每张图片一共多少个角点 CvPoint2D32f* image_point_buf = new CvPoint2D32f[per_image_point];//存放每个角点坐标的坐标的数组 CvMat* image_points=cvCreateMat(per_image_point*image_num, 2, CV_32FC1);//定义图片坐标系 CvMat* object_points=cvCreateMat(per_image_point*image_num, 3, CV_32FC1);//定义世界坐标系 CvMat* point_count = cvCreateMat(image_num,1, CV_32SC1);//用来存放成功标定图片的角点数的图片 IplImage* show;//存放截图到的图片 int found=0;//用来判定是否检测到每张截取图片上所有的角点的标识符 int corner_counts;//存放每张图片输出角点的个数 int success = 0;//用来计算成功标定图片的张数 int step;//用来计算图像坐标系和世界坐标系存储角点坐标的个数 int cube_length = 7; for (int i=1; i <= image_num; i++) { sprintf(filename, "%d.jpg", i); show = cvLoadImage(filename); namedWindow("replay"); /*检测角点*/ found = cvFindChessboardCorners(show, board_size, image_point_buf, &corner_counts, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS); if (found == 0) { cout << "第" << i << "张图片没有检测到棋盘格所有的角点" << endl; cvShowImage("replay", show); waitKey(0); } else { cout << "第" << i << "张图片检测到" << corner_counts << "个角点" << endl; IplImage* grayimage=cvCreateImage(cvGetSize(show),8,1);//创建一个一show具有同一size、8位、单通道的矩阵 cvCvtColor(show, grayimage, COLOR_BGR2GRAY); /*亚像素角点检测*/ cvFindCornerSubPix(grayimage,image_point_buf,corner_counts,Size(11,11),Size(-1,-1), TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 30, 0.1)); /*绘制角点*/ cvDrawChessboardCorners(show, board_size, image_point_buf, corner_counts, found); cvShowImage("replay", show); waitKey(0); } if (per_image_point == corner_counts) { step = success*per_image_point; for (int i = step, j = 0; j < per_image_point; ++i, ++j) { /*由于图像坐标系imagr_points是由image_num行,2列组成,所以第一列存放角点的x坐标,第二列存放角点的y坐标*/ CV_MAT_ELEM(*image_points, float, i, 0) = image_point_buf[j].x; CV_MAT_ELEM(*image_points, float, i, 1) = image_point_buf[j].y; CV_MAT_ELEM(*object_points, float, i, 0) = (float)(j / cube_length); CV_MAT_ELEM(*object_points, float, i, 1) = (float)(j % cube_length); CV_MAT_ELEM(*object_points, float, i, 2) = 0.0f; } /*图片point_count是由image_num行、1列组成,用来存放成功标定图片的角点数*/ CV_MAT_ELEM(*point_count, int, success, 0) = per_image_point; success++; } } cvReleaseImage(&show); cvDestroyWindow("replay"); cout << image_num << "张图片中," << success << "张图片标定成功" << endl; cout << image_num << "张图片中," << image_num-success << "张图片标定失败" << endl; /*开始计算摄像机内外参数*/ /*CvCapture* capture1; capture1 = cvCreateCameraCapture(1); IplImage* show_colie; show_colie = cvQueryFrame(capture1);*/ CvMat* object_points2 = cvCreateMat(per_image_point*success, 3, CV_32FC1); CvMat* image_points2 = cvCreateMat(per_image_point*success, 2, CV_32FC1); CvMat* point_count2 = cvCreateMat(success, 1, CV_32SC1); for (int i = 0; i < success*per_image_point; ++i) { CV_MAT_ELEM(*image_points2, float, i, 0) = CV_MAT_ELEM(*image_points, float, i, 0); CV_MAT_ELEM(*image_points2, float, i, 1) = CV_MAT_ELEM(*image_points, float, i, 1); CV_MAT_ELEM(*object_points2, float, i, 0) = CV_MAT_ELEM(*object_points, float, i, 0); CV_MAT_ELEM(*object_points2, float, i, 1) = CV_MAT_ELEM(*object_points, float, i, 1); CV_MAT_ELEM(*object_points2, float, i, 2) = CV_MAT_ELEM(*object_points, float, i, 2); } for (int i = 0; i < success; ++i) CV_MAT_ELEM(*point_count2, int, i, 0) = CV_MAT_ELEM(*point_count, int, i, 0); cvReleaseMat(&image_points); cvReleaseMat(&object_points); cvReleaseMat(&point_count); /*用来存放形变参数的矩阵,其通常为[k1,k2,p1,p2,k3]的一维向量,其中k1,k2,k3为径向畸变,p1,p2为切向畸变*/ CvMat* distortion_coeffs = cvCreateMat(5, 1, CV_32FC1); /*用来存放内参数的矩阵,其通常为[fx,0,cx 0,fy,cx 0, 0, 1]*/ CvMat* intrinsic_matrix = cvCreateMat(3, 3, CV_32FC1); CV_MAT_ELEM(*intrinsic_matrix, float, 0, 0) = 1.0f; CV_MAT_ELEM(*intrinsic_matrix, float, 1, 1) = 1.0f; /*计算摄像头的内外参数*/ cvCalibrateCamera2(object_points2, image_points2, point_count2, Size(rows,cols), intrinsic_matrix, distortion_coeffs, NULL, NULL, 0); cout << "内参数矩阵为:" << endl; cout << CV_MAT_ELEM(*intrinsic_matrix, float, 0, 0) <<" "<< CV_MAT_ELEM(*intrinsic_matrix, float, 0, 1) <<" "<< CV_MAT_ELEM(*intrinsic_matrix, float, 0, 2) << endl; cout << CV_MAT_ELEM(*intrinsic_matrix, float, 1, 0) << " " << CV_MAT_ELEM(*intrinsic_matrix, float, 1, 1) << " " << CV_MAT_ELEM(*intrinsic_matrix, float, 1, 2) << endl; cout << CV_MAT_ELEM(*intrinsic_matrix, float, 2, 0) << " " << CV_MAT_ELEM(*intrinsic_matrix, float, 2, 1) << " " << CV_MAT_ELEM(*intrinsic_matrix, float, 2, 2) << endl; //cout << "形变参数为:" << endl; //cout << distortion_coeffs << endl; /*cvSave("内参数矩阵.xml", intrinsic_matrix); cvSave("形变参数矩阵.xml", distortion_coeffs); CvMat* intrinsic = (CvMat*)cvLoad("内参数矩阵.xml"); CvMat* distortion = (CvMat*)cvLoad("形变参数矩阵.xml"); IplImage* mapx = cvCreateImage(cvGetSize(show_colie), IPL_DEPTH_32F, 1); IplImage* mapy = cvCreateImage(cvGetSize(show_colie), IPL_DEPTH_32F, 1); cvInitUndistortMap(intrinsic, distortion, mapx, mapy); namedWindow("原始图"); namedWindow("非畸变图"); while (show_colie) { show_colie = cvQueryFrame(capture1); IplImage* clone = cvCloneImage(show_colie); cvShowImage("原始图", show_colie); cvRemap(clone, show_colie, mapx, mapy); cvReleaseImage(&clone); cvShowImage("非畸变图", show_colie); waitKey(0); } */ system("pause"); return 0; } 结果显示: ![图片说明](https://img-ask.csdn.net/upload/201703/29/1490785876_646196.png) 请求大神们告知为什么这样,万分感谢

关于摄像头标定和校正的问题

我用这个函数cvCalibrateCamera_64d找的摄像机内部参数cameraMatrix,和distortion这个扭曲参数,然后用的cvUndistort2进行校正,校正之后的目标图是空的 为什么丫 求各位大神指点啊 在线等啊

摄像机标定问题遇到的运行问题

![图片说明](https://img-ask.csdn.net/upload/201711/06/1509958972_887903.png) 摄像机标定的程序 运行的时候老报错(如图所示),翻书和书上的也一样 卡在这两个星期了,望大神帮忙解决。代码附上: #ifndef CCALIBRATION_H #define CCALIBRATION_H #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <stdio.h> #include <stdlib.h> int n_boards = 0; //Will be set by input list const int board_dt = 20;// wait 20 frames per chessboard view int board_w; int board_h; int main() { //int main(4,8,8,10,0){ //如果不用脚本引导main程序执行,则可以像这样自行输入参数。int argc, char* argv[] //if(argc != 4){ // printf("ERROR:Wrong number of input parametersn"); // system("pause"); // return -1; //} board_w = 4;//atoi(argv[1]); //棋盘板的宽度(横向棋盘格数) board_h = 6;//atoi(argv[2]); //棋盘板的高度(纵向棋盘格数) n_boards = 10;//atoi(argv[3]);//图像张数 int board_n = board_w * board_h; CvSize board_sz = cvSize( board_w, board_h ); CvCapture* capture = cvCreateCameraCapture(0); assert(capture); cvNamedWindow( "Calibration" ); //ALLOCATE STORAGE CvMat* image_points = cvCreateMat(n_boards*board_n,2,CV_32FC1); //总的图像点存储 CvMat* object_points = cvCreateMat(n_boards*board_n,3,CV_32FC1);//总的实物点存储 CvMat* point_counts = cvCreateMat(n_boards,1,CV_32SC1); CvMat* intrinsic_matrix = cvCreateMat(3,3,CV_32FC1); //内部参数矩阵 CvMat* distortion_coeffs = cvCreateMat(5,1,CV_32FC1); //畸变矩阵 CvPoint2D32f* corners = new CvPoint2D32f[ board_n ]; //角 int corner_count; int successes = 0; int step,frame=0; IplImage *image = cvQueryFrame(capture); //读图像 IplImage *gray_image = cvCreateImage(cvGetSize(image),8,1); //subpixel //capture corner views loop until we've got n_boards //successful captures (all corners on the board are found) // while(successes<n_boards){ //每张图循环一次 //skip every board_dt frames to allow user to move chessboard if(frame++ % board_dt==0){ //每20帧取一张 //Find chessboard corners://寻找棋盘内角点,将个数存入corner_count,将角点像素存入corners。 int found = cvFindChessboardCorners(image,board_sz,corners,&corner_count,CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS); //Get Subpixel accuracy on those corners cvCvtColor(image,gray_image,CV_BGR2GRAY); //转换图像类型。 cvFindCornerSubPix(gray_image,corners,corner_count,cvSize(11,11),cvSize(-1,-1),cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,0.1));//寻找内角点的压像素值。 //Draw it cvDrawChessboardCorners(image,board_sz,corners,corner_count,found); cvShowImage("Calibration",image); //画出角点 //If we got a good board ,add it to our data if(corner_count == board_n){ //角点全部被找出 step = successes*board_n; for(int i=step,j=0;j<board_n;++i,++j){ CV_MAT_ELEM(*image_points,float,i,0)=corners[j].x; CV_MAT_ELEM(*image_points,float,i,1)=corners[j].y; //将角点坐标存储到图像点当中。 CV_MAT_ELEM(*object_points,float,i,0)=j/board_w; CV_MAT_ELEM(*object_points,float,i,1)=j%board_w; //世界坐标,说明设定每个格子的长度为1. CV_MAT_ELEM(*object_points,float,i,2)=0.0f; //Z轴坐标值为0,将棋盘平面设为世界坐标的XOY平面。 } CV_MAT_ELEM(*point_counts,int,successes,0)=board_n; successes++; } }//end skip board_dt between chessboard capture //Handle pause/unpause and ESC int c =cvWaitKey(15); //暂停和退出设置。 if(c=='p'){ c = 0; while(c!='p'&&c!=27){ c=cvWaitKey(250); } } if(c==27) return 0; image = cvQueryFrame(capture);//Get next image }//End collection while loop. //allocate matrices according to how many chessboards found CvMat * object_points2 = cvCreateMat(successes*board_n,3,CV_32FC1); CvMat * image_points2 = cvCreateMat(successes*board_n,2,CV_32FC1); CvMat * point_counts2 = cvCreateMat(successes,1,CV_32FC1); //transfer the points into the correct size matrices //below, we write out the details in the next two loops.we could instead have written: //image_points->rows=object_points->rows= //successes*board_n;point_counts->rows = successes; // for(int i = 0;i<successes*board_n;++i){ CV_MAT_ELEM(*image_points2,float,i,0)= CV_MAT_ELEM(*image_points,float,i,0); CV_MAT_ELEM(*image_points2,float,i,1)= CV_MAT_ELEM(*image_points,float,i,1); CV_MAT_ELEM(*object_points2,float,i,0)= CV_MAT_ELEM(*object_points,float,i,0); CV_MAT_ELEM(*object_points2,float,i,1)= CV_MAT_ELEM(*object_points,float,i,1); CV_MAT_ELEM(*object_points2,float,i,2)= CV_MAT_ELEM(*object_points,float,i,2); } for(int i=0;i<successes;++i){//There are all the same number CV_MAT_ELEM(*point_counts2,int,i,0)=CV_MAT_ELEM( *point_counts,int,i,0); } cvReleaseMat(&object_points); cvReleaseMat(&image_points); cvReleaseMat(&point_counts);//搞不懂为什么不直接用point_counts等,而要赋给point_counts2 //at this point we have all of the chessboard corners we need. //initialize the intrinsic matrix such that the two focal //lengths have a ratio of 1.0 // CV_MAT_ELEM(*intrinsic_matrix,float,0,0)=1.0f; //初始化内参矩阵 CV_MAT_ELEM(*intrinsic_matrix,float,1,1)=1.0f; //calibrate the camera! cvCalibrateCamera2( object_points2,image_points2, point_counts2,cvGetSize(image), intrinsic_matrix,distortion_coeffs, NULL,NULL,0 //CV_CALIB_FIX_ASPECT_RATIO ); //定标,校正和旋转平移 //save the intrinsics and distortions cvSave("Intrinsics.xml",intrinsic_matrix); //把参数存下来。 cvSave("Distortion.xml",distortion_coeffs); //example of loading these matrices back in: CvMat *intrinsic = (CvMat*)cvLoad("Intrinsics.xml");//intrinsic把参数读出来,传给重投影的函数应用的指针。 CvMat *distortion = (CvMat*)cvLoad("Distortion.xml"); //build the undistort map that will use for all //subsequent frames // IplImage* mapx = cvCreateImage(cvGetSize(image),IPL_DEPTH_32F,1); IplImage* mapy = cvCreateImage(cvGetSize(image),IPL_DEPTH_32F,1); cvInitUndistortMap( intrinsic, distortion, mapx, mapy ); //just run the camera to the screen, now showing the raw and the undistorted image. // cvNamedWindow("Undistort"); while(image){ IplImage *t=cvCloneImage(image); cvShowImage("Calibration",image);//show raw image cvRemap(t,image,mapx,mapy);//undistort image //重投影图像。 cvReleaseImage(&t); cvShowImage("Undistort",image);//show corrected image //handle pause/unpause and ESC int c = cvWaitKey(15); if(c=='p'){ c=0; while(c!='p'&&c!=27){ c=cvWaitKey(250); } } if(c==27) break; image = cvQueryFrame(capture); } system("pause"); return 0; //system("pause"); }

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《Oracle Java SE编程自学与面试指南》最佳学习路线图2020年最新版(进大厂必备)

正确选择比瞎努力更重要!

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

字节跳动面试官竟然问了我JDBC?

轻松等回家通知

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

2020春招面试了10多家大厂,我把问烂了的数据库事务知识点总结了一下

2020年截止目前,我面试了阿里巴巴、腾讯、美团、拼多多、京东、快手等互联网大厂。我发现数据库事务在面试中出现的次数非常多。

爬虫(101)爬点重口味的

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,都快流鼻血。。。然后小弟冥思苦想,得干一点有趣的事情python 爬虫库安装https://s.taobao.com/api?_ks...

在拼多多上班,是一种什么样的体验?我心态崩了呀!

之前有很多读者咨询我:武哥,在拼多多上班是一种什么样的体验?由于一直很忙,没抽出时间来和大家分享。上周末特地花点时间来写了一篇文章,跟大家分享一下拼多多的日常。 1. 倒时差的作息 可能很多小伙伴都听说了,拼多多加班很严重。这怎么说呢?作息上确实和其他公司有点区别,大家知道 996,那么自然也就能理解拼多多的“11 11 6”了。 所以当很多小伙伴早上出门时,他们是这样的: 我们是这样的: 当...

应聘3万的职位,有必要这么刁难我么。。。沙雕。。。

又一次被面试官带到坑里面了。面试官:springmvc用过么?我:用过啊,经常用呢面试官:springmvc中为什么需要用父子容器?我:嗯。。。没听明白你说的什么。面试官:就是contr...

太狠了,疫情期间面试,一个问题砍了我5000!

疫情期间找工作确实有点难度,想拿到满意的薪资,确实要点实力啊!面试官:Spring中的@Value用过么,介绍一下我:@Value可以标注在字段上面,可以将外部配置文件中的数据,比如可以...

自学编程的 6 个致命误区

嗨,小伙伴们大家好,我是沉默王二。本篇文章来和大家聊聊自学编程中的一些误区——这是我在 B 站上看了羊哥的一期视频后有感而发的文章。因为确实有很多读者也曾私信问过我这些方面的问题,很有代表性,所以我就结合自己的亲身体会来谈一谈,希望对小伙伴们有所启发。 01、追求时髦 所谓基础不牢,地动山摇啊。可很多小伙伴压根就没注意过这个问题,市面上出什么新鲜的技术就想去尝试,结果把自己学的乱七八糟,心灰意冷...

祝贺玄姐,创业两个月,估值近亿,融资几千万,奈学教育,太牛逼了!!!...

玄姐,男,前58同城技术委员会主席,前转转首席架构师,我的10年好友。一月下旬,玄姐找到我,说,哥们我准备创业了。画外音:详见《最好的朋友创业了,我必须为他站台》。番外篇《为何大家都叫...

你看,公司状告员工不加班,居然还告赢了

loonggg读完需要3分钟速读仅需 1 分钟今天跟大家聊一聊加班文化这个话题。今天微博热搜榜上有一个话题就是:#员工拒绝加班被判赔公司 1.8 万# 。具体什么情况呢?扬州某公司员工王...

在北京,我遇上每天必须挣1000元的出租车司机!

在北漂的那段时间几乎天天加班,只要加班必然晚上回家会坐出租车,北漂7年大概遇上了近1000个出租车司机。大家都知道,在北京住的的地方和公司一般距离都很远,就算是晚上10点或者11点的时候...

漫画:什么是 “眼镜蛇效应” ?

世界是复杂的。每当你做出一个决定的时候,你的出发点通常是好的,但结果一定会好吗?在印度的某个地区,当地野生的眼镜蛇非常泛滥。众所周知,眼镜蛇有剧毒,又具有很强的攻击性,给当地居民的生命安...

大海啊,夏天啊,全是腿啊,python带你爬取长腿妹子图

知乎还是很友好的 总体来说没啥难度 简单说下思路 1.评论是动态加载的 直接找json接口 2.分析接口参数,我测试的时候一次最多能拿20条数据(不过我还是一条一条拿的) 3.循环发送请求,其实可以先把评论数抓下来再for range 我只是比较懒(。・ω・。) 4.有的评论没图片,简单try一下或者if处理 首先需要引入爬虫库 import requests from bs4 import Be...

【相亲】95年高颜值妹子,喜欢上进的男生

颜值有点高,条件有点好

汉字不能编程?别闹了,只是看着有点豪横!容易被开除!

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 在编程的路上你是否想过,用汉字写一写代码? 最近有初学编程的小伙伴问小傅哥,汉字可以写代码吗。自己英文不好,要是汉字可以写代码就好了。难道你要的是易语言?其实并不是,小伙伴也是学习 Java 的初学者,刚刚学习到 Spring 看着一片没有注释的代码实在不好理解,要是都是汉字写...

你怎么看欧阳娜娜空降阿里p8?

前段时间 欧阳娜娜空降阿里P8被骂上热搜 有网友调侃道: 名牌大学毕业的研究生 要在阿里没日没夜、加班加点、 全年无休奋斗5年,才可能有机会 和20岁的欧阳娜娜一起喝下午茶…… 本来嘛,大厂✖明星的营销无可厚非 那是什么让撸代码N年的程序员愤愤不平呢? 还不是因为升到P8真的太难了! 这是很多阿里人甚至互联网人遥不可及的梦想! 阿里P8到底有多牛? 根据知乎大V@半佛仙人透露的情况: 阿里P8基本上要求研究生 5 年以上经验,本科 7 年以上经验; P8 一般去小公司就是各种 O,一般公司(非国企、.

Python垃圾回收机制

Python垃圾回收 引用计数器为主 标记清除和分代回收为辅 + 缓存机制 1. 引用计数器 1.1 环状双向链表 refchain 在python程序中创建的任何对象都会放在refchain链表中。 #define PyObject_HEAD PyObject ob_base; #define PyObject_VAR_HEAD PyVarObject ob_base; // 宏定义,包含 上一个、下一个,用于构造双向链表用。(放到refchain链表中时要用到) #define _PyObj

立即提问
相关内容推荐