Opencv 检测棋盘标定点 例程

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

网上的一段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, [email protected]
//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中,但是默认的顺序是从右上角红色的点开始沿着连线从右向左。

时间: 2024-11-05 18:25:01

Opencv 检测棋盘标定点 例程的相关文章

张正友相机标定Opencv实现以及标定流程&amp;&amp;标定结果评价&amp;&amp;图像矫正流程解析(附标定程序和棋盘图)

使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输入和输出分别是哪些? 相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像. 相机标定的输入:标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上). 相机标定的输出:摄像机的内参.外参系数. 这三个基础的问题就决定了使用Openc

OpenCV检测篇(二)——笑脸检测

前言 由于本文与上一篇OpenCV检测篇(一)--猫脸检测具有知识上的连贯性,所以建议没读过前一篇的先去阅读一下前一篇,前面讲过的内容这里会省略掉. 笑脸检测 其实也没什么可省略的,因为跟在opencv中,无论是人脸检测.人眼检测.猫脸检测.行人检测等等,套路都是一样的.正所谓: 自古深情留不住,总是套路得人心. 发挥主要作用的函数有且仅有一个:detectMultiScale().前一篇猫脸检测中已经提到过这个函数,这里就不再详细赘述. 这里只说一下笑脸检测的流程,显然也都是套路: 1.加载人

用 Python 和 OpenCV 检测图片上的条形码

  用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问题,浏览代码之后,我提供了一些对原始算法的更新和改进. 首先需要留意的是,这个算法并不是对所有条形码有效,但会给你基本的关于应用什么类型的技术的直觉. 假设我们要检测下图中的条形码: 图1:包含条形码的示例图片 现在让我们开始写点代码,新建一个文件,命名为detect_barcode.py,打开并编

Q:opencv棋盘标定总是找不到角点

可能是:1.pattern_size没有设置正确(棋盘图片的内角点数目,指除去棋盘边缘的棋盘角点) 2.黑白格,彩格我试了一下不好用 3.内角点的行列数目设置,一定要大于2

[OpenCV-Python] OpenCV 中摄像机标定和 3D 重构 部分 VII

部分 VII摄像机标定和 3D 重构 42 摄像机标定 目标 ? 学习摄像机畸变以及摄像机的内部参数和外部参数 ? 学习找到这些参数,对畸变图像进行修复 42.1 基础 今天的低价单孔摄像机(照相机)会给图像带来很多畸变.畸变主要有两种:径向畸变和切想畸变.如下图所示,用红色直线将棋盘的两个边标注出来,但是你会发现棋盘的边界并不和红线重合.所有我们认为应该是直线的也都凸出来了.你可以通过访问Distortion (optics)获得更多相关细节. 这种畸变可以通过下面的方程组进行纠正: 于此相似

利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来,可是回家一看歪歪斜斜,脑补原画内容又觉得不对,那么就需要算法辅助来从原图里提取原来的内容了.不妨把应用的场景分为以下: 纸张四角的坐标(图中红点)已知的情况 也就是上面的左图中4个红点是可以准确获取,比如手动标注,那么就简单了:用OpenCV的Perspective Trans

OpenCV检测人脸实例代码

下面是使用OpenCV通过在硬盘中读入图像来对其进行Haar人脸检测的代码. //包含头文件 #include <opencv2/core/core.hpp> #include "cv.h" #include "highgui.h" int main() {     const char* cascade_name = "C:\\opencv249\\sources\\data\\haarcascades\\haarcascade_fronta

利用OpenCV检测手掌(palm)和拳头(fist)

思路:利用训练好的palm.xml和fist.xml文件,用OpenCV的CascadeClassifier对每一帧图像检测palm和fist,之后对多帧中检测到的palm和fist进行聚类分组,满足分组条件的区域为最终检测结果. 代码: #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/im

基于opencv的相机标定

双目相机标定以及立体测距原理及OpenCV实现 作者:dcrmg 单目相机标定的目标是获取相机的内参和外参,内参(1/dx,1/dy,Cx,Cy,f)表征了相机的内部结构参数,外参是相机的旋转矩阵R和平移向量t.内参中dx和dy是相机单个感光单元芯片的长度和宽度,是一个物理尺寸,有时候会有dx=dy,这时候感光单元是一个正方形.Cx和Cy分别代表相机感光芯片的中心点在x和y方向上可能存在的偏移,因为芯片在安装到相机模组上的时候,由于制造精度和组装工艺的影响,很难做到中心完全重合.f代表相机的焦距