这是我的代码
#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;
}
代码正在从网络摄像头捕获帧。如果检测到棋盘,则会打印出找到的角落总数(我这样做是因为我没有获得与教程代码相同的输出,我想找到错误的位置)。
输出:
答案 0 :(得分:1)
首先你应该遵循一些基本规则:
其次,您无法将轮廓绘制为8位灰度图像,而是使用8位彩色图像。 如果我算得正确(计算内角)你的棋盘大小(8,6)。
答案 1 :(得分:1)
我遇到同样的问题,corners
的数量很大。经过一番搜索,我发现了这个解决方案Here。
出于某种原因,findChessboardCorners
函数会调整corners
向量的大小。我尝试了上面的解决方案,它与输出corners
配合得很好,但我仍然有cornerSubPix
函数的断言失败问题。