我正在编写一个使用迭代Lucas-Kanade方法计算光流的代码:calcOpticalFlowPyrLK()
。
我有一个可以容纳两个元素的数组向量,请参见下面的示例:
vector <Point2f> points[2];
x和y坐标存储在数组中,数组存储在向量中。输出数组时,例如cout << points[0]
,坐标当前显示在屏幕上,如下所示:
Output example: [261.837, 65.093]
现在我想提取x和y坐标,将它们分开并将它们存储在不同的变量中。已经尝试了几种使用迭代器的方法而没有结果。如果有人可以帮助我,我将不胜感激,谢谢。
答案 0 :(得分:1)
以下示例将PLK应用于常规网格,并显示如何读取x和y坐标。这些点使用向量类存储在Point2f类中,以将它们存储在数组中。该类具有您可以直接使用的公共x和y成员。这个例子不使用迭代器。
std::vector<cv::Point2f> prevPoints, currPoints;
std::vector<float> error; // stores the SSD error.
std::vector<uchar> status;// stores a flag of successful tracking / I recomend to ignore it.
cv::Mat prevGrayImg,currGrayImg;
// <- insert code for read the images
// initalize grid or the features you want to track
for( int r = 0; r < prevGrayImg.rows;r+=5){
for( int c = 0; c < prevGrayImg.cols;c+=5){
prevPoints.push_back(cv::Point2f(c,r));
}}
// apply pyramidal lucas kanade
cv::calcOpticalFlowPyrLK(prevGrayImg, currGrayImg, prevPoints, currPoints, status, error);
for( unsigned int i = 0; i < prevPoints.size(); i++){
float x0 = prevPoints[i].x;
float y0 = prevPoints[i].y;
float x1 = currPoints[i].x;
float y1 = currPoints[i].y;
}
使用迭代器,它将是:
for( auto i = prevPoints.begin(); i != prevPoints.end(); ++i){
float x0 = i->x; ... a.s.o