基于OpenCV的Matlab标定实现研究

基于OpenCV的Matlab标定实现研究
基于OpenCV的Matlab标定实现研究

图像处理opencv代码

#include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();

基于OpenCV的摄像机标定

第28卷第1期计算机工程与设计2007年1月V01.28No.1ComputerEngineeringandDesignJan.2007 基于OpenCV的摄像机标定 尹文生,罗瑜林,李世其 (华中科技大学机械科学与工程学院,湖北武汉430074) 摘要:以增强现实系统中摄像机标定技术为研究对象,分析了开放计算机视觉函数库OpenCV中的摄像机模型,特别充分考虑了透镜的径向畸变和切向畸变影响及求解方法,给出了基于OpenCV的摄像机标定算法。该算法充分发挥了OpenCV的函数库功能,提高了标定精度和计算效率,具有良好的跨平台移植性,可以满足增强现实和其它计算机视觉系统的需要。 关键词:计算机视觉;增强现实;摄像机模型;透镜畸变;摄像机标定 中图法分类号:TP391文献标识码:A文章编号:1000.7024(2007)01—0197.03 CameracalibrationbasedonOpenCV YINWel"1。sheng,LUOYu.1in,LIShi—qi (SchoolofMechanicalScienceandEngineering,HuazhongUniversityofScienceandTechnology,Wuhan430074,China)Abstract:Fortheapplicationsoftechnologyofcameracalibrationtoaugustreality,thecameramodelinOpenCV(opensourcecomputervisionlibrary)isdiscussed,especiallyontheinfluencesandsolvingmethodsoflensradialdistortionandtangentialdistortion,andanarithmeticofcameracalibrationbasedonOpenCVisgiven.Thisarithmeticmakesuseofthefunctionsofthelibraryeffectively,improvesprecisionandefficiencyofcomputation,andhasagoodpropertyfortheapplicationtomulti-platform.Itcanmeettheneedsofaugustrealityandothercomputervisionsystems. Keywords:computervision;augustreality;cameramodel;lensdistortion;cameracalibration 0引言 摄像机标定,是指建立摄像机成像几何模型,描述空间坐标系中物体点同它在图像平面上像点之间对应关系的过程。摄像机标定的目的就是确定几何模型参数即摄像机参数“1。摄像机标定是计算机视觉应用中的关键技术,在增强现实系统中也必须采用摄像机标定技术实现图像的注册眨”。摄像机标定技术在立体视觉研究中占有非常重要的地位。一个完整的立体视觉系统通常可分为图像获取、摄像机标定、特征提取、立体匹配、深度确定及内插等6大部分“1。精确标定摄像机内外参数不仅可以直接提高测量精度,而且可以为后继的立体图像匹配与三维重建奠定良好的基础。一】。 目前通常采用的标定方法是基于“两步法圳””的传统摄像机标定方法,该方法比主动视觉摄像机标定方法和摄像机自标定方法标定精度高,而且标定过程简单,经过多年的研究已经发展得比较成熟,鲁棒性高。OpenCV(Intel。opensourcecomputervisionlibrary)是Intel。开放计算机视觉函数库,它由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法,具备强大的图像和矩阵运算能力。该函数库中实现的摄像机标定方法采用的是文献[11]中的两步标定方法,而且在2005年7月最新发布的beta5版本中,不只完全重写了摄像机标定函数,而且引入了文献[12】中的自动寻找角点的方法,进一步提高了标定的智能化程度,用户只需导入用于标定的图片,整个标定过程无需人工的介入。OpenCV中的摄像机标定模块为用户提供了良好的接口,同时支持MS.Windows、Linux平台,有效地提高了开发效率,并且执行速度快,具有良好的跨平台移植性,因此可以很好地应用于工程实际当中。 l标定原理 1.1摄像机模型 摄像机标定首先要选择合适的摄像机模型,确定内外部参数。OpenCV标定算法中的摄像机模型以针孔模型(pin—holemodel)为基础,引入透镜的径向畸变和切向畸变,该模型相比于只引入一阶径向畸变的Tasi模型和针孔模型更加真实地反映了透镜实际的畸变情况m1。在该模型中,将空间点P在世界坐标系中的坐标值呱,K,乙)变换为图像平面上像素坐标系中坐标值(“,v)的过程可分解为下述的4步变换”1: 收稿日期:2005-12?06E-marl:wsyin@mail.hust.edu.cn 基金项目:国家民用航天科研专项计划基金项目(科工技[2004]1530)。 作者简介:尹文生(1963一),男,湖南常宁人,博士,副教授,研究方向为智能CAD、虚拟现实技术、机器人遥操作系统;罗瑜林(1981一),男,江西吉安人,硕士研究生,研究方向为机器人遥操作系统、机器视觉;李世其(1965一),男,江西吉安人,博士,教授,研究方向为CAD/CAE、虚拟现实技术、机器人遥操作系统。 一197— 万方数据

opencv函数目录-Cv图像处理

目录 1 梯度、边缘和角点 1.1 Sobel 1.2 Laplace 1.3 Canny 1.4 PreCornerDetect 1.5 CornerEigenValsAndVecs 1.6 CornerMinEigenVal 1.7 CornerHarris 1.8 FindCornerSubPix 1.9 GoodFeaturesToTrack 2 采样、插值和几何变换 2.1 InitLineIterator 2.2 SampleLine 2.3 GetRectSubPix 2.4 GetQuadrangleSubPix 2.5 Resize 2.6 WarpAffine 2.7 GetAffineTransform 2.8 2DRotationMatrix 2.9 WarpPerspective 2.10 WarpPerspectiveQMatrix 2.11 GetPerspectiveTransform 2.12 Remap 2.13 LogPolar 3 形态学操作 3.1 CreateStructuringElementEx 3.2 ReleaseStructuringElement 3.3 Erode 3.4 Dilate 3.5 MorphologyEx 4 滤波器与色彩空间变换 4.1 Smooth 4.2 Filter2D 4.3 CopyMakeBorder 4.4 Integral 4.5 CvtColor 4.6 Threshold 4.7 AdaptiveThreshold 5 金字塔及其应用 5.1 PyrDown 5.2 PyrUp 6 连接部件 6.1 CvConnectedComp

opencv摄像机标定代码

// cvCalib.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include #include void InitCorners3D(CvMat *Corners3D, CvSize ChessBoardSize, int Nimages, float SquareSize); int image_width = 768; int image_height = 576;//待标定图片的大小 const int ChessBoardSize_w = 7; const int ChessBoardSize_h = 7;//图片中可标定的角数 const CvSize ChessBoardSize = cvSize(ChessBoardSize_w,ChessBoardSize_h); const int NPoints = ChessBoardSize_w*ChessBoardSize_h;//角点个数 const int NImages=6;//待标定的图片数 int corner_count[NImages] = {0}; float SquareWidth = 10; //棋盘格子的边长,可任意设定,不影响内参数 CvMat *intrinsics; CvMat *distortion_coeff; CvMat *rotation_vectors; CvMat *translation_vectors; CvMat *object_points; CvMat *point_counts; CvMat *image_points; void main() { IplImage *current_frame_rgb; IplImage *current_frame_gray; IplImage *chessBoard_Img; CvPoint2D32f corners[NPoints*NImages]; chessBoard_Img =cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 3); current_frame_gray = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 1); current_frame_rgb = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 3); int captured_frames=0;

图像管理方案计划opencv代码

/. #include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();

基于opencv对图像的预处理

基于opencv 对图像的预处理 1.问题描述 本次设计是基于opencv 结合c++语言实现的对图像的预处理,opencv 是用于开发实时的图像处理、计算机视觉及模式识别程序;其中图像的预处理也就是利用opencv 对图像进行简单的编辑操作;例如对图像的对比度、亮度、饱和度进行调节,同时还可以对图像进行缩放和旋转,这些都是图像预处理简单的处理方法;首先通过opencv 加载一幅原型图像,显示出来;设置五个滑动控制按钮,当拖动按钮时,对比度、亮度、饱和度的大小也会随之改变,也可以通过同样的方式调节缩放的比例和旋转的角度,来控制图像,对图像进行处理,显示出符合调节要求的图像,进行对比观察他们的之间的变化。 2.模块划分 此次设计的模块分为五个模块,滑动控制模块、对比度和亮度调节模块、饱和度调节模块、缩放调节模块、旋转调节模块,他们之间的关系如下所示: 图一、各个模块关系图 调用 调用 调用 调用 滑动控制模块 对比度和亮度调节模块 饱和度调节模块 缩放调节模块 旋转调节模块

滑动控制模块处于主函数之中,是整个设计的核心部分,通过createTrackbar创建五个滑动控制按钮并且调用每个模块实现对图像相应的调节。 3.算法设计 (1)滑动控制: 滑动控制是整个设计的核心部分,通过创建滑动控制按钮调节大小来改变相应的数据,进行调用函数实现对图像的编辑,滑动控制是利用createTrackbar(),函数中包括了滑动控制的名称,滑动控制显示在什么窗口上,滑动变量的地址和它调节的最大围,以及每个控制按钮应该调用什么函数实现什么功能; (2)对比度和亮度的调节: 对比度和亮度的调节的原理是依照线性理论,它的公式如下所示:g(x)=a* f(x) +b,其中f(x)表示源图像的像素,g(x)表示输出图像的像素,参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度,参数b通常被称为偏置(bias),常常被用来控制图像的亮度; (3)饱和度的调节: 饱和度调节利用cvCvtColor( src_image, dst_image, CV_BGR2HSV )将RGB 颜色空间转换为HSV颜色空间,其中“H=Hue”表示色调,“S=Saturation”表示饱和度,“V=Value ”表示纯度;所以饱和度的调节只需要调节S的大小,H 和V的值不需要做任何的改变; (4)旋转的调节: 旋转是以某参考点为圆心,将图像的个点(x,y)围绕圆心转动一个逆时针角度θ,变为新的坐标(x1,y1),x1=rcos(α+θ),y1=rsin(α+θ),其中r是图像的极径,α是图像与水平的坐标的角度的大小; (5)缩放的调节: 首先得到源图像的宽度x和高度y,变换后新的图像的宽度和高度分别为x1和y1,x1=x*f,y1=y*f,其中f是缩放因子; 4.函数功能描述 (1)主函数main()用来设置滑动控制按钮,当鼠标拖动按钮可以得到相应的数据大小,实现手动控制的功能,当鼠标拖动对比度和亮度调节是,主函数调用

基于OpenCV的摄像机标定的应用研究

38562009,30(16)计算机工程与设计Computer Engineering and Design 0引言 机器视觉的基本任务之一是从摄像机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体,而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数。在大多数条件下,这些参数必须通过实验与计算才能得到,这个过程称为摄像机标定(或定标)。标定过程就是确定摄像机的几何和光学参数,摄像机相对于世界坐标系的方位。标定精度的大小,直接影响着机器视觉的精度。迄今为止,对于摄像机标定问题已提出了很多方法,摄像机标定的理论问题已得到较好的解决[1-5]。对摄像机标定的研究来说,当前的研究工作应该集中在如何针对具体的实际应用问题,采用特定的简便、实用、快速、准确的标定方法。 OpenCV是Intel公司资助的开源计算机视觉(open source computer vision)库,由一系列C函数和少量C++类构成,可实现图像处理和计算机视觉方面的很多通用算法。OpenCV有以下特点: (1)开放C源码; (2)基于Intel处理器指令集开发的优化代码; (3)统一的结构和功能定义; (4)强大的图像和矩阵运算能力; (5)方便灵活的用户接口; (6)同时支持Windows和Linux平台。 作为一个基本的计算机视觉、图像处理和模式识别的开源项目,OpenCV可以直接应用于很多领域,是二次开发的理想工具。目前,OpenCV的最新版本是2006年发布的OpenCV 1.0版,它加入了对GCC4.X和Visual https://www.360docs.net/doc/6c568247.html,2005的支持。 1摄像机标定原理 1.1世界、摄像机与图像坐标系 摄像机标定中有3个不同层次的坐标系统:世界坐标系、摄像机坐标系和图像坐标系(图像像素坐标系和图像物理坐标系)。 如图1所示,在图像上定义直角坐标系 开发与应用

OpenCV最基础的图像处理的例子

?什么是OpenCV ?开源C/C++计算机视觉库. ?面向实时应用进行优化. ?跨操作系统/硬件/窗口管理器. ?通用图像/视频载入、存储和获取. ?由中、高层API构成. ?为Intel?公司的Integrated Performance Primitives (IPP) 提供了透明接口. ?特性: ?图像数据操作(分配,释放, 复制, 设定, 转换). ?图像与视频I/O (基于文件/摄像头输入, 图像/视频文件输出). ?矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD). ?各种动态数据结构(列表, 队列, 集, 树, 图). ?基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔). ?结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化). ?摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配). ?动作分析(光流, 动作分割, 跟踪). ?对象辨识 (特征方法, 隐马可夫链模型HMM). ?基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条). ?图像标识 (直线, 圆锥, 多边形, 文本绘图) ?OpenCV 模块: ?cv - OpenCV 主要函数. ?cvaux - 辅助(实验性) OpenCV 函数. ?cxcore - 数据结构与线性代数算法. ?highgui - GUI函数. 资料链接 ?参考手册: ?/docs/index.htm ?网络资源: ?官方网页: https://www.360docs.net/doc/6c568247.html,/technology/computing/opencv/?软件下载: https://www.360docs.net/doc/6c568247.html,/projects/opencvlibrary/ ?书籍: ?Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). ?视频处理例程(位于/samples/c/目录中): ?色彩跟踪: camshiftdemo ?点跟踪: lkdemo

相机标定程序

/*环境OpenCV2.3.1+visual studio2010 *calibdata.txt 保持标定图片的路径(根据实际设置) */ #include "stdafx.h" #include "cv.h" #include "highgui.h" #include #include #include using namespace std; int main() { IplImage * show; //RePlay图像指针 cvNamedWindow("RePlay",1); int number_image_copy=7; //复制图像帧数 CvSize board_size=cvSize(5,7); //标定板角点数 CvSize2D32f square_size=cvSize2D32f(10,10); //假设我的每个标定方格长宽都是1.82厘米 float square_length=square_size.width; //方格长度 float square_height=square_size.height; //方格高度 int board_width=board_size.width; //每行角点数 int board_height=board_size.height; //每列角点数 int total_per_image=board_width*board_height; //每张图片角点总数 int count; //存储每帧图像中实际识别的角点数 int found;//识别标定板角点的标志位 int step; //存储步长,step=successes*total_per_image; int successes=0; //存储成功找到标定板上所有角点的图像帧数 int a=1; //临时变量,表示在操作第a帧图像 const int NImages = 7;//图片总数

opencv最基础的图像处理

openCV——几个实用函数 2010年12月20日星期一 09:18 1. cvSmooth:各种方法的图像平滑 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0 ); src 输入图像. dst 输出图像. smoothtype 平滑方法: . CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数cvIntegral 计算积分图像。 . CV_BLUR (simple blur) - 对每个象素param1×param2邻域求和并做尺度变换 1/(param1.param2). . CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 . CV_MEDIAN (median blur) - 对图像进行核大小为 param1×param1 的中值滤波 (i.e. 邻域是方的). . CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 平滑操作的第一个参数. param2 平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果 param2的值为零,则表示其被设定为param1。 param3

对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核, n=param2 对应垂直核. 对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有sigma 计算 (以保证足够精确的操作). 函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。 没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。 简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特和 32-比特浮点图像。这两种方法可以(in-place)方式处理图像。 中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像. 2.IplImage结构 由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。IplImage结构具体定义如下: typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; /* 版本 (=0)*/

标签摄像机标定

标签:摄像机标定 opencv标定程序的代码(完全测试好的) 这个是我在win32 平台下写的程序,测试完全通过: 不过要注意下面的问题: (1)opencv库是1.0的,我在vc6.0的平台使用 (2)软件的设置要正确 (3)图片载入的时候,使用的是批处理文件(其实就是建一个txt文件,里面写的和dos下面的操作代码一样的输入) (4)里面现在还有个问题没有解决:在得到角点坐标的时候,cvFind CornerSubPix里面的搜索区域还不明白 (05)下面是我在网上搜的别人的代:测试通过的: ===================== 下面是我的代码: /*标定的过程: 图片的加载 角点的检测 提取角点精确坐标 参数求解 利用参数对图像进行矫正 */

#include #include"cv.h" #include"highgui.h" #include //函数声明 void PrintMat(CvMat *matrix,BOOL save_or_show,FILE *fp); int main(int argc,char **argv) { int i=1; char k=0; int CurrentImage = 0; int CurrentRow = 0; //行 int CurrentColumn = 0; //列 int findcorner_result=0; FILE *fp; //文件指针 int ChessBoardSize_w =6; //角点个数 int ChessBoardSize_h =7; int width_pixel =1280; //像素 int high_pixel =1024; float SquareSize=10; //棋盘大小 int NImages=16; CvSize ChessBoardSize; CvSize image_pixel; int NPoints=0; int *corner_counter; float *temppoints; //这里可以使用内存动态存储管理。。。 CvPoint2D32f *corners; //存储角点坐标的数组

图像处理经典算法及OpenCV程序

基于opencv的use摄像头视频采集程序 (1) 基于opencv的两个摄像头数据采集 (3) 能激发你用代码做视频的冲动程序 (6) 图像反转(就是把黑的变白,白的变黑) (11) 图像格式的转换 (12) 从摄像头或者A VI文件中得到视频流,对视频流进行边缘检测 (13) 采用Canny算子进行边缘检测 (15) 角点检测 (18) 图像的旋转加缩放(效果很拽,用地球做就像谷歌地球似的) (21) Log-Polar极坐标变换 (22) 对图像进行形态学操作(图像的开闭,腐蚀和膨胀运算) (24) 用不同的核进行图像的二维滤波 (27) 图像域的填充 (30) 寻找轮廓实现视频流的运动目标检测(超推荐一下) (35) 采用金字塔方法进行图像分割 (40) 图像的亮度变换 (43) 单通道图像的直方图 (46) 计算和显示彩色图像的二维色调-饱和度图像 (48) 图像的直方图均匀化 (50) 用Hongh变换检测线段 (52) 利用Hough变换检测圆(是圆不是椭圆) (57) 距离变换 (59) 椭圆曲线拟合 (64) 由点集序列或数组创建凸外形 (68) Delaunay三角形和V oronoi划分的迭代式构造 (71) 利用背景建模检测运动物体(推荐) (78) 运动模板检测(摄像头) (81) 显示如何利用Camshift算法进行彩色目标的跟踪 (86) 基于opencv的use摄像头视频采集程序 准备工作:你得把opencv库装到电脑上,并把各种头文件,源文件,lib库都连到vc上,然后设置一下系统环境变量,这里这方面就不说了,好像我前面的文章有说过,不懂也可百度一下。 建立一个基于WIN32控制台的工程CameraUSB,在新建一个c++元文件,写代码: #include "cxcore.h" #include "cvcam.h" #include "windows.h" #include "highgui.h"

基于OpenCV的摄像机标定

万方数据

K,乙)变换为摄像机坐标系中的坐标值只(疋,K,乙)如下 ㈧…=㈠M㈤(2)将坐标值只(冠,K,zc)在针孔模型中进行规范化投影,得 只=[妻甜引∽(3)引入透镜的畸变,畸变后的规范化坐标值可以用雎如砌 阱Xdc,峨‰叫州黝;篙]㈤ 将Pd(xa,ya)转换为图像上像素坐标系上的坐标值B(“,访 f吲:时‰(4) 够可=f/.劬sx/咖(5)像素之间的有效距离(mm/pixel);dpy为计算机图像在垂直方向 换)方法计算出摄像机的内部参数和外部参数的初值Ⅲ。该步虑透镜畸变的影响,得到的参数值并不准确。不过作为下一 数据拟合目标函数““如式6所示。既要将图像上Ⅳ个角点的坐标值(U,K)(f=1,…朋拾取出来,还要利用上述畸变模型计算出这Ⅳ个标志点的坐标值(‰vJ)(f=1,…朋,然后利用式6进行数 转化为求解非线性最小二乘的问题,通过非线性优化算法“”多次迭代,最后得到使目标函数的值最小的参数值,降低了求解难度。迭代的初值由第①步的DLT方法算出,DLT方法不 2基于OpenCV的摄像机标定 基于OpenCV的摄像机标定采用平面棋盘格标定模板,一198一 为了提高角点提取的成功率,在标定方块的外围,还要求保留一个方块宽的白色空白区域,如图1所示。摄像机只需在不同的角度抓取几张平面标定模板的图片,就可以实现对摄像机的标定。显然,由于采用最小二乘法,抓得图越多,标定的结果就越精确。 图1平面棋盘格标定模板 虽然OpenCV中自动寻找角点函数提取角点的成功率很高,但是若碰到光线被遮挡等情况,使得标定模板上的标定块在图像上不清晰或提取的角点数目与设定的数目不相符的状况,就会导致角点提取失败,如图2所示:因此OpenCV并不保证能够提取所有图像上的角点。所以在设计标定算法时必须要考虑角点不能被提取的情况:一方面,如果角点提取成功的图过少,则标定出来的结果就不一定能满足精度的要求,需要重新采图;另一方面,由于摄像机外部参数的个数与标定图像的个数相关联,所以在最后计算标定结果时,应将提取角点失败的图像舍弃,再根据剩下图像的数目,动态地分配参数在内存中的储存空间,如果没有这么一个筛选的过程,盲目得在内存中分配参数的储存空间,则在提取角点失败的图像上,不能找到与角点在世界坐标系中的坐标值相对应的像素坐标系上的坐标值,在这种情况下强行计算的话,很容易出现程序报错,得不到标定结果的情况。因此,本文提出以下摄像机标定算法: (1)读取一组标定用图像数据; (2)用cvFindChessboardComers()筛选图像;将读入的一组图像数据分别代入cvFindChessboardComers0函数,如果返回值是1,则表示在该幅图像上提取的角点数目和设定的相同,提取角点成功;若为0,则表示角点提取失败,该幅图要抛弃; (3)如果可用的标定图的数目满足设定的最少标定用图的数目,继续步骤(4);否则,则应重新采图,返回步骤(1); (4)根据筛选剩下图像的数目用cvCreateMat0为摄像机的内外部参数、角点在世界坐标系的坐标值以及在图像坐标系中的坐标值分配内存存储空间; (5)将筛选剩下的图像代入cvFindChessboardComers0,得到角点在图像像素坐标系中坐标值;再将图像和得到的图像像素坐标系中坐标值代入FindComerSubPix()函数,进一步精 (a)角点提取失败(b)角点提取成功 图2角点提取图像  万方数据

OPENCV图像处理常用函数

图像处理和图像识别中常用的OpenCV函数 2011-02-21 19:25:42|分类:默认分类|字号订阅 1、cvLoadImage:将图像文件加载至内存; 2、cvNamedWindow:在屏幕上创建一个窗口; 3、cvShowImage:在一个已创建好的窗口中显示图像; 4、cvWaitKey:使程序暂停,等待用户触发一个按键操作; 5、cvReleaseImage:释放图像文件所分配的内存; 6、cvDestroyWindow:销毁显示图像文件的窗口; 7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件; 8、cvQueryFrame:用来将下一帧视频文件载入内存; 9、cvReleaseCapture:释放CvCapture结构开辟的内存空间; 10、cvCreateTrackbar:创建一个滚动条; 11、cvSetCaptureProperty:设置CvCapture对象的各种属性; 12、cvGetCaptureProperty:查询CvCapture对象的各种属性; 13、cvGetSize:当前图像结构的大小; 14、cvSmooth:对图像进行平滑处理; 15、cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一; 16、cvCanny:Canny边缘检测; 17、cvCreateCameraCapture:从摄像设备中读入数据; 18、cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件; 19、cvWriteFrame:逐帧将视频流写入文件; 20、cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间; 21、CV_MAT_ELEM:从矩阵中得到一个元素;

摄像机标定程序中用到的OpenCV函数

摄像机标定程序中用到的OpenCV函数 FindChessboardCorners 寻找棋盘图的内角点位置 int cvFindChessboardCorners( const void*image, CvSize pattern_size, CvPoint2D32f* corners,int* corner_count=NULL, int flags=CV_CALIB_CB_ADAPTIVE_THRESH ); image 输入的棋盘图,必须是8位的灰度或者彩色图像。 pattern_size 棋盘图中每行和每列角点的个数。 corners 检测到的角点 corner_count 输出,角点的个数。如果不是NULL,函数将检测到的角点的个数存储于此变量。 flags 各种操作标志,可以是0或者下面值的组合: CV_CALIB_CB_ADAPTIVE_THRESH - 使用自适应阈值(通过平均图像亮度计算得到)将图像转换为黑白图,而不是一个固定的阈值。 CV_CALIB_CB_NORMALIZE_IMAGE - 在利用固定阈值或者自适应的阈值进行二值化之前,先使用cvNormalizeHist来均衡化图像亮度。 CV_CALIB_CB_FILTER_QUADS - 使用其他的准则(如轮廓面积,周长,方形形状)来去除在轮廓检测阶段检测到的错误方块。 函数cvFindChessboardCorners试图确定输入图像是否是棋盘模式,并确定角点的位置。如果所有角点都被检测到切它们都被以一定顺序排布(一行一行地,每行从左到右),函数返回非零值,否则在函数不能发现所有角点或者记录它们地情况下,函数返回0。例如一个正常地棋盘图右8x8个方块和7x7个内角点,内角点是黑色方块相互联通地位置。这个函数检测到地坐标只是一个大约地值,如果要精确地确定它们的位置,可以使用函数cvFindCornerSubPix。

相关文档
最新文档