物体尺寸检测项目

您所在的位置:网站首页 量三围的叫什么尺 物体尺寸检测项目

物体尺寸检测项目

2023-08-10 06:35| 来源: 网络整理| 查看: 265

相机标定的三个坐标系变化看得比较吃力(线性代数都还回去了)。

历时3个礼拜,断断续续今天终于算是成功跑出程序,做个小结。

一、坐标系的理解

还是有必要理解一下这个坐标系的关系;一共四个:分别是世界坐标系、像素坐标系、图像物理坐标系、相机坐标系;

首先要清楚三个坐标系分别是什么:看下图:

uv是像素坐标系,xy是图像物理坐标系:二者的关系有两个:xy的原点记为(U0、V0);像素大小转换关系:后面的表达式

xwywzw是世界坐标系,xcyc是相机坐标系(可以认为就是相机的透镜,反映了相机相对于世界坐标系的位置和角度)

ok! 为什么要知道这些坐标系呢?因为给一张图片,我们可以知道一张图片上的标记点在世界坐标系和像素坐标系下的坐标!然后他们两个本身存在一个矩阵转换关系,可以求得矩阵,这个矩阵就是相机的内参,进而可以进行畸变矫正。

这样我们用来测量长度的照片测出来的尺寸才会比较准确!

那这个矩阵长什么样子?(治好了多年的颈椎病)

 二、标定开始

1、先打印一张棋盘

2、各种角度拍7张照片

3、量好小方块的实际尺寸mm--然后量整个棋盘的大小

代码如下:我什么时候可以完整写出这么牛逼的代码;

#include #include #include #include using namespace cv; using namespace std; int main(int argc, char* argv[]){ int cube_length = 13;//实际小方块大小 int cam_Dx =182; //整个棋盘横轴方向长度 int cam_Dy = 182; //整个棋盘纵轴方向长度 int number_image = 7;//照片数量 int a = 1; int number_image_copy = 7; CvSize board_size = cvSize(13, 13); int board_width = board_size.width; int board_height = board_size.height; int total_per_image = board_width*board_height; //定义点类 CvPoint2D32f * image_points_buf = new CvPoint2D32f[total_per_image]; //定义空矩阵 CvMat * image_points = cvCreateMat(number_image*total_per_image, 2, CV_32FC1);//像素坐标系 CvMat * object_points = cvCreateMat(number_image*total_per_image, 3, CV_32FC1);//世界坐标系 CvMat * point_counts = cvCreateMat(number_image, 1, CV_32SC1); //角点存放位置 CvMat * intrinsic_matrix = cvCreateMat(3, 3, CV_32FC1); //内参数矩阵 CvMat * distortion_coeffs = cvCreateMat(4, 1, CV_32FC1); //畸变系数向量 char picName[7][10] = { "1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg" }; IplImage * show; int count; int found; int step; int successes = 0; while (a


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3