题目:Opencv中利用光流法对物体进行检测
来源:互联网 发布:大数据架构设计 编辑:程序博客网 时间:2024/05/19 10:54
题目:Opencv中利用光流法对物体进行检测
完整代码实现:
#include <opencv2/video/video.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/core/core.hpp>#include <iostream>#include <cstdio>using namespace std;using namespace cv;void tracking(Mat &frame, Mat &output);bool addNewPoints();bool acceptTrackedPoint(int i);string window_name = "optical flow tracking";Mat gray;// 当前图片Mat gray_prev;// 预测图片vector<Point2f> points[2];// point0为特征点的原来位置,point1为特征点的新位置vector<Point2f> initial;// 初始化跟踪点的位置vector<Point2f> features;// 检测的特征int maxCount = 500;// 检测的最大特征数double qLevel = 0.01;// 特征检测的等级double minDist = 10.0;// 两特征点之间的最小距离vector<uchar> status;// 跟踪特征的状态,特征的流发现为1,否则为0vector<float> err;int main(){Mat frame;Mat result;VideoCapture capture("E:\\code\\y.mp4");if (capture.isOpened())// 摄像头读取文件开关{while (true){capture >> frame;if (!frame.empty()){tracking(frame, result);}else{printf(" --(!) No captured frame -- Break!");break;}int c = waitKey(50);if ((char)c == 27){break;}}}return 0;}//-------------------------------------------------------------------------------------------------// function: tracking// brief: 跟踪// parameter: frame输入的视频帧// output 有跟踪结果的视频帧// return: void//-------------------------------------------------------------------------------------------------void tracking(Mat &frame, Mat &output){cvtColor(frame, gray, COLOR_BGR2GRAY);frame.copyTo(output);// 添加特征点if (addNewPoints()){goodFeaturesToTrack(gray, features, maxCount, qLevel, minDist);points[0].insert(points[0].end(), features.begin(), features.end());initial.insert(initial.end(), features.begin(), features.end());}if (gray_prev.empty()){gray.copyTo(gray_prev);}// l-k光流法运动估计calcOpticalFlowPyrLK(gray_prev, gray, points[0], points[1], status, err);// 去掉一些不好的特征点int k = 0;for (size_t i = 0; i<points[1].size(); i++){if (acceptTrackedPoint(i)){initial[k] = initial[i];points[1][k++] = points[1][i];}}points[1].resize(k);initial.resize(k);// 显示特征点和运动轨迹for (size_t i = 0; i<points[1].size(); i++){line(output, initial[i], points[1][i], Scalar(0, 0, 255));circle(output, points[1][i], 3, Scalar(0, 255, 0), -1);}// 把当前跟踪结果作为下一此参考swap(points[1], points[0]);swap(gray_prev, gray);imshow(window_name, output);}//-------------------------------------------------------------------------------------------------// function: addNewPoints// brief: 检测新点是否应该被添加// parameter:// return: 是否被添加标志//-------------------------------------------------------------------------------------------------bool addNewPoints(){return points[0].size() <= 10;}//-------------------------------------------------------------------------------------------------// function: acceptTrackedPoint// brief: 决定哪些跟踪点被接受// parameter:// return://-------------------------------------------------------------------------------------------------bool acceptTrackedPoint(int i){return status[i] && ((abs(points[0][i].x - points[1][i].x) + abs(points[0][i].y - points[1][i].y)) > 2);}运行效果截图:
0 0
- 题目:Opencv中利用光流法对物体进行检测
- 题目:在Opencv中利用HOG进行行人检测
- OpenCV:利用背景建模检测运动物体
- 题目:利用opencv对一副图像进行腐蚀操作
- opencv运用帧差法对运动物体检测
- OpenCV学习之利用背景建模检测运动物体
- OpenCV 使用光流法检测物体运动
- opencv运动物体检测
- 利用opencv进行面部和眼睛检测
- caffe项目实践:实现YOLO对物体进行检测
- Opencv对视频进行目标检测
- 对图像横向和纵向像素均值求一阶导数,进行图像中物体的边缘检测
- opencv之矩形物体检测
- opencv+python检测入侵物体
- opencv(九)--移动物体检测
- opencv中利用图像相减识别物体运动
- opencv中利用图像相减识别物体运动
- Opencv中HOG+SVM进行行人检测
- 可视化深度图像
- 关于getline()函数
- LeetCode 153 Find Minimum in Rotated Sorted Array
- 工厂模式(Factory Pattern)
- PCL滤波介绍(1)
- 题目:Opencv中利用光流法对物体进行检测
- PCL滤波介绍(2)
- 【远程调用框架】如何实现一个简单的RPC框架(四)优化二:改变底层通信框架
- PCL滤波介绍(3)
- 高阶篇:4.3.1)DFMEA框架搭建,填写项目与要求;
- PCL采样一致性算法
- Mysql忘记密码了,咋办,只需3步!
- PCL关键点(1)
- PHP 八种基本的数据类型