win10下使用python相机标定总是报错

在用摄像头采集了相机张片后进行标定时,cv2.calibrateCamera这个API总是报错,求原因和解决方法

img

img

原因
1、该错误表示作为参数提供的向量之一为空。
如果不是所有条件都满足,该函数有一个断言阻止您使用它。这次它检查是否有足够的图像点(nimages > 0必须为真)。

2、发生错误是因为您没有足够的图像点。由于以下原因:

该算法循环遍历您的每一张图像,但无法检测到棋盘(否则您会看到消息“检测到棋盘!”)。
由于它无法检测到棋盘,因此 img_points 数组保持为空并按原样发送到 calibrateCamera 函数。calibrateCamera 函数有一个内部断言,如果没有图像点,您将无法使用它。

解决方法

1、查看图片路径是否正确

2、拍摄更多或更好的照片。
可以查看有的教程中的第 3 步:https ://medium.com/@omar.ps16/stereo-3d-reconstruction-with-opencv-using-an-iphone-camera-part-ii-77754b58bfe0

或者您可以查看此资源:http ://aishack.in/tutorials/calibrating-undistorting-opencv-oh-yeah/

无论如何,问题很可能出在您拍摄照片的方式上,而不是代码本身。

另外
作为一般经验法则:

  • 确保您选择的棋盘图案有足够大的正方形。并且这些正方形之间有明显的区别。
  • 确保棋盘图案具有纯色背景(即背景中没有纹理),最好是白色。
  • 确保您的棋盘图案在您放置的表面上完全平坦(纸上的裂缝或其他人工制品可能会影响准确性)。
  • 确保从不同的角度和角度拍摄照片。(不要偏向一侧,确保从各个方面拍照)。

参考:

除此之外
另外一件事,您应该在进行校准之前检查它们是否有点,
例如添加以下代码:

if len(objpoints) == len(imgpoints) and len(objpoints) > 0:
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
else:
    print("not enough points to calibrate")

如有问题及时沟通

从报错来说,是nimage<=0 了,怀疑是因为图片读取序列问题,这一般又是因为路径问题,扩展名问题,注意区分大小写(而windows下图片扩展名可能不一定全部是小写的)。

其实涉及这个问题的主要可能就是:
原因:
1. 图片路径问题,没有指向包含棋盘格的图片
2. 图片中不包含棋盘格或者图片模糊等问题,导致查找棋盘格角点失败
对应解决方法:
1.仔细检查图片路径和棋盘格图片是否对应
2.检查棋盘格图片是否模糊,可以写个小工具程序显示找到角点的位置,如果发现图片有问题没有找到角点,就需要重新拍摄

额外的,关于棋盘格清晰的要求(建议)是:
棋盘图案有足够大,要求正方形,且这些正方形之间有明显的颜色区别。
棋盘图案是纯色背景(最后没有没有(明显)纹理),最好的是白色,
图案要平整、完整,即图案平面这个没有起伏,和镜头平面成稳定角度

nimages≤0了

ROS kinetic 下单目摄像机的标定
https://cloud.tencent.com/developer/article/1526524

代码应该是没有问题的,那问题就可能出在图片上,我看你代码中识别角点以后有画角点连线,你可以把cv2.waitKey的时间加长,或者直接改为0,查看每张图片角点识别结果,可能有识别失败的,详细的可以参考我这个帖子
https://blog.csdn.net/aibingjin/article/details/123942268

原因:

       ① 图片路径问题,没有指向包含棋盘格的图片

       ② 图片中不包含棋盘格或者图片模糊等问题,导致查找棋盘格角点失败

解决方法:

       ① 仔细检查图片路径和棋盘格图片是否对应

       ② 检查棋盘格图片是否模糊,可以写个小tool显示找到角点的位置,如果发现图片有问题没有找到角点,就重新拍摄

img


这里缩进呢?是没有缩进还是你忘记缩进了?如果忘记的话至少缩进正确吧,不然你的gray等图片的变量都是在for循环内,但是你的函数在for循环外,也就是说你的gray有可能是空的。另外就是你的objp变量是什么,如果在循环外定义,请完整的代码全部截取。
另外就是确认下你的路径下面的图片名不能有中文或者中文字符,opencv的imread并不支持中文读取

原因:1、 图片路径问题,没有指向包含棋盘格的图片
2、图片中不包含棋盘格或者图片模糊等问题,导致查找棋盘角点失败

解决方法:

  1、仔细检查图片路径和棋盘格图片是否对应

       2、检查棋盘格图片是否模糊,可以写个小tool显示找到角点的位置,如果发现图片有问题没有找到角点,就重新拍摄

  一方面可能是图片质量的原因,一方面可能是opencv找棋盘格角点的功能不是太稳健,希望对你有帮助
正确调用方法
import cv2
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    frame = cv2.flip(
            frame,
            1  # 1:水平镜像,-1:垂直镜像
        )
    cv2.imshow('frame', frame)
    # 这一步必须有,否则图像无法显示
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# 当一切完成时,释放捕获
cap.release()
cv2.destroyAllWindows()

同问

一共三个博文,看完想一想,不行就请教同事或指导老师,上面回答的描述跟这几个参考差不多,还是要多多想想:https://blog.csdn.net/stq054188/article/details/105674740
https://blog.csdn.net/thomson617/article/details/103472374
https://www.shangmayuan.com/a/898f5e61e4aa4dc5a361d49d.html

同求

楼上这几篇文章值得一看,我也看了一下,感觉挺好的
建议自已先找一找相关资料,百度很香的,多找一找说不定就有灵感了。
https://blog.csdn.net/stq054188/article/details/105674740
https://blog.csdn.net/thomson617/article/details/103472374
https://www.shangmayuan.com/a/898f5e61e4aa4dc5a361d49d.html
原因的话像一下这些都可能是
1、该错误表示作为参数提供的向量之一为空。
如果不是所有条件都满足,该函数有一个断言阻止您使用它。这次它检查是否有足够的图像点(nimages > 0必须为真)。
2、发生错误是因为您没有足够的图像点。由于以下原因:
该算法循环遍历您的每一张图像,但无法检测到棋盘(否则您会看到消息“检测到棋盘!”)。
由于它无法检测到棋盘,因此 img_points 数组保持为空并按原样发送到 calibrateCamera 函数。calibrateCamera 函数有一个内部断言,如果没有图像点,您将无法使用它。

检查下有没有操作的权限