我有一个ptz相机观察具有初始平移和倾斜值的场景,因此捕获的图像(例如1920x1080)将具有与这些初始值相关的中心(960,540)。现在,在我更改摇摄/倾斜值(移动摄像机)后,我想计算新图像中心相对于初始图像的x,y坐标(即,如果我平移2度(向右),则新图像中心是(960 + x_offset,540 + y_offset)。由于摇摄轴相对于倾斜轴,因此发生y_offset。 我试图通过形成平移/倾斜值的旋转矩阵来计算视图的真实平移/倾斜角度(Z旋转和Y旋转),然后使用提到的矩阵到转换公式从旋转矩阵中提取角度。代码如下。然后我使用FOV_X和FOV_Y来计算像素每角度比。然后我根据新的角度计算deltaX和deltaY。
但是,我仍然没有得到正确的偏移量。我知道这是错误的,因为我还实现了位于初始图像的(x,y)坐标处的物体检测器,它必须在移动相机后使相同的偏移匹配,使物体位于图像的中心。
这是我正在使用的代码
double phi = 0;
double theta = (Params.Tilt - cameraCls->InitialTilt );
double psi = (Params.Pan - cameraCls->InitialPan);
Mat rotX = getRotationMatrix(theta*CV_PI / 180, 'X');
Mat rotY = getRotationMatrix(psi*CV_PI / 180, 'Z');
Mat rotZ = getRotationMatrix(phi*CV_PI / 180, 'X');
Mat rotationM = rotX * rotY * rotZ;
double t1 = atan2(-rotationM.at<double>(2, 0), rotationM.at<double>(0, 0));
double t2 = asin(rotationM.at<double>(1, 0));
double z_ang = atan2(-rotationM.at<double>(1, 2), rotationM.at<double>(1, 1));
// pixelHorAngle = ImgSize.width / FovX;
// pixelVertAngle = ImgSize.height / FovY;
double deltaX = cameraCls->pixelHorAngle *((t2 * 180 / CV_PI) );
double deltaY = cameraCls->pixelVertAngle *((z_ang * 180 / CV_PI) );
这是getRotationMatrix函数
Mat getRotationMatrix(double angle, char axis){
double vRot[3][3] = { 1,0,0,0,1,0,0,0,1 };
Mat rot = Mat::eye(3, 3, CV_64FC1);
switch (axis)
{
case 'X':
rot.at<double>(1, 1) = cos(angle);
rot.at<double>(1, 2) = -sin(angle);
rot.at<double>(2, 1) = sin(angle);
rot.at<double>(2, 2) = cos(angle);
break;
case 'Y':
rot.at<double>(0, 0) = cos(angle);
rot.at<double>(0, 2) = sin(angle);
rot.at<double>(2, 0) = -sin(angle);
rot.at<double>(2, 2) = cos(angle);
break;
case 'Z':
rot.at<double>(0, 0) = cos(angle);
rot.at<double>(0, 1) = -sin(angle);
rot.at<double>(1, 0) = sin(angle);
rot.at<double>(1, 1) = cos(angle);
break;
}
return rot;
}
答案 0 :(得分:0)
我不得不说,在对该相机应用校准过程后,可以通过读取相机参数来检测真实中心。可能这就是你错误的原因。