利用matlab和opencv进行摄像头校正
2014-08-07 17:40
549 查看
在进行摄像头校正过程中,踌躇了许久,现在写出来方便其他人。
1、首先利用matlab的摄像头校正工具箱,下载地址:http://www.vision.caltech.edu/bouguetj/calib_doc/index.html#examples
不得不说matlab非常强大。下载解压之后放到matlab目录下,如:D:\Program Files\MATLAB\R2009b
matlab的运行目录在此下在运行窗口运行calib_gui命令,出现gui窗口
![](http://img.blog.csdn.net/20140807174739171?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpZjY1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
之后的步骤参考http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html第一个例子和/article/8124937.html
matlab得到所需参数之后opencv将参数存入xml文件,参考/article/1843870.html。剩余校正过程参考学习opencv的第十一章11.1例子。
自己的粘下:
#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include "highgui.h"
#include "stdio.h"
#include "cxcore.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
CvCapture* capture = cvCreateCameraCapture(0);
if (!capture)
{
fprintf(stderr,"Could not initialize captureing...\n");
return -1;
}
IplImage* Img = cvQueryFrame(capture);
if (!Img)
{
fprintf(stderr, "Could not catch image from capture...\n");
return 0;
}
cvShowImage("UN", Img);
//IplImage* col = 0;
//col = cvCreateImage(cvGetSize(Img), Img->depth, Img->nChannels);
//cvCopy(Img, col, NULL);
CvMat* intrinsic_matrix = cvCreateMat(3, 3, CV_32FC1);
CvMat* distortion_coeffs = cvCreateMat(5, 1, CV_32FC1);
CV_MAT_ELEM(*intrinsic_matrix,float,0,0) = 1.0f;
CV_MAT_ELEM(*intrinsic_matrix, float, 1, 1) = 1.0f;
float a[3][3]= { 1555.84462, 0, 566.84605, 0, 1661.99293, 666.76700, 0, 0, 1 };
float b[5][1] = { -0.19855, 0.05405, 0.00026, 0.00082, 0.00000};
cvInitMatHeader(intrinsic_matrix, 3, 3, CV_32FC1, a);
cvInitMatHeader(distortion_coeffs, 5, 1, CV_32FC1, b);
cvSave("Intrinsics.xml", intrinsic_matrix);
cvSave("Distortion.xml", distortion_coeffs);
CvMat* intrinsic = (CvMat*)cvLoad("Intrinsics.xml");
CvMat* distortion = (CvMat*)cvLoad("Distortion.xml");
IplImage* mapx = cvCreateImage(cvGetSize(Img),IPL_DEPTH_32F,1);//The x coordinate of the image
IplImage* mapy = cvCreateImage(cvGetSize(Img), IPL_DEPTH_32F, 1);//The y coordinate of the image
cvInitUndistortMap(intrinsic, distortion, mapx, mapy);//caculat the distorted and undistorted images
//run the camera to the screen,now show the raw and the undistorted image
while (Img)
{
IplImage *t = cvCloneImage(Img);
cvShowImage("Calibration", t);//show the raw image
cvRemap(t, Img, mapx, mapy);//undistort image
cvReleaseImage(&t);
cvShowImage("Undistorted", Img);//show the corrected image
int c = cvWaitKey(15);
if (c=='p')
{
c = 0;
while (c!='p'&&c!=27)
{
c = cvWaitKey(200);
}
}
if (c==27)
break;
Img = cvQueryFrame(capture);
}
cvDestroyAllWindows();
return 0;
}
1、首先利用matlab的摄像头校正工具箱,下载地址:http://www.vision.caltech.edu/bouguetj/calib_doc/index.html#examples
不得不说matlab非常强大。下载解压之后放到matlab目录下,如:D:\Program Files\MATLAB\R2009b
matlab的运行目录在此下在运行窗口运行calib_gui命令,出现gui窗口
之后的步骤参考http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html第一个例子和/article/8124937.html
matlab得到所需参数之后opencv将参数存入xml文件,参考/article/1843870.html。剩余校正过程参考学习opencv的第十一章11.1例子。
自己的粘下:
#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include "highgui.h"
#include "stdio.h"
#include "cxcore.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
CvCapture* capture = cvCreateCameraCapture(0);
if (!capture)
{
fprintf(stderr,"Could not initialize captureing...\n");
return -1;
}
IplImage* Img = cvQueryFrame(capture);
if (!Img)
{
fprintf(stderr, "Could not catch image from capture...\n");
return 0;
}
cvShowImage("UN", Img);
//IplImage* col = 0;
//col = cvCreateImage(cvGetSize(Img), Img->depth, Img->nChannels);
//cvCopy(Img, col, NULL);
CvMat* intrinsic_matrix = cvCreateMat(3, 3, CV_32FC1);
CvMat* distortion_coeffs = cvCreateMat(5, 1, CV_32FC1);
CV_MAT_ELEM(*intrinsic_matrix,float,0,0) = 1.0f;
CV_MAT_ELEM(*intrinsic_matrix, float, 1, 1) = 1.0f;
float a[3][3]= { 1555.84462, 0, 566.84605, 0, 1661.99293, 666.76700, 0, 0, 1 };
float b[5][1] = { -0.19855, 0.05405, 0.00026, 0.00082, 0.00000};
cvInitMatHeader(intrinsic_matrix, 3, 3, CV_32FC1, a);
cvInitMatHeader(distortion_coeffs, 5, 1, CV_32FC1, b);
cvSave("Intrinsics.xml", intrinsic_matrix);
cvSave("Distortion.xml", distortion_coeffs);
CvMat* intrinsic = (CvMat*)cvLoad("Intrinsics.xml");
CvMat* distortion = (CvMat*)cvLoad("Distortion.xml");
IplImage* mapx = cvCreateImage(cvGetSize(Img),IPL_DEPTH_32F,1);//The x coordinate of the image
IplImage* mapy = cvCreateImage(cvGetSize(Img), IPL_DEPTH_32F, 1);//The y coordinate of the image
cvInitUndistortMap(intrinsic, distortion, mapx, mapy);//caculat the distorted and undistorted images
//run the camera to the screen,now show the raw and the undistorted image
while (Img)
{
IplImage *t = cvCloneImage(Img);
cvShowImage("Calibration", t);//show the raw image
cvRemap(t, Img, mapx, mapy);//undistort image
cvReleaseImage(&t);
cvShowImage("Undistorted", Img);//show the corrected image
int c = cvWaitKey(15);
if (c=='p')
{
c = 0;
while (c!='p'&&c!=27)
{
c = cvWaitKey(200);
}
}
if (c==27)
break;
Img = cvQueryFrame(capture);
}
cvDestroyAllWindows();
return 0;
}
相关文章推荐
- opencv2-5利用摄像头进行人脸识别
- 利用 Calibration Toolbox for Matlab 工具箱进行双目立体校正
- opencv笔记 1.利用摄像头进行视频文件写入
- MFC中利用Opencv与C++抓取摄像头进行人脸识别(Mat)
- 利用Matlab标定参数在OpenCV中进行立体匹配
- opencv读取使用MATLAB双目标定的结果进行双目校正
- MFC中利用Opencv与C++抓取摄像头进行人脸识别(Mat)
- 利用OpenCV进行图像伽马校正
- MATLAB中利用摄像头抓图进行编程
- 利用Matlab标定参数在OpenCV中进行立体匹配
- MATLAB中利用摄像头抓图进行编程
- 使用 Matlab+OpenCV 进行摄像头标定
- 1.1.3-学习Opencv与MFC混合编程之---画图工具 通过对话框进行工具的参数设置 画曲线 绘图校正
- 利用opencv捕获usb摄像头并写入视频文件
- 利用directshow进行摄像头的开发
- 1.1.3-学习Opencv与MFC混合编程之---画图工具 通过对话框进行工具的参数设置 画曲线 绘图校正
- Window7系统 opencv 利用DirectShow 进行视频采集的解决方案
- 如何使用MATLAB进行USB2.0摄像头的编程
- 利用OpenCV通过HSV直方图来进行图片定位
- 利用GMM进行无监督face recognition的MATLAB代码及分析