码迷,mamicode.com
首页 > 其他好文 > 详细

Opencv 检测棋盘标定点 例程

时间:2015-06-06 11:46:13      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

 

在相机标定中通常首先需要检测出棋盘标定板上黑白格内角点的位置:

网上的一段cvFindChessboardCorners函数调用代码:

#include <iostream>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/legacy/legacy.hpp"
using namespace std;
 
 
//by Huang, Haiqiao 25 Jun. 2011, fzyhhq@bift.edu.cn
//http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=14214
 
int main( )
{
    cout<<"Draw Chess OpenCV!"<<endl;  
    char* filename="e:/src2/chess2.bmp";
    IplImage* imgRGB = cvLoadImage(filename,1); 
    IplImage* imgGrey = cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE); 
 
    if (imgGrey==NULL){//image validation
        cout<< "No valid image input."<<endl; 
        char c=getchar();
        return 1;
    } 
 
    //-------find chessboard corners--------------
    //使用的棋盘格的内角点个数,如结果图所示
    int corner_row=10;//13;//interior number of row corners.(this can be countered by fingers.)
    int corner_col=12;//interior number of column corners.
    int corner_n=corner_row*corner_col;
    
    CvSize pattern_size=cvSize(corner_row,corner_col);
    CvPoint2D32f* corners=new CvPoint2D32f[corner_n];
    int corner_count;
 
    int found=cvFindChessboardCorners(//returning non-zero means sucess.
        imgGrey,// 8-bit single channel greyscale image.
        pattern_size,//how many INTERIOR corners in each row and column of the chessboard.
        corners,//a pointer to an array where the corner locations can be recorded.
        &corner_count,// optional, if non-NULL, its a point to an integer where the nuber of corners found can be recorded.
        CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS// check page 382-383.
 
        );
     cout<<"corner_count = "<<corner_count;
    //-------Draw the corner pattern-------
    cvDrawChessboardCorners(
        imgRGB,
        pattern_size,
        corners,
        corner_count,
        found
        );
 
    //to summary a bit of findings.
    cout<<"found="<<found<<endl;
    
    CvPoint2D32f* newCorners=new CvPoint2D32f[corner_n];//将检测出来的corner的坐标系转换成为同图像坐标系相同
    int count=0;
    for (int c = 0; c<corner_col; c++)
    {
        cout<<endl;
        for (int r = 0; r<corner_row; r++)
        {
            cout<<"[x="<<corners[c*corner_row+r].x;
            cout<<" y="<<corners[c*corner_row+r].y<<"] ";
            newCorners[count++].x = corners[c*corner_row+r].x;
            newCorners[count++].y = corners[c*corner_row+r].x;
        }
    }
 
    //cvNamedWindow("Find and Draw ChessBoard", 0 );//窗口大小可调
    cvShowImage( "Find and Draw ChessBoard", imgRGB );
 
    cvWaitKey(0); 
 
    cvReleaseImage(&imgGrey);
    cvReleaseImage(&imgRGB);
    //cvDestroyWindow("Find and Draw ChessBoard"); 
 
    return 0;
}

执行结果图:

技术分享

检测结果存储在corner中,但是默认的顺序是从右上角红色的点开始沿着连线从右向左。

 

Opencv 检测棋盘标定点 例程

标签:

原文地址:http://www.cnblogs.com/sunniflyer/p/4556220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!