給定:
從點云構建的矩陣 (N, 3),即vector<Point3d>
std::vector<cv::Point3d> pcVector = ... // from somewhere
cv::Mat pcMat = cv::Mat(pcVector).reshape(1);
因此pcMat必須是這樣的:
[ 0.1, 1.3, 4.5 ]
[ 3.1, 1.4, 7.6 ]
...
[ 1.1, 3.4, 4.1 ]
目標:
一種將一列添加到矩陣中的有效方法。也就是從上面接收一個像下面這樣的矩陣。
[ 0.1, 1.3, 4.5, 1.0 ]
[ 3.1, 1.4, 7.6, 1.0 ]
...
[ 1.1, 3.4, 4.1, 1.0 ]
目前:
cv::Mat result(N, 4);
cv::Mat ones = cv::Mat_<double>::ones(N, 1);
cv::hconcat(pcMat, ones, result);
問題:
這似乎是低效的,因為需要創建一個充滿 1 的臨時矩陣。有什么技巧可以更快地完成這項作業嗎?
uj5u.com熱心網友回復:
利用cv::convertPointsToHomogeneous
該函式通過將 1 附加到點坐標的元組,將點從歐幾里得空間轉換為齊次空間。即每個點 (x1, x2, ..., xn) 轉換為 (x1, x2, ..., xn, 1)。
// given
std::vector<cv::Point3d> pcVector = ... // from somewhere
cv::Mat pcMat = cv::Mat(pcVector).reshape(1);
// I did not run this
cv::Mat dst;
cv::convertPointsToHomogeneous(pcMat, dst); // pcVector oughta work too
與往常一樣,這些東西將接受 Nx1 K-channel Mats 和 NxK 1-channel Mats。結果似乎總是 Nx1 (K 1) 通道。
而且......你可以想象convertPointsFromHomogeneous會做什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/495961.html
上一篇:OpenCVMat::convertTo(type)不轉換型別
下一篇:AttributeError:部分初始化的模塊“cv2”沒有屬性“gapi_wip_gst_GStreamerPipeline”(很可能是由于回圈匯入)
