2016-09-29 40 views
-3

这里是我的代码findChessboardCorners给出了意想不到的效果

#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

输出说,11时间CORNERS被检测到,但我不知道这么大的价值即将 – dhc

+1

什么是与大写锁定? – slawekwin

+0

对不起! @slawekwin – dhc

回答

1

首先,你应该遵循一些基本规则:

  1. 不要使用活页纸 - >打印/粘在平板上的棋盘
  2. 打印它与一个大的白色边框,以提高检测
  3. 棋盘必须在图像内完整(不像在你的例子E)
  4. 采取多种影像在棋盘上的不同位置

其次,你不能画出你的轮廓成8位灰度图像,使用8位彩色图像代替。 如果我数数正确(计算内角)你的棋盘的大小为(8,6)

0

我有同样的问题,corners的数量是巨大的。经过一番搜索,我发现这个解决方案Here。 由于某种原因,findChessboardCorners函数调整了corners向量的大小。我试过上面的解决方案,它与输出corners很好,但我仍然断言与cornerSubPix功能失败的问题。

+1

谢谢,但我通过插入正确数量的正方形(虽然非常愚蠢的错误)解决了这个问题,之后cornerSubPix函数也可以正常工作!再次感谢!:) – dhc

相关问题