用的python2和opencv2 程式也是論壇里找的
但程式在ret,corners = cv2.findChessboardCorners(gray, (11,8), None)這里好像動不了,求幫忙看看
附上我用的圖和代碼 還有個問題 這個代碼里好像沒有獲取棋盤格單元長度的方法,他怎么標定的啊

# -*- coding:utf-8 -*-
import cv2
import numpy as np
import glob
# 設定尋找亞像素角點的引數,采用的停止準則是最大回圈次數30和最大誤差容限0.001
criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 50, 0.001)
# 獲取標定板角點的位置
objp = np.zeros((8*11,3), np.float32)
objp[:,:2] = np.mgrid[0:11,0:8].T.reshape(-1,2) # 將世界坐標系建在標定板上,所有點的Z坐標全部為0,所以只需要賦值x和y
obj_points = [] # 存盤3D點
img_points = [] # 存盤2D點
img = cv2.imread('/home/pi/Desktop/aboy/qipan.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
size = gray.shape[::-1]
ret,corners = cv2.findChessboardCorners(gray, (11,8), None)
print '1'
if ret:
obj_points.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria) # 在原角點的基礎上尋找亞像素角點
if corners2:
img_points.append(corners2)
else:
img_points.append(corners)
cv2.drawChessboardCorners(img, (11,8), corners, ret) # 記住,OpenCV的繪制函式一般無回傳值
cv2.imshow('img', img)
cv2.waitKey(50)
print len(img_points)
cv2.destroyAllWindows()
# 標定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points,size, None, None)
print "ret:",ret
print "mtx:\n",mtx # 內引數矩陣
print "dist:\n",dist # 畸變系數 distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print "rvecs:\n",rvecs # 旋轉向量 # 外引數
print "tvecs:\n",tvecs # 平移向量 # 外引數
print("-----------------------------------------------------")
# 畸變校正
img = cv2.imread(images[12])
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
print newcameramtx
print("------------------使用undistort函式-------------------")
dst = cv2.undistort(img,mtx,dist,None,newcameramtx)
x,y,w,h = roi
dst1 = dst[y:y+h,x:x+w]
cv2.imwrite('calibresult11.jpg', dst1)
print "方法一:dst的大小為:", dst1.shape
# undistort方法二
print("-------------------使用重映射的方式-----------------------")
mapx,mapy = cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5) # 獲取映射方程
#dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR) # 重映射
dst = cv2.remap(img,mapx,mapy,cv2.INTER_CUBIC) # 重映射后,影像變小了
x,y,w,h = roi
dst2 = dst[y:y+h,x:x+w]
cv2.imwrite('calibresult11_2.jpg', dst2)
print "方法二:dst的大小為:", dst2.shape # 影像比方法一的小
print("-------------------計算反向投影誤差-----------------------")
tot_error = 0
for i in xrange(len(obj_points)):
img_points2, _ = cv2.projectPoints(obj_points[i],rvecs[i],tvecs[i],mtx,dist)
error = cv2.norm(img_points[i],img_points2, cv2.NORM_L2)/len(img_points2)
tot_error += error
mean_error = tot_error/len(obj_points)
print "total error: ", tot_error
print "mean error: ", mean_error
uj5u.com熱心網友回復:
改成(8,11)試試轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/124899.html
標籤:OpenCV
上一篇:##輕松一點#
