有些事现在不做 一辈子都不会做了

1 YEAR AGO

本文中采用的SIFT提取视频中的和待检测图像特征点,并利用特征点之间的映射关系找到视频中待检测物体的位置,绘制出绿色的边界并显示出来。

检测视频
视频地址

图片:待检测的图片(仙剑奇侠传5的游戏盒子)

程序源代码

#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\nonfree\features2d.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\calib3d\calib3d.hpp>using namespace cv;int _sift(Mat &img_object, Mat &img_scene);int main(int argc, char *argv[])
{//读取视频VideoCapture vc;vc.open("C:\\Users\\Arthur\\Desktop\\SRC\\video.mp4");double rate = vc.get(CV_CAP_PROP_FPS);//帧率int delay = 1000 / rate;Mat img = imread("C:\\Users\\Arthur\\Desktop\\SRC\\temp.jpg", CV_LOAD_IMAGE_COLOR);//模版图像VideoWriter vw;vw.open("C:\\Users\\Arthur\\Desktop\\SRC\\sift.avi",(int)vc.get(CV_CAP_PROP_FOURCC), // 也可设为CV_FOURCC_PROMPT,在运行时选取  (double)vc.get(CV_CAP_PROP_FPS), // 视频帧率  cv::Size((int)vc.get(CV_CAP_PROP_FRAME_WIDTH), (int)vc.get(CV_CAP_PROP_FRAME_HEIGHT)), // 视频大小  true); // 是否输出彩色视频  namedWindow("1");if (vc.isOpened()){while (1){Mat frame;//原始图像每5帧图像取1帧进行处理for (int i = 0; i < 5; i++){vc.read(frame);}if (frame.empty()){break;}_sift(img, frame);imshow("1", frame);vw << frame;waitKey(1);}}vc.release();return 0;
}int _sift(Mat &img_object, Mat &img_scene)
{//Mat img_object = imread("1.jpg", CV_LOAD_IMAGE_COLOR);//Mat img_scene = imread("2.jpg", CV_LOAD_IMAGE_COLOR);double t = (double)getTickCount();if (!img_object.data || !img_scene.data){std::cout << "Error reading images!" << std::endl;return -1;}//检测SIFT特征点int minHeassian = 400;SiftFeatureDetector detector(minHeassian);std::vector<KeyPoint> keypoints_object, keypoints_scene;detector.detect(img_object, keypoints_object);detector.detect(img_scene, keypoints_scene);//计算特征向量SiftDescriptorExtractor extractor;Mat descriptors_object, descriptors_scene;extractor.compute(img_object, keypoints_object, descriptors_object);extractor.compute(img_scene, keypoints_scene, descriptors_scene);//利用FLANN匹配算法匹配特征描述向量FlannBasedMatcher matcher;std::vector<DMatch> matches;matcher.match(descriptors_object, descriptors_scene, matches);double max_dist = 0; double min_dist = 100;//快速计算特征点之间的最大和最小距离for (int i = 0; i < descriptors_object.rows; i++){double dist = matches[i].distance;if (dist < min_dist) min_dist = dist;if (dist > max_dist) max_dist = dist;}printf("---Max dist: %f \n", max_dist);printf("---Min dist: %f \n", min_dist);//只画出好的匹配点(匹配特征点之间距离小于3*min_dist)std::vector<DMatch> good_matches;for (int i = 0; i < descriptors_object.rows; i++){if (matches[i].distance < 3 * min_dist)good_matches.push_back(matches[i]);}Mat img_matches;drawMatches(img_object, keypoints_object, img_scene, keypoints_scene,good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);//定位物体/std::vector<Point2f> obj;std::vector<Point2f> scene;for (int i = 0; i < good_matches.size(); i++){//从好的匹配中获取特征点obj.push_back(keypoints_object[good_matches[i].queryIdx].pt);scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);}//找出匹配特征点之间的变换Mat H = findHomography(obj, scene, CV_RANSAC);//得到image_1的角点(需要寻找的物体)std::vector<Point2f> obj_corners(4);obj_corners[0] = cvPoint(0, 0);obj_corners[1] = cvPoint(img_object.cols, 0);obj_corners[2] = cvPoint(img_object.cols, img_object.rows);obj_corners[3] = cvPoint(0, img_object.rows);std::vector<Point2f> scene_corners(4);//匹配四个角点perspectiveTransform(obj_corners, scene_corners, H);//画出匹配的物体两个匹配的图片//line(img_matches, scene_corners[0] + Point2f(img_object.cols, 0), scene_corners[1] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4);//line(img_matches, scene_corners[1] + Point2f(img_object.cols, 0), scene_corners[2] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4);//line(img_matches, scene_corners[2] + Point2f(img_object.cols, 0), scene_corners[3] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4);//line(img_matches, scene_corners[3] + Point2f(img_object.cols, 0), scene_corners[0] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4);//匹配之后画出匹配图形的轮廓line(img_scene, scene_corners[0], scene_corners[1], Scalar(0, 255, 0), 4);line(img_scene, scene_corners[1], scene_corners[2], Scalar(0, 255, 0), 4);line(img_scene, scene_corners[2], scene_corners[3], Scalar(0, 255, 0), 4);line(img_scene, scene_corners[3], scene_corners[0], Scalar(0, 255, 0), 4);//imshow("Good Matches & Object detection", img_matches);//imshow("识别图像", img_scene);t = 1000 * ((double)getTickCount() - t) / getTickFrequency();std::cout << "the time is :" << t << std::endl;//waitKey(0);
}

为了达到实时处理的效果,可以使用SURF替代SIFT,不过处理效果不如SIFT理想。
本文中的程序采用的是Opencv的2.4.8版本,在2.4.5版本以后可以结合VS2013和Image Watch插件,在调试的时候可以实时显示出图像,方便观测结果,再也不需要用各种imshow()来显示结果。
图片:Image Watch直接显示内存中图片信息

SIFT原理解析可以查看SIFT算法详解 这篇博文

基于SIFT的视频跟踪相关推荐

  1. 基于DM8168 EVM的智能视频跟踪系统

    基于DM8168智能视频跟踪系统以TMS320DM8168处理器为核心,各种外设接口组成的智能视频分析跟踪系统.本评估板(DM8168 EVM)硬件模块高度集成了DM8168,以及其它外设如NAND. ...

  2. 基于双麦克风声源定位的视频跟踪

    基于双麦克风声源定位的视频跟踪 声源定位跟踪技术在当今社会有着越来越广泛的应用.在此使用两个高灵敏度麦克风作为传感器,配以音频信号处理芯片,接收音频信号并进行模数转换,使用FPGA器件作为核心控制器, ...

  3. 南京 徐小刚 计算机,基于混合粒子PHD滤波的多目标视频跟踪

    模式识别与人工智能 第26卷第9期2013年9月模式识别与人工智能 PR&AIVol.26Sep.No.92013 基于混合粒子PHD滤波的多目标视频跟踪 林 庆 1,2 徐小刚 12 1 詹 ...

  4. 15 OpenCV4图像处理与视频分析实战(49.基于颜色的对象跟踪-.)

    15 OpenCV4图像处理与视频分析实战(49.基于颜色的对象跟踪-) 一.49.基于颜色的对象跟踪-. 二,代码 来自网易云课堂(贾志刚) 一.49.基于颜色的对象跟踪-. 二,代码 #inclu ...

  5. 基于MATLAB的视频运动目标跟踪与检测定位系统

    一.课题背景 视频运动目标检测与跟踪算法是计算机视觉领域的一个核心课题,也是智能视频监控系统的关键底层技术.它融合了图像处理.人工智能等领域的研究成果,已经广泛应用于安保监控.智能武器.视频会议.视频 ...

  6. 视频跟踪——CMT算法

    *部分内容转载于http://blog.csdn.net/songrotek/article/details/47662617 CMT,全称是Clustering of Static-Adaptive ...

  7. 【转载】视频跟踪的研究

    1.首先,什么是视频跟踪?        基于视频的运动目标跟踪技术作为计算机视觉领域的核心研究课题之一, 主要目的是模仿生理视觉系统的运动感知功能,通过对摄像头捕捉到的图像序列进行分析,计算出运动目 ...

  8. CVPR2021 | 基于transformer的视频实例分割网络VisTR

    原文:End-to-End Video Instance Segmentation with Transformers 翻译:夏初 摘要: 视频实例分割(VIS)是一项需要同时对视频中感兴趣的对象实例 ...

  9. ccot 目标跟踪全称_Siamese:CVPR 2019 接收论文作者为你解读视频跟踪领域 | CVPR 2019...

    雷锋网(公众号:雷锋网) AI 科技评论按,本文作者 Qiang Wang,原载于知乎,雷锋网获得授权转载. 今年的 CVPR 的结果已经完全公布,我参与的两篇文章 SiamMask 和SiamRPN ...

最新文章

  1. 使用plsql developer连接centos7上的oracle数据库
  2. 华为手机如何升级鸿蒙系统_华为杨海松:明年所有华为自研设备升级鸿蒙系统...
  3. wall poj 1113
  4. 让问答更自然 - 基于拷贝和检索机制的自然答案生成系统研究 | 论文访谈间 #02...
  5. 个人认为不错的句子(part3)--衍生品是大型杀伤性武器
  6. JAVA开发需求分析套路_JAVA并发工具常用设计套路示例代码
  7. 小学生手写Python程序解魔方!这是高手,这绝对是高手!
  8. 年薪28万 ~60万+,北理工计算机学院可视媒体计算团队诚招博士后
  9. Oracle无法使用EM解决方案
  10. 多个非空文件整合至一个文件
  11. 求大佬解决0x00881340 处有未经处理的异常(在 ConsoleApplication1.exe 中): 0xC0000005: 写入位置 0x00993B8C 时发生访问冲突。
  12. LCD1602显示中文汉字
  13. 计算机一插u盘就丢失数据,u盘里面的数据会不会消失,教您u盘里面的数据消失怎么办...
  14. JavaScript动画
  15. 【零样本知识蒸馏】(六)NeutIPS 2019:Zero-shot knowledge transfer via adversarial belief matching
  16. 三星typec转接耳机没反应_typec转3.5mm转接线,你买对了吗?
  17. pcntl_fork() has been disabled for security reasons报错
  18. 验证手机号码 (包含166和199)
  19. 2020 - 2021 年 Web 前端最新导航
  20. 【TRIO-Basic从入门到精通教程十六】UDP通讯测试补充

热门文章

  1. 基于51单片机的脉搏体温监测仪
  2. RTSP常用命令解释
  3. android开发三大框架!毕业一年萌新的Android大厂面经,2年以上经验必看
  4. Java static关键字与static{}语句块
  5. 操作系统--中断与系统调用
  6. Vue前端项目-首页-获取角色
  7. Android Audio Debug相关方法
  8. 《人件》描述的是乌托邦!
  9. 安装 magenta 失败:rtmidi
  10. Waves每月文摘:2020年10月