读取文件夹下所有图片,并使用cv::calcOpticalFlowPyrLK函数,并可视化对应点轨迹使用彩色图像,计算相邻两张的光流
时间: 2024-03-27 13:38:52 浏览: 44
好的,我会尽力回答您的问题。首先,您需要使用OpenCV库中的函数来读取文件夹下的所有图片,并使用calcOpticalFlowPyrLK函数计算相邻两张图片的光流。以下是一个示例代码,您可以参考一下:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// 读取文件夹下所有图片
String folder = "your_folder_path";
vector<String> filenames;
glob(folder, filenames);
// 创建随机颜色
RNG rng(12345);
Scalar color;
// 读取第一张图片并进行光流计算
Mat prev_img, prev_gray;
prev_img = imread(filenames[0]);
cvtColor(prev_img, prev_gray, COLOR_BGR2GRAY);
vector<Point2f> prev_points;
goodFeaturesToTrack(prev_gray, prev_points, 500, 0.01, 10);
// 遍历文件夹下的所有图片并计算光流
for (size_t i = 1; i < filenames.size(); i++)
{
// 读取当前图片
Mat curr_img, curr_gray;
curr_img = imread(filenames[i]);
cvtColor(curr_img, curr_gray, COLOR_BGR2GRAY);
// 使用calcOpticalFlowPyrLK函数计算光流
vector<Point2f> curr_points;
vector<uchar> status;
vector<float> err;
calcOpticalFlowPyrLK(prev_gray, curr_gray, prev_points, curr_points, status, err);
// 可视化对应点轨迹
for (size_t j = 0; j < prev_points.size(); j++)
{
if (status[j])
{
color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
line(curr_img, prev_points[j], curr_points[j], color, 2);
circle(curr_img, curr_points[j], 5, color, -1);
}
}
// 显示当前图片并等待
imshow("Optical Flow", curr_img);
waitKey(0);
// 更新变量
prev_gray = curr_gray.clone();
prev_points = curr_points;
}
return 0;
}
```
请注意,此示例代码中使用的是goodFeaturesToTrack函数来寻找第一张图片中的关键点。您可以根据需要使用其他特征检测算法,例如FAST,ORB等。
另外,您需要将“your_folder_path”替换为实际的文件夹路径。
阅读全文