本文实例为大家分享了OpenCV实现简易标定板的具体代码,供大家参考,具体内容如下

使用OpenCV生成标定板图片,然后找高精度打印机进行打印,贴在硬板上,就可以得到一个简易的标定板。

废话不多说,代码如下:

//编程环境:VS2013, X64,OpenCV3.0.0
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\opencv.hpp>
 
using namespace std;
using namespace cv;
 
int main(){ 
        //单位转换
 int dot_per_inch = 96;  //我的电脑是96DPI(dot per inch)
 double cm_to_inch = 0.3937; //1cm=0.3937inch
 double inch_to_cm = 2.54;   //1inch = 2.54cm
 double inch_per_dot = 1.0 / 96.0;
 
        //自定义标定板
 double blockSize_cm = 1.3; //方格尺寸:边长1.3cm的正方形
        int blockNum = 8; //8*8个方格
 
 
 int blockSize = (int)(blockSize_cm /inch_to_cm *dot_per_inch);
 cout << blockSize << endl;
 
 int imageSize = blockSize * blockNum;
 cout << imageSize << endl;
 Mat chessBoard(imageSize, imageSize, CV_8UC3, Scalar::all(0));
 unsigned char color = 0;
 
 for (int i = 0; i < imageSize; i = i + blockSize){
  color = ~color;
  for (int j = 0; j < imageSize; j = j + blockSize){
   Mat ROI = chessBoard(Rect(i, j, blockSize, blockSize));
   ROI.setTo(Scalar::all(color));
   color = ~color;
  }
 }
 imshow("Chess board", chessBoard);
        imwrite("C:\\Users\\ComputerName\\Pictures\\chessBoard.jpg",chessBoard);
 cvWaitKey(3000);
        return 0;
}

声明:代码红色部分是标定板生成的主要代码,参考的 是别人的,具体出处找不到了。单位换算是我后来添加的,方便大家根据镜头视场生成合理的标定板。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员的世界。

OpenCV实现简易标定板的更多相关文章

  1. C语言中sprintf()函数的用法

    sprintf函数的用法1、该函数包含在stdio.h的头文件中。2、sprintf和平时我们常用的printf函数的功能很相似。sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。3、sprintf函数的格......

  2. C++ 控制台弹出文件管理对话框案例

    在控制台程序中打开文件管理对话框,效果图如下所示:在需要弹出对话框的地方插入以下代码://打开文件管理窗口TCHAR szBuffer[MAX_PATH] = { 0 };OPENFILENAME file = { 0 };file.hwndOwner = NULL;file.lStructSize......

  3. C语言的进制转换及算法实现教程

    1、其他进制转十进制1.1、二进制转十进制转换规程: 从最低位开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和,例如:二进制 1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 1 + 2 + 0 + 8 = 111.2、八制转十进制转换规则: 从最低位开始......

  4. 关于C++中构造函数的常见疑问

    基本概念我们已经知道在定义一个对象时,该对象会根据你传入的参数来调用类中对应的构造函数。同时,在释放这个对象时,会调用类中的析构函数。其中,构造函数有三种,分别是默认构造函数,有参构造函数和拷贝构造函数。在类中,如果我们没有自行定义任何的构造函数,编译器会为我们提供两种构造函数(默认构造函数和拷贝构......

  5. std::async的使用总结

    C++98标准中并没有线程库的存在,直到C++11中才终于提供了多线程的标准库,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。多线程库对应的头文件是#include ,类名为std::thread。然而线程毕竟是比较贴近系统的东西,使用起来仍然不是很方便,特别是线程同步及获取线程运行结......

  6. C语言之漫谈指针(下)

    C语言之漫谈指针(下)在上节我们讲到了一些关于指针的基础知识:详见:C语言之漫谈指针(上)本节大纲:零.小tips一.字符指针二.指针数组与数组指针三.数组传参与指针传参四.函数指针及函数指针数组五.回调函数六.例题讲解 零.小tips在正式开始下节之前,我们先来穿插两个小tips:1.打印函数......

  7. 关于C语言中数据在内存中的存储详解

    前言1. 数据类型详细介绍2. 整形在内存中的存储:原码、反码、补码3. 大小端字节序介绍及判断4. 浮点型在内存中的存储解析一、数据类型介绍1.类型的基本归类1.整形家族charunsigned charsigned charshortunsigned short [int]signed shor......

  8. std::async的使用总结

    C++98标准中并没有线程库的存在,直到C++11中才终于提供了多线程的标准库,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。多线程库对应的头文件是#include ,类名为std::thread。然而线程毕竟是比较贴近系统的东西,使用起来仍然不是很方便,特别是线程同步及获取线程运行结......

  9. C语言位运算解决只出现一次的数字

    解题所需要的C语言基础知识hello!从现在开始就进入本题解的正式内容了。首先给大家用图解的方式介绍3个C语言位运算的基本操作符 & | ^这些知识对下面的解题都非常重要,一定要熟练掌握,不然等会会有一种“我在哪,我是谁我在干什么”的感觉。只出现一次的数字I题目描述只出现一次的数字给定一个非......

  10. C语言递归之汉诺塔和青蛙跳台阶问题

    递归就是一个函数执行过程中调用自己,在c语言中有很多关于递归的经典问题,例如:斐波那契数列问题、汉诺塔问题等,在研究递归问题时我们要注意三点:1.递归的结束条件2.递归在每次进行过程中,都得离条件越来越近3.相邻两次递归调用之间的关联关系汉诺塔问题:有三根杆子A, B, C。A杆上有N个(N >......

随机推荐

  1. Python爬虫系统化学习(4)

    Python爬虫系统化学习(4)在之前的学习过程中,我们学习了如何爬取页面,对页面进行解析并且提取我们需要的数据。在通过解析得到我们想要的数据后,最重要的步骤就是保存数据。一般的数据存储方式有两种:存储在文件或者数据库中。在本篇博客中我会细致的讲解从零基础到血会存储在txt或者csv文件,以及通过P......

  2. Python 如何将字符串每两个用空格隔开

    我就废话不多说了,大家还是直接看代码吧~example>>> import re>>> subject = '080045000106309140003F2F7D100A0A3C0A0A0A3D0A00000800450000EE000000003F06CCF0C......

  3. .NET并发编程-函数式编程

    本系列学习在.NET中的并发并行编程模式,实战技巧函数式编程和面向过程编程POP(procedure oriented Programming)面向对象编程OOP(object oriented programming)一样也是一种编程思维。函数式编程FP(functional programmin......

  4. Android如何实现年月选择器功能

    开发过程中,年月的选择功能还是比较常见的,像这种功能点比较常见,要是每次都要自己手动去写,这无疑会耗费比较多的时间与精力,今天给大家介绍一个第三方库,使用该库来完成年月选择器功能。一、效果图二、实现步骤:1、依赖库implementation 'cn.aigestudio.wheelpicker:W......

  5. 复杂的数据类型

    目录一、列表 1.列表介绍 2.列表读取 读取单个元素 读取列表的一部分 3.列表的修改 4.其他常用操作列表的函数 二、字典 1.字典的介绍 2.字典的读取 3.字典的元素增减 一、列表1.列表介绍列表,数据类型为list,可以存储多个不同种类的元素,其中,字符串元素需要加引号,且元素间要用逗号隔......

  6. vue 中this.$set 动态绑定数据的案例讲解

    感觉网上对this.$set的讲解乱糟糟的,我来总结一下对它单个数据、对象、数组、json数据的绑定.话不多说直接上代码:text0 text0: {{text0}}textObj textObj.text1: {{textObj.text1}}textArr textArr[1]: {{textA......

  7. python使用pygame创建精灵Sprite

    一 、精灵(Sprite),屏幕上的对象。精灵组是精灵的组合。创建空的精灵组对象:精灵组可以对其中的所有精灵调用它们各自的更新方法(self.update)来进行更新,如位置更新、碰撞检测、冲突检测等:all_sprites.update() 精灵组可以对其中的所有精灵调用它们各自的D......

  8. Java 给Word不同页面设置不同背景

    Word文档中,可直接通过【设计】-【页面颜色】页面颜色,通过Java代码可参考如下设置方法:1. 设置单一颜色背景doc.getBackground().setType(BackgroundType.Color);doc.getBackground().setColor(Color.PINK);2......

  9. 网页小实验——用canvas生成精灵动画图片

    实验目标:借助canvas把一张国际象棋棋子图片转换为一组适用于WebGL渲染的精灵动画图片,不借助其他图片处理工具,不引用其他库只使用原生js实现。初始图片如下:一、图片分割将初始图片分割为六张大小相同的棋子图片1、html舞台:1 DOCTYPE html> 2 <html lan......

  10. sql查询当天的数据

    今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0昨天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=17天内的所有数据:selec......