读取文件夹下所有图片,并使用cv::calcOpticalFlowPyrLK函数,并可视化对应点轨迹使用彩色图像
时间: 2024-03-27 21:38:30 浏览: 112
Python 读取指定文件夹下的所有图像方法
5星 · 资源好评率100%
好的,让我解释一下您的问题。
您想要一个程序来读取一个文件夹下的所有图片,并使用cv::calcOpticalFlowPyrLK函数来计算光流,并在彩色图像上可视化对应点的轨迹。是这样吗?
如果是的话,我可以为您提供以下示例代码:
```cpp
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 读取文件夹下所有图片
vector<String> filenames;
String folder = "your_folder_path/*.jpg"; // 修改为您的图片文件夹路径和格式
glob(folder, filenames);
// 初始化轨迹点
vector<Point2f> prev_pts, curr_pts;
Mat prev_frame, curr_frame;
// 循环处理每张图片
for (size_t i = 0; i < filenames.size(); i++)
{
// 读取当前帧
curr_frame = imread(filenames[i]);
// 如果是第一张图片,先初始化轨迹点
if (i == 0)
{
// 选择初始轨迹点
vector<KeyPoint> keypoints;
Ptr<FeatureDetector> detector = FastFeatureDetector::create();
detector->detect(curr_frame, keypoints);
for (auto kp : keypoints)
{
prev_pts.push_back(kp.pt);
}
}
// 如果不是第一张图片,计算光流
if (i > 0)
{
// 计算当前轨迹点
vector<uchar> status;
vector<float> err;
calcOpticalFlowPyrLK(prev_frame, curr_frame, prev_pts, curr_pts, status, err);
// 可视化轨迹点
for (size_t j = 0; j < prev_pts.size(); j++)
{
if (status[j] == 1)
{
line(curr_frame, prev_pts[j], curr_pts[j], Scalar(0, 255, 0), 2);
circle(curr_frame, curr_pts[j], 3, Scalar(0, 0, 255), -1);
}
}
// 更新轨迹点
prev_pts = curr_pts;
}
// 显示结果
imshow("result", curr_frame);
waitKey(1);
// 更新上一帧
curr_frame.copyTo(prev_frame);
}
return 0;
}
```
这个程序使用了OpenCV库中的cv::calcOpticalFlowPyrLK函数来计算光流,并使用cv::line和cv::circle函数在彩色图像上可视化对应点的轨迹。
请注意,这只是一个简单的示例程序,您可能需要根据您的具体需求进行修改。同时,您需要确保您的计算机已经安装了OpenCV库。
希望这能帮到您!
阅读全文