我必须编写一个想要使用python和opencv的相机校准。 我目前遇到的问题如下:
我的代码写在下面:
import sys
import numpy as np
import cv2
image = cv2.imread(sys.argv[1])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret = False
ret, corners = cv2.findChessboardCorners(image, (7,6), None)
print ret
好的,到目前为止还不错,但是我使用我的ret变量的哪个图像每次都转动 False 并不重要,这基本上意味着找不到任何角落。
关于堆栈溢出这里有一些关于这个问题的问题,但没有一个解决方案可以解决我的问题。我尝试使用从500x500到800万像素的图像,然后我将它们磨得更加锐利,我甚至用原来的棋盘来获得角落。他们都没有工作。
是否有另一种方式来获取它们或者我是否从头开始做任何完全错误的事情?
我也试过使用没有灰度的图像,但问题是一样的。
答案 0 :(得分:2)
好的,我发现了问题所在。
之前我不知道的事情是你必须输入的尺寸是棋盘的原始尺寸减去1:
因此,如果您有一个10 x 7的电路板,则使用的尺寸为9 x 6.
也许这会对其他遇到同样问题的人有所帮助。
更新:修正了一个关键错误。使用的尺寸为9 x 6,而不是9 x 7.
答案 1 :(得分:0)
谢谢你。你的答案非常有帮助。 但在我的情况下,9X6工作(不是9X7)。
cv::Mat imgClr = cv::imread( "05-00.png" );
cv::Mat imgGray;
cv::cvtColor( imgClr, imgGray, CV_BGR2GRAY );
cv::namedWindow( "Image", cv::WINDOW_NORMAL );
cv::imshow( "Image", imgGray );
cv::waitKey(0);
cv::Size board_sz = cv::Size(9, 6);
std::vector < cv::Point2f > corners;
bool found = cv::findChessboardCorners(imgGray, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE
| CV_CALIB_CB_FAST_CHECK | CV_CALIB_CB_FILTER_QUADS );
if(found)
{
cv::drawChessboardCorners(imgGray, board_sz, corners, found);
cv::imshow( "Image", imgGray );
cv::waitKey(0);
}