共有四种坐标系
; 世界坐标系——>相机坐标系
[Xc,Yc,Zc]T表示相机坐标,[Xw,Yw,Zw,1]T表示归物体所在的世界坐标。R表示旋转矩阵,T表示平移矩阵。
相机坐标系——>图像坐标系
; 图像坐标系——>像素坐标系
通过相机标定,我们可以获取相机的内参数和外参数矩阵
内参数矩阵:
https://www.cnblogs.com/wangguchangqing/p/8126333.html
其中Fx=f _dx,Fy=f_dy,u0=cx,v0=cy。
综合上述,则总公式如下:
; 转换代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
using namespace ml;
double R[] =
{
-0.000946327557628447 , -0.999910170350762, -0.0133699548714382,
0.00924509852185524 , 0.0133606413543068, -0.999868001996225,
0.999956815376281 , -0.00106980919429913, 0.00923162449479668
};
double T[] =
{
0.106387638682809, - 0.0655453193303612, - 0.0423556338963880
};
int main()
{
double Xw = 1.16;
double Yw = 1.18;
double Zw = 0.253;
double Xw1 = 1.52;
double Yw1 = 0.274;
double Zw1 = -0.433;
double Xw2 = 1.51;
double Yw2 = 0.274;
double Zw2 = -0.346;
double Xw3 = 5.12;
double Yw3 = 1.94;
double Zw3 = 1.26;
double Xw4 = 5.62;
double Yw4 = 1.3;
double Zw4 = 1.32;
double Xc = 0;
double Yc = 0;
double Zc = 0;
double Xc1 = 0;
double Yc1 = 0;
double Zc1 = 0;
double Xc2 = 0;
double Yc2 = 0;
double Zc2 = 0;
double Xc3 = 0;
double Yc3 = 0;
double Zc3 = 0;
double Xc4 = 0;
double Yc4 = 0;
double Zc4 = 0;
double Fx = 901.542952546068;
double Fy = 899.822262198022 ;
double Cx = 1014.57219246244;
double Cy = 431.675147682217;
double u = 0;
double v = 0;
double u1 = 0;
double v1 = 0;
double u2 = 0;
double v2 = 0;
printf("R[0]=%f R[1]=%f R[2]=%f \n R[3]=%f R[4]=%f R[5]=%f \n R[6]=%f R[7]=%f R[8]=%f\n",
R[0], R[1], R[2],R[3],R[4],R[5], R[6], R[7], R[8]);
Xc = Xw*R[0] + Yw*R[1] + Zw*R[2] + T[0];
Yc = Xw*R[3] + Yw*R[4] + Zw*R[5] + T[1];
Zc = Xw*R[6] + Yw*R[7] + Zw*R[8] + T[2];
Xc1 = Xw1*R[0] + Yw1*R[1] + Zw1*R[2] + T[0];
Yc1 = Xw1*R[3] + Yw1*R[4] + Zw1*R[5] + T[1];
Zc1 = Xw1*R[6] + Yw1*R[7] + Zw1*R[8] + T[2];
Xc2 = Xw2*R[0] + Yw2*R[1] + Zw2*R[2] + T[0];
Yc2= Xw2*R[3] + Yw2*R[4] + Zw2*R[5] + T[1];
Zc2 = Xw2*R[6] + Yw2*R[7] + Zw2*R[8] + T[2];
Xc3 = Xw3*R[0] + Yw3*R[1] + Zw3*R[2] + T[0];
Yc3 = Xw3*R[3] + Yw3*R[4] + Zw3*R[5] + T[1];
Zc3 = Xw3*R[6] + Yw3*R[7] + Zw3*R[8] + T[2];
Xc4 = Xw4*R[0] + Yw4*R[1] + Zw4*R[2] + T[0];
Yc4 = Xw4*R[3] + Yw4*R[4] + Zw4*R[5] + T[1];
Zc4 = Xw4*R[6] + Yw4*R[7] + Zw4*R[8] + T[2];
u = Fx*Xc / Zc + Cx;
v= Fy*Yc / Zc + Cy;
printf("u=%f\n", u);
printf("v=%f\n", v);
u1 = Fx*Xc1 / Zc1 + Cx;
v1 = Fy*Yc1 / Zc1 + Cy;
printf("u1=%f\n", u1);
printf("v1=%f\n", v1);
u2 = Fx*Xc2 / Zc2 + Cx;
v2 = Fy*Yc2 / Zc2 + Cy;
printf("u2=%f\n", u2);
printf("v2=%f\n", v2);
double u3 = Fx*Xc3 / Zc3 + Cx;
double v3 = Fy*Yc3 / Zc3 + Cy;
printf("u2=%f\n", u2);
printf("v2=%f\n", v2);
double u4 = Fx*Xc4 / Zc4 + Cx;
double v4 = Fy*Yc4 / Zc4 + Cy;
printf("u4=%f\n", u4);
printf("v4=%f\n", v4);
Mat srcImage0 = imread("2.png");
resize(srcImage0, srcImage0, Size(1920,1080), 0, 0, INTER_LINEAR);
if (srcImage0.empty())
{
printf("[ALG ERROR][函数:%s][行号:%d],图片未正常读取,请检查输入路径十分正确 \n", __FUNCTION__, __LINE__, 1);
}
circle(srcImage0, Point(u3, v3), 10, Scalar(0, 0, 255), -1);
circle(srcImage0, Point(u4, v4), 10, Scalar(0, 0, 255), -1);
namedWindow("srcImage0", 0);
imshow("srcImage0", srcImage0);
waitKey(200);
return 0;
}
相关转换代码
https://blog.csdn.net/guyuealian/article/details/104184551
参考:
https://blog.csdn.net/weizhangyjs/article/details/81020177
https://blog.csdn.net/baidu_38172402/article/details/81949447
https://www.cnblogs.com/wangguchangqing/p/8126333.html
https://blog.csdn.net/yangdashi888/article/details/51356385
Original: https://blog.csdn.net/mao_hui_fei/article/details/119761072
Author: 翟羽嚄
Title: 图像处理中常用的坐标系转换
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/646091/
转载文章受原作者版权保护。转载请注明原作者出处!