利用cvFindExtrinsicCameraParams2求取相机外参数

cvFindExtrinsicCameraParams2函数的定义:

1 void cvFindExtrinsicCameraParams2( const CvMat* object_points,
2                                    const CvMat* image_points,
3                                    const CvMat* intrinsic_matrix,
4                                    const CvMat* distortion_coeffs,
5                                    CvMat* rotation_vector,
6                                    CvMat* translation_vector );

  1 #include <cv.h>
  2 #include <highgui.h>
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5
  6 int n_boards = 0; //Will be set by input list
  7 const int board_dt = 10;
  8 int board_w;
  9 int board_h;
 10
 11
 12 void help()
 13 {
 14     printf("Calibration from disk. Call convention:\n\n"
 15                     "Where: board_{w,h} are the # of internal corners in the checkerboard\n"
 16             "       width (board_w) and height (board_h)\n"
 17             "       image_list is space separated list of path/filename of checkerboard\n"
 18             "       images\n\n"
 19             "Hit ‘p‘ to pause/unpause, ESC to quit.  After calibration, press any other key to step through the images\n\n");
 20 }
 21
 22 int main(int argc, char* argv[])
 23 {
 24
 25   CvCapture* capture;// = cvCreateCameraCapture( 0 );
 26  // assert( capture );
 27
 28     if(argc != 4)
 29     {
 30         help();
 31         return -1;
 32     }
 33     help();
 34     board_w = atoi(argv[1]);
 35     board_h = atoi(argv[2]);
 36     int board_n  = board_w * board_h;
 37     CvSize board_sz = cvSize( board_w, board_h );
 38     FILE *fptr = fopen(argv[3],"r");
 39     char names[2048];
 40     //COUNT THE NUMBER OF IMAGES:
 41     while(fscanf(fptr,"%s ",names)==1)
 42     {
 43         n_boards++;
 44     }
 45     rewind(fptr);
 46
 47   cvNamedWindow( "Calibration" );
 48   //ALLOCATE STORAGE
 49   CvMat* image_points      = cvCreateMat(board_n,2,CV_32FC1);
 50   CvMat* object_points     = cvCreateMat(board_n,3,CV_32FC1);
 51   //CvMat* point_counts      = cvCreateMat(1,CV_32SC1);
 52
 53
 54   CvMat *intrinsic = (CvMat*)cvLoad("Intrinsicsr.xml");
 55   CvMat *distortion = (CvMat*)cvLoad("Distortionr.xml");
 56   CvMat* rotation_vector=cvCreateMat(3,1,CV_32FC1);
 57   CvMat* translation_vector=cvCreateMat(3,1,CV_32FC1);
 58   CvMat* rotation_mat=cvCreateMat(3,3,CV_32FC1);
 59   CvMat* jacobian=cvCreateMat(3,1,CV_32FC1);
 60
 61
 62
 63   IplImage* image = 0;// = cvQueryFrame( capture );
 64   IplImage* gray_image = 0; //for subpixel
 65   CvPoint2D32f* corners = new CvPoint2D32f[ board_n ];
 66   int corner_count;
 67
 68       fscanf(fptr,"%s ",names);
 69       image = cvLoadImage( names);
 70       if(gray_image == 0  && image) //We‘ll need this for subpixel accurate stuff
 71           gray_image = cvCreateImage(cvGetSize(image),8,1);
 72
 73       if(!image)
 74           printf("null image\n");
 75
 76       int found = cvFindChessboardCorners(
 77         image,
 78         board_sz,
 79         corners,
 80         &corner_count,
 81         CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS
 82               );
 83
 84       //Get Subpixel accuracy on those corners
 85       cvCvtColor(image, gray_image, CV_BGR2GRAY);
 86       cvFindCornerSubPix(gray_image, corners, corner_count,
 87               cvSize(11,11),cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
 88       //Draw it
 89
 90       cvDrawChessboardCorners(image, board_sz, corners, corner_count, found);
 91       cvShowImage( "Calibration", image );
 92        if( corner_count == board_n )
 93           printf("Found = %d for %s\n",found,names);
 94         for( int i=0; i<board_n; ++i )
 95           {
 96            CV_MAT_ELEM(*image_points, float,i,0) = corners[i].x;
 97            CV_MAT_ELEM(*image_points, float,i,1) = corners[i].y;
 98            CV_MAT_ELEM(*object_points,float,i,0) = i/board_w;
 99            CV_MAT_ELEM(*object_points,float,i,1) = i%board_w;
100            CV_MAT_ELEM(*object_points,float,i,2) = 0.0f;
101           }
102
103         cvFindExtrinsicCameraParams2(
104                             object_points,image_points,intrinsic,distortion,rotation_vector,translation_vector
105                             );
106         cvRodrigues2(
107           rotation_vector,rotation_mat,jacobian=NULL
108                      );
109 cvSave("Rotationr.xml",rotation_mat);
110 cvSave("Translationr.xml",translation_vector);
111   }
时间: 2024-11-10 05:33:24

利用cvFindExtrinsicCameraParams2求取相机外参数的相关文章

利用OpenCV求取图像的重心

转自:http://blog.csdn.net/lxiaoxiaot/article/details/6539834 不规则区域的矩,表示把一个归一化的灰度级图像函数理解为一个二维随机变量的概率密度. 这个随机变量的属性可以用统计特征--矩(Moments)来描述.通过假设非零的像素值表示区域,矩可以用于二值或灰度级的区域描述. Mpq = sigma(i)sigma(j) ip jq f(i,j) 其中x,y,i,j是区域点的坐标(在数字图像中的像素坐标). 令Xc,Yc表示区域重心的坐标,则

递归算法——求取斐波那契数列(2)

import java.util.Scanner; /** * Created by Administrator on 14-5-13. * 改进的计算斐波那契数列的方法,利用参数,经过测试运行时间会成倍减少 测试数据n=40 * 尾递归的本质是:将单次计算的结果缓存起来,传递给下次调用,相当于自动累积. * 尾部递归是一种编程技巧.递归函数是指一些会在函数内调用自己的函数, * 如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归. * 尾部递归的函数有助将算法转化成函数编程语言,

利用矩阵求斐波那契数列

利用矩阵求斐波那契数列 flyfish 2015-8-27 矩阵(matrix)定义 一个m*n的矩阵是一个由m行n列元素排成的矩形阵列.矩阵里的元素可以是数字符号或者数学式. 形如 {acbd} 的数表称为二阶矩阵,它由二行二列组成,其中a,b,c,d称为这个矩阵的元素. 形如 {x1x2} 的有序对称为列向量Column vector 设 A={acbd} X={x1x2} 则 Y={ax1+bx2cx1+dx2} 称为二阶矩阵A与平面向量X的乘积,记为AX=Y 斐波那契(Fibonacci

【VBA研究】利用DateAdd函数取上月或上年同期的日期

作者:iamlaosong DateAdd函数返回一个日期,这一日期加上了一个时间间隔.通过这个函数可以计算很多我们需要的日期,比如上月上年同期日期等. 语法 DateAdd(interval, number, date) DateAdd 函数语法中有下列命名参数: interval  必要.字符串表达式,是所要加上去的时间间隔.它具有好多设定值,比如"m"为月:"d"为日:"yyyy"为年等等. number  必要.数值表达式,是要加上的时间

算法学习:后缀数组 height的求取

[定义] [LCP]全名最长公共前缀,两个后缀之间的最长前缀,以下我们定义 lcp ( i , j ) 的意义是后缀 i 和 j 的最长前缀 [z函数] 函数z [ i ] 表示的是,第 i 个后缀和字符串的最长前缀  [解决问题] 这两个算法都是在解决这个问题 即求后缀和字符串和后缀之间的最长公共前缀 但是有所不同的是, 后缀数组最终求出的是,字典序第 i 个后缀和第 i + 1 个后缀的最长公共前缀 z函数最终求出的是,第 i 个后缀和字符串的最长公共前缀 然后通过这个最长公共前缀求一些其他

线性时间求取第 K 大数

求 Top K 的算法主要有基于快速排序的和基于堆的这两种,它们的时间复杂度都为 \(O(nlogK)\).借助于分治思想,以及快速排序的区间划分,我们可以做到 \(O(n)\) 时间复杂度.具体算法思路如下: 第 1 步,我们将原数据 5 个一组划分为若干个组,最后余下的不足 5 个的额外作为一组,总组数为 \(g=\lceil{n/5}\rceil\): 第 2,3 步, 对每一个组内的 5 个元素利用插入排序算法进行排序,然后将每个组的中位数依次放到数据的前面,最后 \(A[0, g-1]

利用Fiddler抓取websocket包

一.利用fiddler抓取websockt包 打开Fiddler,点开菜单栏的Rules,选择Customize Rules... 这时会打开CustomRules.js文件,在class Handlers中加入以下代码 static function OnWebSocketMessage(oMsg: WebSocketMessage) { // Log Message to the LOG tab FiddlerApplication.Log.LogString(oMsg.ToString()

利用wireshark抓取Telnet的用户名和密码

使用wireshark抓取Telnet   目标ip地址(telnet  192.168.88.1 ) 1,首先打开wireshark,然后选择网卡,点击开始. 2,为了在filter中输入telnet 或者输入(ip.dst == 目标ip地址 and  tcp.port== 23). 3,看下面的数据包,找到telnet  并且能够看到data:\r\n:如下图 4,接下来再看下面的数据包,就能看到明文用户名和密码了.如下图 这时候你就可以看到明文用户名的首字母x了,继续看下去你可以找到后面

Hadoop阅读笔记(二)——利用MapReduce求平均数和去重

前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一年……我在博客园-_-#,希望用dt的代码燃烧脑细胞,温暖小心窝. 上篇<Hadoop阅读笔记(一)——强大的MapReduce>主要介绍了MapReduce的在大数据集上处理的优势以及运行机制,通过专利数据编写Demo加深了对于MapReduce中输入输出数据结构的细节理解.有了理论上的指导,仍