https://blog.csdn.net/u010128736/article/details/52875137

https://blog.csdn.net/h532600610/article/details/51800488

python 角点检测+相机标定+去畸变+重投影误差计算:

#coding:utf-8

importcv2importnumpy as npimportglob#找棋盘格角点#阈值

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)#棋盘格模板规格

w = 9h= 6

#世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵

objp = np.zeros((w*h,3), np.float32)

objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)#储存棋盘格角点的世界坐标和图像坐标对

objpoints = [] #在世界坐标系中的三维点

imgpoints = [] #在图像平面的二维点

images= glob.glob('calib/*.png')for fname inimages:

img=cv2.imread(fname)

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#找到棋盘格角点

ret, corners =cv2.findChessboardCorners(gray, (w,h),None)#如果找到足够点对,将其存储起来

if ret ==True:

cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)

objpoints.append(objp)

imgpoints.append(corners)#将角点在图像上显示

cv2.drawChessboardCorners(img, (w,h), corners, ret)

cv2.imshow('findCorners',img)

cv2.waitKey(1)

cv2.destroyAllWindows()#标定

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)#去畸变

img2 = cv2.imread('calib/00169.png')

h, w= img2.shape[:2]

newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h)) #自由比例参数

dst =cv2.undistort(img2, mtx, dist, None, newcameramtx)#根据前面ROI区域裁剪图片#x,y,w,h = roi#dst = dst[y:y+h, x:x+w]

cv2.imwrite('calibresult.png',dst)#反投影误差

total_error =0for i inxrange(len(objpoints)):

imgpoints2, _=cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)

error= cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)

total_error+=errorprint "total error:", total_error/len(objpoints)

标定 cv2.calibrateCamera函数文档:https://docs.opencv.org/2.4.1/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

c++ 角点检测+角点绘制:

#include #include#include#include

using namespacestd;intmain( )

{

cout<

IplImage* imgRGB =cvLoadImage(filename);

IplImage* imgGrey =cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE);if (imgGrey==NULL){//image validation

cout<< "No valid image input."<

}//-------find chessboard corners--------------

int corner_row=7;//interior number of row corners.(this can be countered by fingers.)

int corner_col=7;//interior number of column corners.

int corner_n=corner_row*corner_col;

CvSize pattern_size=cvSize(corner_row,corner_col);//CvPoint2D32f* corners=new CvPoint2D32f[corner_n];

CvPoint2D32f corners[49];intcorner_count;int found=cvFindChessboardCorners(//returning non-zero means sucess.

imgGrey,//8-bit single channel greyscale image.

pattern_size,//how many INTERIOR corners in each row and column of the chessboard.

corners,//an array where the corner locations can be recorded.

&corner_count,//optional, if non-NULL, its a point to an integer where the nuber of corners found can be recorded.//CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS//check page 382-383.

0);

cout<

cvDrawChessboardCorners(

imgRGB,

pattern_size,

corners,

corner_count,

found

);

cvSaveImage(filename2,imgRGB);//to summary a bit of findings.

cout<

cout<

cout<

cvNamedWindow("Find and Draw ChessBoard", 0);

cvShowImage("Find and Draw ChessBoard", imgRGB );

cvWaitKey(0);

cvReleaseImage(&imgGrey);

cvReleaseImage(&imgRGB);

cvDestroyWindow("Find and Draw ChessBoard");return 0;

}

注意事项:

pattern_size参数传递内点数,8*8的棋盘只有7*7内点。

图像选取应注意减少干扰,例如光照与背景等。

Corners中的角点坐标顺序排列规律不一定是以行从左上到右下。使用坐标计算映射关系时应提高警惕,对坐标进行重新排列。

关键函数参数说明:

int cvFindChessboardCorners( const void* image, CvSize pattern_size, CvPoint2D32f* corners, int* corner_count=NULL, int flags=CV_CALIB_CB_ADAPTIVE_THRESH );

Image:

输入的棋盘图,必须是8位的灰度或者彩色图像。

pattern_size:

棋盘图中每行和每列角点的个数。

Corners:

检测到的角点

corner_count:

输出,角点的个数。如果不是NULL,函数将检测到的角点的个数存储于此变量。

Flags:

各种操作标志,可以是0或者下面值的组合:

CV_CALIB_CB_ADAPTIVE_THRESH -使用自适应阈值(通过平均图像亮度计算得到)将图像转换为黑白图,而不是一个固定的阈值。

CV_CALIB_CB_NORMALIZE_IMAGE -在利用固定阈值或者自适应的阈值进行二值化之前,先使用cvNormalizeHist来均衡化图像亮度。

CV_CALIB_CB_FILTER_QUADS -使用其他的准则(如轮廓面积,周长,方形形状)来去除在轮廓检测阶段检测到的错误方块。

python 正方形去畸变_opencv 角点检测+相机标定+去畸变+重投影误差计算相关推荐

  1. Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)

    Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...

  2. Python+OpenCV:图像Harris角点检测(Harris Corner Detection)

    Python+OpenCV:图像Harris角点检测(Harris Corner Detection) 理论 corners are regions in the image with large v ...

  3. halcon相机标定及畸变矫正

    1 halcon相机标定和图像矫正     对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标定,获取相机的内参或内外参,然后矫正其畸变.相机畸变主要分为径向畸变和切向畸变, ...

  4. 相机标定之畸变矫正与反畸变计算

    相机标定之畸变矫正与反畸变计算 相机标定问题已经是比较成熟的问题,OpenCV中提供了比较全面的标定.矫正等函数接口.但是如果我想通过一张矫正好的图像,想获得原始的畸变图,却没有比较好的方法,这里讨论 ...

  5. cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8763369.html 参考文献----------OpenCV-Python-Toturial ...

  6. Susan角点检测python实现 (边缘检测、角点检测、重心计算、非极大值抑制)

    Susan角点检测(边缘检测.角点检测.重心计算.非极大值抑制) 写在前面 黄宁然--看过你看过的算法,觉得好难. 参考文献镇楼 [1]https://blog.csdn.net/tostq/arti ...

  7. OpenCV相机标定与畸变校正

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自OpenCV学堂. OpenCV单目相机标定,图像畸变校正 相机标定定义与原理 01 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点 ...

  8. 机器视觉-相机标定及畸变矫正

    摘要:本文首先介绍了针孔相机模型(线性模型),然后推导四个坐标轴变换的关系,引出R.T.K.D中包含相机的5个内参,6个外参.然后介绍相机畸变的原因以及畸变模型(非线性模型),引出相机的5个畸变参数. ...

  9. 相机标定(三) —— 畸变校正

    一.前言 根据针孔模型,物体和成像之间参数会满足相似三角形的关系.但现实中会存在装配误差和透视失真等原因,导致这种关系无法成立,使理想成像与实际成像存在误差,这种误差即称为畸变. 畸变分为径向畸变,切 ...

最新文章

  1. bash脚本编程之for循环
  2. Happy WS 之 控制台 -- Happy Console (一)
  3. php kuozhan
  4. 职工考勤管理信息系统数据库课设_数据库课程设计--职工考勤管理信息系统
  5. C++四种类型强制转换——const_cast、static_cast、dynamic_cast、reinterpret_cast
  6. 腾讯AI Lab的研究方向
  7. C4C微信集成 - agent在C4C系统回复,微信用户在微信端直接收到
  8. 20个让Web Developer开发生涯更加轻松的工具
  9. 黑马 程序员——Java基础---IO(下)
  10. jsoncpp解析json报文测试
  11. 哈哈哈,第一次做codeforce
  12. 软考笔记(数据结构篇)———— 二叉树、树、森林转换
  13. Linux社区代码风格
  14. 盘点俄罗斯大神写的几款软件,你用过几个?最后1个是我的童年
  15. 苹果雪豹操作系统正式版_苹果发布WatchOS 6.1.2第三个测试版本,修复Bug、提升设备稳定性...
  16. 突发!图森未来CEO侯晓迪被罢免,公司市值一夜砍半!自动驾驶未来如何?
  17. 如何做好网站的安全性测试
  18. 隔行插入行、隔行标示颜色,#E灵 #Excel插件
  19. php身份证识别ORC
  20. 保护你的聊天隐私---“外挂式”加密软件设计思路

热门文章

  1. 向朋友借钱:文章值得一读,让人思索良久
  2. 简介 NetWeaver Application Server 的三层架构
  3. 家乐福首家付费会员店遇到「喜与忧」背后,行业同质化问题浮出水面
  4. opencv 图像旋转_用Dlib和OpenCV还能做什么?这个开源项目实现了驾驶员疲劳检测...
  5. java dataconvert_Java DateConverter类代码示例
  6. php谈谈你对分布式的理解,简谈关于对分布式处理的理解
  7. php 导出csv 转义 逗号转义,在csv php中转义换行符
  8. 使用Visual Studio Code 运行编写第一个html文件
  9. 不用第三方库,也能用 Python 作图,效果还不错
  10. cx_oracle写日志信息_MongoDB与MySQL关于写确认的异同