查找对象的3D坐标

时间:2015-06-10 12:36:48

标签: opencv image-processing 3d camera-calibration

我试图找到我知道他在图像中的坐标的三维坐标(在世界中)。所以在网上进行一些研究之后,我成功地找到了X和Y坐标。但是我找不到Z

这是我在openCV中的程序

  void drawAndCalcul3D(int x,int y,Mat& frame)
{
cv::Mat uvPoint = cv::Mat::ones(3,1,cv::DataType<double>::type);
uvPoint.at<double>(0,0) = x; //got this point using mouse callback
uvPoint.at<double>(1,0) = y;

std::vector<cv::Point2f> imagePoints;
std::vector<cv::Point3f> objectPoints;
cv::Mat rotationMatrix(3,3,cv::DataType<double>::type);
Mat cameraMatrix(3,3,DataType<double>::type);
  setIdentity(cameraMatrix);  
  cameraMatrix.at<double>(0,0)=493.415; //my Camera matrix
  cameraMatrix.at<double>(0,1)=0;
  cameraMatrix.at<double>(0,2)=319.5;

  cameraMatrix.at<double>(1,0)=0;
  cameraMatrix.at<double>(1,1)=493.415;
  cameraMatrix.at<double>(1,2)=179.5;

  cameraMatrix.at<double>(2,0)=0;
  cameraMatrix.at<double>(2,1)=0;
  cameraMatrix.at<double>(2,2)=1;
// extrinsic parameters rvec and tvect : rotation and translation matrix
Mat rvec(3,1,cv::DataType<double>::type);
    rvec.at<double>(0)=-0.1408;
    rvec.at<double>(1)=3.011;
    rvec.at<double>(2)=-0.171147;
//
cv::Mat tvec(3,1,cv::DataType<double>::type);
    tvec.at<double>(0)=15.84;
    tvec.at<double>(1)=-64.67;
    tvec.at<double>(2)=274.584;

cv::Rodrigues(rvec,rotationMatrix);
//
cv::Mat tempMat, tempMat2;
double s;
tempMat = rotationMatrix.inv() * cameraMatrix.inv() * uvPoint;
tempMat2 = rotationMatrix.inv() * tvec;
s =tempMat2.at<double>(2,0); //12 represents the height Zconst
s /= tempMat.at<double>(2,0);
Mat exp=rotationMatrix.inv() * (s * cameraMatrix.inv() * uvPoint - tvec);
cv::putText(frame,intToString(exp.at<double>(0))+ " , " + intToString(exp.at<double>(1))+ " , " + intToString(exp.at<double>(2)),cv::Point(x,y+20),2,1,Scalar(0,255,0));
}

任何人都知道如何找到物体的深度(Z)?

我使用相同的程序Computing x,y coordinate (3D) from image point我不知道如何更改它以找到Z,当它不恒定时

1 个答案:

答案 0 :(得分:1)

x,y图像点仅确定来自摄像机中心的光线通过图像点。它具有无限数量的可能z,当您将图像点与逆矩阵相乘时,您将得到光线或线的方程。使用单个相机从单个图像点获取3D是不可能的。当然,除非您做出一些强有力的假设,例如物体形状或大小,或使用额外的知识,如单眼线索。此类提示的示例包括模糊/焦点,亮度/阴影,纹理大小,附近其他对象的熟悉大小等。

另一个例子 - 如果您知道物体所在平面的方程式,则可以将此平面与光线相交并到达唯一的3D点。还有一个例子,比如说,你在手机中使用加速度计,它可以为你提供相机相对于重力矢量的角度。您还知道手持手机的大概高度(离地面1.5米)。您可以轻松地计算地面上的3D点作为您的光线与已知平面的交点,请参见下文。该公式给出了图像中心点的Z.对于其他点,您必须添加由偏心像素形成的额外角度。这将允许您完全恢复地平面的3D。

enter image description here