我有一张从相机拍摄的棋盘图片:
这是我的最小工作示例代码:
import cv2
print(cv2.__version__)
left_gray = cv2.imread('left_raw.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)
print(left_gray.shape)
ret, left_corners = cv2.findChessboardCorners(left_gray, (6,5))
print(left_corners)
这是输出,表示没有找到任何角落:
2.4.13.1
(1080, 1920)
None
我阅读了其他几个StackOverflow问题:
我现在有点迷失如何找到角落。有没有人有他们想分享的建议?如果您想测试它们,图像和代码就在这里。我还应该指出,我尝试在拍摄图像时增加原始相机的亮度,但没有运气。
答案 0 :(得分:3)
我能够使用cv2.goodFeaturesToTrack()
获得满意的结果。
CODE:
corners = cv2.goodFeaturesToTrack(gray_img,25,0.01,10)
corners = np.int0(corners)
for i in corners:
x,y = i.ravel()
cv2.circle(img,(x,y),3,(0,0,255),-1)
cv2.imshow('Corners',img)
我知道这不准确,但通过一些预处理,你应该能够获得更好的结果。
:d
答案 1 :(得分:3)
这是我在以下环境中获得的最佳结果:
5x5
C ++代码:
cv::Mat img = cv::imread("klpVW.jpg", cv::IMREAD_GRAYSCALE);
cv::resize(img, img, cv::Size(), 0.5, 0.5);
cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
clahe->apply(img, img);
std::vector<cv::Point2f> corners;
cv::Size boardSize(5, 5);
bool found = cv::findChessboardCorners(img, boardSize, corners);
std::cout << "found=" << found << std::endl;
cv::Mat display(img.size(), CV_8UC3);
cv::cvtColor(img, display, cv::COLOR_GRAY2BGR);
cv::drawChessboardCorners(display, boardSize, cv::Mat(corners), found);
cv::imshow("Chessboard corners", display);
cv::imwrite("test_chessboard_corners.png", display);
cv::waitKey(0);
由于您的OpenCV版本不同,您可能得不到相同的结果。无论如何,你应该使用这个OpenCV pattern(你似乎对我来说略有不同),并记住校准模式必须尽可能平坦,以获得良好的校准结果。