C++ 如何正确定义三角点(opencv)中使用的参数?

C++ 如何正确定义三角点(opencv)中使用的参数?,c++,opencv,triangulation,C++,Opencv,Triangulation,我尝试使用opencv中的三角形点,但我认为我做错了什么(我在stackoverflow上阅读了一个关于三角形点的问题,但不是我所理解的全部)。假设我有一个点坐标-pt1和pt2,对应于左右摄像机中一个点的坐标。Pt1和pt2是cv::Point 因此,我: cv::Mat cam0(3, 4, CV_64F, k_data1) //k_data1 is [R|t] 3x4 matrix for left camera cv::Mat cam1(3, 4, CV_64F, k_data2)


我尝试使用opencv中的三角形点,但我认为我做错了什么(我在stackoverflow上阅读了一个关于三角形点的问题,但不是我所理解的全部)。假设我有一个点坐标-pt1和pt2,对应于左右摄像机中一个点的坐标。Pt1和pt2是cv::Point

因此,我:

cv::Mat cam0(3, 4, CV_64F, k_data1)   //k_data1 is [R|t] 3x4 matrix for left camera
cv::Mat cam1(3, 4, CV_64F, k_data2)   //k_data2 is [R|t] 3x4 matrix for right camera
cv::Point pt1;                        //for left camera
cv::Point pt2                         //for right camera
我还定义了

cv::Mat pnt3D(1, 1, CV_64FC4).
我的问题是如何正确定义这两点(cv::Point)
我尝试过这样做:

cv::Mat_<cv::Point> cam0pnts;
cam0pnts.at<cv::Point>(0) = pt1;
cv::Mat_<cv::Point> cam1pnts;
cam1pnts.at<cv::Point>(0) = pt2;
cv::Mat_uu0pnts;
(0)处的cam0pnts=pt1;
cv::Mat_u_1;cam1pnts;
(0)处的凸轮数=pt2;
但应用程序会抛出一些异常,所以可能我做错了什么

编辑: 好的,在@Optimus 1072的帮助下,我更正了一些代码行,得到如下结果:

double pCam0[16], pCam1[16];

cv::Point pt1 = m_history.getPoint(0);
cv::Point pt2 = m_history.getPoint(1);
m_cam1.GetOpenglProjectionMatrix(pCam0, 640, 480);
m_cam2.GetOpenglProjectionMatrix(pCam1, 640, 480);
cv::Mat cam0(3, 4, CV_64F, pCam0); 
cv::Mat cam1(3, 4, CV_64F, pCam1); 

vector<cv::Point2f> pt1Vec;
vector<cv::Point2f> pt2Vec;
pt1Vec.push_back(pt1);
pt2Vec.push_back(pt2);

cv::Mat pnt3D(1,1, CV_64FC4);

cv::triangulatePoints(cam0, cam1, pt1Vec, pt2Vec, pnt3D);
双pCam0[16],pCam1[16];
cv::Point pt1=m_history.getPoint(0);
cv::Point pt2=m_history.getPoint(1);
m_cam1.GetOpenglProjectionMatrix(PCAM0640480);
m_cam2.GetOpenglProjectionMatrix(PCAM1640480);
cv::Mat cam0(3,4,cv_64F,pCam0);
cv::Mat cam1(3,4,cv_64F,pCam1);
载体pt1Vec;
载体pt2Vec;
pt1Vec.推回(pt1);
pt2Vec.推回(pt2);
cv::材料pnt3D(1,1,cv_64FC4);
cv::三角形点(cam0、cam1、pt1Vec、pt2Vec、pnt3D);
但我还是有一个例外:

…opencv\opencv-2.4.0\opencv\modules\calib3d\src\triangulate.cpp:75:错误:(-209)项目点坐标数必须==2


我认为正确的方法是两个像这样的2-D点的向量

vector<Point2f> pt1;
vector<Point2f> pt2; 

我认为正确的方法是两个像这样的2-D点的向量

vector<Point2f> pt1;
vector<Point2f> pt2; 
最后,这是可行的:

cv::Mat pointsMat1(2, 1, CV_64F);
cv::Mat pointsMat2(2, 1, CV_64F);

int size0 = m_history.getHistorySize();

for(int i = 0; i < size0; i++)
{
  cv::Point pt1 = m_history.getOriginalPoint(0, i);
  cv::Point pt2 = m_history.getOriginalPoint(1, i);

  pointsMat1.at<double>(0,0) = pt1.x;
  pointsMat1.at<double>(1,0) = pt1.y;
  pointsMat2.at<double>(0,0) = pt2.x;
  pointsMat2.at<double>(1,0) = pt2.y;

  cv::Mat pnts3D(4, 1, CV_64F);

  cv::triangulatePoints(m_projectionMat1, m_projectionMat2, pointsMat1, pointsMat2, pnts3D);
}
cv::Mat pointsMat1(2,1,cv_64F);
cv::Mat pointsMat2(2,1,cv_64F);
int size0=m_history.getHistorySize();
对于(int i=0;i
最后,这是可行的:

cv::Mat pointsMat1(2, 1, CV_64F);
cv::Mat pointsMat2(2, 1, CV_64F);

int size0 = m_history.getHistorySize();

for(int i = 0; i < size0; i++)
{
  cv::Point pt1 = m_history.getOriginalPoint(0, i);
  cv::Point pt2 = m_history.getOriginalPoint(1, i);

  pointsMat1.at<double>(0,0) = pt1.x;
  pointsMat1.at<double>(1,0) = pt1.y;
  pointsMat2.at<double>(0,0) = pt2.x;
  pointsMat2.at<double>(1,0) = pt2.y;

  cv::Mat pnts3D(4, 1, CV_64F);

  cv::triangulatePoints(m_projectionMat1, m_projectionMat2, pointsMat1, pointsMat2, pnts3D);
}
cv::Mat pointsMat1(2,1,cv_64F);
cv::Mat pointsMat2(2,1,cv_64F);
int size0=m_history.getHistorySize();
对于(int i=0;i
我仍然得到一个例外:…opencv\opencv-2.4.0\opencv\modules\calib3d\src\triangulate.cpp:75:error:(-209)项目点坐标数必须为==2可能该错误取决于其他因素。我将很快用我的方法编写所有代码,也许有人可以帮助我的直觉说问题出在行
cv::Point pt1=m_history.getPoint(0)。但我不确定是否请发布整个代码。另一种方法是使用由N个元素组成的2通道矩阵,类似于
Mat c_pts1(1,N,CV_64FC2)ans不应该是pnt3D,应该是这样的
cv::Mat pnt3D(1,**N**,cv_64FC4)当然问题不在“cv::Point pt1=m_history.getPoint(0);”行中因为只有当行'cv::triangulatePoints(cam0,cam1,pt1Vec,pt2Vec,pnt3D);'未注释。如果“N”可以等于1?我仍然得到一个异常:…opencv\opencv-2.4.0\opencv\modules\calib3d\src\triangulate.cpp:75:error:(-209)项目点坐标数必须==2,可能该错误取决于其他因素。我将很快用我的方法编写所有代码,也许有人可以帮助我的直觉说问题出在行
cv::Point pt1=m_history.getPoint(0)。但我不确定是否请发布整个代码。另一种方法是使用由N个元素组成的2通道矩阵,类似于
Mat c_pts1(1,N,CV_64FC2)ans不应该是pnt3D,应该是这样的
cv::Mat pnt3D(1,**N**,cv_64FC4)当然问题不在“cv::Point pt1=m_history.getPoint(0);”行中因为只有当行'cv::triangulatePoints(cam0,cam1,pt1Vec,pt2Vec,pnt3D);'未注释。如果“N”可以等于1?