findChessboardCorners 给出意想不到的结果
findChessboardCorners gives unexpected results
这是我的代码
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include<opencv2/opencv.hpp>
#include<iostream>
//#include<vector>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap = VideoCapture(0);
int successes = 0;
int numBoards = 0;
int numCornersHor = 6;
int numCornersVer = 4;
int numSquares = (numCornersHor - 1) * (numCornersVer - 1);
Size board_sz = Size(numCornersHor, numCornersVer);
vector<Point2f> corners;
for (;;)
{
Mat img;
cap >> img;
Mat gray;
cvtColor(img, gray, CV_RGB2GRAY);
if (img.empty()) break; // end of video stream
imshow("this is you, smile! :)", gray);
if (waitKey(1) == 27) break; // stop capturing by pressing ESC
bool found = findChessboardCorners(gray, board_sz, corners, CALIB_CB_ADAPTIVE_THRESH);
if (found == 1)
{
cout << corners.size()<<"\n";
cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
drawChessboardCorners(gray, board_sz, corners, found);
}
}
cap.release();
waitKey();
return 0;
}
代码正在从网络摄像头捕获帧。如果检测到棋盘,则打印出找到的角的总数(我这样做是因为我没有得到与教程代码中相同的输出,我想找到错误所在)。
输出:
首先你应该遵守一些基本规则:
- 不要使用松散的纸张 -> print/glue 平板上的棋盘
- 用大白边打印它以改进检测
- 棋盘必须完全位于图像内部(不像您的示例那样)
- 拍几张棋盘不同位置的照片
其次,您不能将轮廓绘制成 8 位灰度图像,而是使用 8 位彩色图像。
如果我数对了(算内角),你的棋盘大小为 (8,6).
我有同样的问题,corners
的数量很大。经过一番搜索后,我找到了这个解决方案 Here。
由于某种原因 findChessboardCorners
函数调整了 corners
向量的大小。我尝试了上面的解决方案,它与输出 corners
配合得很好,但我仍然遇到 cornerSubPix
函数的断言失败问题。
这是我的代码
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include<opencv2/opencv.hpp>
#include<iostream>
//#include<vector>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap = VideoCapture(0);
int successes = 0;
int numBoards = 0;
int numCornersHor = 6;
int numCornersVer = 4;
int numSquares = (numCornersHor - 1) * (numCornersVer - 1);
Size board_sz = Size(numCornersHor, numCornersVer);
vector<Point2f> corners;
for (;;)
{
Mat img;
cap >> img;
Mat gray;
cvtColor(img, gray, CV_RGB2GRAY);
if (img.empty()) break; // end of video stream
imshow("this is you, smile! :)", gray);
if (waitKey(1) == 27) break; // stop capturing by pressing ESC
bool found = findChessboardCorners(gray, board_sz, corners, CALIB_CB_ADAPTIVE_THRESH);
if (found == 1)
{
cout << corners.size()<<"\n";
cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
drawChessboardCorners(gray, board_sz, corners, found);
}
}
cap.release();
waitKey();
return 0;
}
代码正在从网络摄像头捕获帧。如果检测到棋盘,则打印出找到的角的总数(我这样做是因为我没有得到与教程代码中相同的输出,我想找到错误所在)。
输出:
首先你应该遵守一些基本规则:
- 不要使用松散的纸张 -> print/glue 平板上的棋盘
- 用大白边打印它以改进检测
- 棋盘必须完全位于图像内部(不像您的示例那样)
- 拍几张棋盘不同位置的照片
其次,您不能将轮廓绘制成 8 位灰度图像,而是使用 8 位彩色图像。 如果我数对了(算内角),你的棋盘大小为 (8,6).
我有同样的问题,corners
的数量很大。经过一番搜索后,我找到了这个解决方案 Here。
由于某种原因 findChessboardCorners
函数调整了 corners
向量的大小。我尝试了上面的解决方案,它与输出 corners
配合得很好,但我仍然遇到 cornerSubPix
函数的断言失败问题。