我一直在寻找两个帧的每个像素b / n的速度矢量。我使用opencv函数作为流程:
calcOpticalFlowFarneback(Previous_Gray, Current_Gray, Optical_Flow, 0.5, 3, 15, 3, 5, 1.2, 0);
Previous_Gray = previous frame
Current_Gray = current frame
它给了我第三个参数Optical_Flow中的数组,但是我无法确定如何使用这个数组提取速度矢量。
先谢谢。
达维特
答案 0 :(得分:2)
垫&安培;流: 计算出的流图像;将与prevImg具有相同的大小 并键入CV_32FC2
此类型表示每个像素的运动有2个浮点变量(假定为x和y)。 试试这个:
Optical_Flow.at<cv::Point2f>(1023,767).x
Optical_Flow.at<cv::Point2f>(1023,767).y
答案 1 :(得分:1)
void drawOptFlowMap (const Mat& flow, Mat& cflowmap, int step, double scale, const Scalar& color) {
for(int y = 0; y < cflowmap.rows; y += step)
for(int x = 0; x < cflowmap.cols; x += step)
{
const Point2f& fxy = flow.at<Point2f>(y, x);
line(cflowmap, Point(x,y), Point(cvRound(x+fxy.x), cvRound(y+fxy.y)),
color);
circle(cflowmap, Point(cvRound(x+fxy.x), cvRound(y+fxy.y)), 1, color, -1);
}
}
int main()
{
...read, declare images etc....
cvNamedWindow("optical Flow", CV_WINDOW_NORMAL);
calcOpticalFlowFarneback(Previous_Gray, Current_Gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0);
cvtColor(Previous_Gray, cflow, CV_GRAY2BGR);
drawOptFlowMap(flow, cflow, 32, 50, CV_RGB(0, 255, 0));
imshow("optical Flow", cflow);
etc etc
}
答案 2 :(得分:0)
要提取计算出的光流向量,您可以使用以下函数:
static void writeOpticalFlowVectors(const Mat& flow){
std::ofstream myfile;
std::string fullPath = "opticalFlowVectors.txt";
myfile.open (fullPath.c_str());
for(std::size_t x = 0; x < flow.rows; ++x){
for(std::size_t y = 0; y < flow.cols; ++y){
myfile << flow.at<cv::Point2f>(x,y).x;
myfile<< ", ";
myfile<< flow.at<cv::Point2f>(x,y).y;
myfile << "\n";
}
}
myfile.close();
}
这将迭代输出Mat并将x, y
形式的每个向量写入txt
文件。