簡體   English   中英

如何正確定義要在triangulatePoints(opencv)中使用的參數?

[英]How to properly define arguments to use in triangulatePoints (opencv)?


我嘗試使用來自opencv的triangulatePoints,但我認為我做錯了事(我讀了有關stackoverflow上triangulatePoints的問題之一,但不是我所理解的一切)。 假設我有一個點坐標-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;

但是應用拋出了一些異常,所以也許我做錯了。

編輯:

好的,在@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);

但是我仍然有一個例外:

... opencv \\ opencv-2.4.0 \\ opencv \\ modules \\ calib3d \\ src \\ triangulate.cpp:75:錯誤:(-209)項目點坐標數必須== 2

我認為正確的方法是像這樣形成兩個二維點的向量

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

然后你可以在這個向量中插入點

Point p;
p.x = x;
p.y = y;
pt1.push_back(p);

最終,這可行:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM