当前位置:文档之家› 基于opencv的手掌检测与移动的跟踪等源代码

基于opencv的手掌检测与移动的跟踪等源代码

基于opencv的手掌检测与移动的跟踪等源代码
基于opencv的手掌检测与移动的跟踪等源代码

1.#include

2.

3.#include

4.#include

5.#include

6.

7.#include

8.#include

9.#include

10.#include

https://www.doczj.com/doc/3414832142.html,ing namespace std;

12.

13.#pragma comment(lib,"cv210.lib")

14.#pragma comment(lib,"cxcore210.lib")

15.#pragma comment(lib,"highgui210.lib")

16.

17.void ErrorHandler(char* message)

18.{

19. cout<

20. exit(0);

21.}

22.#undef UNICODE

23.

24.void fingerTip(char* imgname);

25.

26.int main()

27.{

28. WIN32_FIND_DATA FileData;

29. HANDLE hSearch;

30. BOOL fFinished = FALSE;

31.

32. if(!SetCurrentDirectory("images")){

33. cout<<"failed to change work directory"<

34. exit(0);

35. }

36.

37. hSearch = FindFirstFile("*.bmp", &FileData);

38. if (hSearch == INVALID_HANDLE_VALUE){

39. ErrorHandler("No .bmp files found.");

40. }

41. while (!fFinished){

42. fingerTip(FileData.cFileName);

43. if (!FindNextFile(hSearch, &FileData)){

44. if (GetLastError() ==

ERROR_NO_MORE_FILES){

45. fFinished = TRUE;

46. } else {

47. ErrorHandler("Couldn't find next file.");

48. }

49. }

50. cvWaitKey(0);

51. }

52.

53. // Close the search handle.

54. if (!FindClose(hSearch)){

55. ErrorHandler("Couldn't close search handle.");

56. }

57.

58. return 0;

59.}

60.

61.void fingerTip(char* imgname)

62.{

63. IplImage* pImgColor=NULL;

64. IplImage* pImgGray=NULL;

65. IplImage* pImgContourAll=NULL;

66. IplImage* pImgContourAppr=NULL;

67. IplImage* pImgHull=NULL;

68. IplImage* pImgDefects=NULL;

69. pImgColor=cvLoadImage(imgname,CV_LOAD_IMAGE_COLOR);

70. if (!pImgColor){

71. cout<<"failed to load image"<

72. exit(0);

73. }

74.

75. pImgGray=cvCreateImage(cvGetSize(pImgColor),8,1);

76. cvCvtColor(pImgColor,pImgGray,CV_RGB2GRAY);

77. pImgContourAppr=cvCreateImage(cvGetSize(pImgGray),8,3);

78. pImgContourAll=cvCreateImage(cvGetSize(pImgGray),8,3);

79. pImgHull=cvCreateImage(cvGetSize(pImgGray),8,3);

80. pImgDefects=cvCreateImage(cvGetSize(pImgGray),8,3);

81. cvZero(pImgContourAppr);

82. cvZero(pImgContourAll);

83. cvZero(pImgHull);

84. cvZero(pImgDefects);

85.

86. //canny

87. CvMemStorage* storage=cvCreateMemStorage();

88. CvSeq* contourSeqAll=cvCreateSeq(0,sizeof(CvSeq),sizeof(CvPoint),storage);

89. cvCanny(pImgGray,pImgGray,10,30,5);

90. cvFindContours(pImgGray,storage,&contourSeqAll,sizeof(CvContour),CV_RETR_LIST,CV_LIN

K_RUNS);

91. //original contours

92. CvSeq* tseq=contourSeqAll;

93. for (;contourSeqAll;contourSeqAll=contourSeqAll->h_next){

94. cvDrawContours(pImgContourAll,contourSeqAll,cvScalar(255,0,0),cvScalar(0,0,25

5),0,2);

95. }

96. contourSeqAll=tseq;

97.

98. CvMemStorage* storageAppr=cvCreateMemStorage();

99. CvSeq* contourAppr=cvCreateSeq(0,sizeof(CvSeq),sizeof(CvPoint),storageAppr);

100. contourAppr=cvApproxPoly(contourSeqAll,sizeof(CvContour),storageAppr,CV_POLY_APPROX_ DP,5,1);

101. //approximated contours

102. tseq=contourAppr;

103. for (;contourAppr;contourAppr=contourAppr->h_next){

104. cvDrawContours(pImgContourAppr,contourAppr,cvScalar(255,0,0),cvScalar(0,0,255 ),0,2);

105. }

106. contourAppr=tseq;

107.

108. //print contours

109. /*cout<<"contours:"<

110. for (int i=0;itotal;i++){

111. CvPoint* p=(CvPoint*)CV_GET_SEQ_ELEM(CvPoint,contourAppr,i);

112. cout<x<<","<y<

113. cvCircle(pImgHull,*p,3,cvScalar(0,255,255));

114. cvShowImage("hull",pImgHull);

115. cvWaitKey(0);

116. }*/

117.

118.

119. ////convex hull

120. CvSeq* hull=cvConvexHull2(contourAppr);

121. //convexity defects

122. CvSeq* defectSeq=cvConvexityDefects(contourAppr,hull);

123. //rearrange the detectSeq in linked sequence

124.

125. for (int i=0;itotal;i++){

126. CvConvexityDefect*

dp=(CvConvexityDefect*)CV_GET_SEQ_ELEM(CvConvexityDefect,defectSeq,i);

127.

128. cvLine(pImgDefects,*(dp->start),*(dp->end),cvScalar(0,0,255));

129. cvLine(pImgDefects,*(dp->start),*(dp->depth_point),cvScalar(0x00,0x99,0xff)); 130. cvLine(pImgDefects,*(dp->depth_point),*(dp->end),cvScalar(0xff,0x99,0x00)); 131. cvCircle(pImgDefects,*(dp->depth_point),2,cvScalar(0xff,0x99,0x00));

132. cout<start->x<<","<start->y<<")"<

134.

135.

136. cvShowImage("original",pImgColor);

137. cvShowImage("canny",pImgGray);

138. cvShowImage("contour all",pImgContourAll);

139. cvShowImage("contour appr",pImgContourAppr);

140. cvShowImage("ConvexityDefects",pImgDefects);

141. //cvShowImage("hull",pImgHull);

142.

143.

144. cvWaitKey(0);

145.

146. cvDestroyAllWindows();

147.

148. cvReleaseImage(&pImgColor);

149. cvReleaseImage(&pImgGray);

150. cvReleaseImage(&pImgContourAll);

151. cvReleaseImage(&pImgContourAppr);

152. cvReleaseImage(&pImgDefects);

153. cvReleaseImage(&pImgHull);

154.

155. cvReleaseMemStorage(&storage); 156. cvReleaseMemStorage(&storageAppr);

图像处理opencv代码

#include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();

基于opencV的动态背景下运动目标检测及跟踪(修改版)

基于openCV的动态背景下的运动目标检测 摘要:介绍在动态背景下对视频图像序列进行运动目标的检测,主要包括三个步骤,分别是运动估计,运动补偿和目标检测。在运动估计中采用的主要是基于特征点匹配算法。这种算法与传统的块匹配算法最大的好处在于它的数据量少,计算简单迅速而且图像的匹配可靠性更高。最后用计算机视觉类库openCV进行实现。 关键词:运动目标检测;openCV;特征点匹配 Moving Object Detection in the Dynamic Background Based on openCV Abstract:Introducing a moving object detection algorithm of the dynamic background in the video image sequence,which includes three steps. They are motion estimation, motion compensation and object detection. At the motion estimation, we take an algorithm based on the feature points matching. The advantages of this algorithm is that it needs fewer data and indicates faster calculating speed compared to the block matching algorithm. What’s more, the matching of the video image sequence is more reliable. Then used openCV realized the algorithm. Keywords: moving object detection; openCV; feature points matching 引言 在生活中摄像头可以说随处可见,我们经常需要对视频中的运动目标进行相关操作,这就设涉及到了对运动目标的检测及跟踪。作为视觉领域的一部分,它不仅对我们的生活,在军事,医学等各种领域里都有着广泛的影响。 所谓运动目标的检测就是在一段序列图像中检测出变化区域,并将运动目标从背景图像中提取出来[2],它是基础,能否正确的检测与分割出运动目标对后续的工作有着巨大的影响。常见的运动目标检测方法有:背景差分法,帧差法,累积差分法,光流法。本文主要介绍的是一种在动态背景下对运动目标进行检测的算法。 检测算法介绍 检测算法有很多种,不同的算法有他们各自的利与弊。背景差分法:是事先将背景图像存储下来,再与观测图像进行差分运算,实现对运动区域的检测。这种方法能得到较为完整的运动目标信息,但背景图像必须随着外部条件比如光照等的变化而不断更新,所以背景模型的获取和更新比较麻烦。帧差法:直接比较相邻两帧图像对应像点的灰度值的不同,然后通过阈值来提取序列图像中的运动区域[2]。这种方法更新速度快,算法简单易实现,适应性强,不需要获取背景图像。但是背景与运动目标间需要有一定程度的灰度差,否则可能在目标内部产生空洞,不能完整的提取出运动目标。为了改进相邻两帧间的差分效果,人们提出了累积差分法。累积差分法是利用三帧图像计算两个差分图像,再令其对应像素相乘的算法。它通过分析整个图像序列的变化来检测小位移或缓慢运动的物体。光流法是在时间上连续的两幅图想中,用向量来表示移动前后的对应点,在适当平滑性约束的条件下,根据图像序列的时空梯度估计运动场,通过分析运动场的变化对运动目标和场景进行检测和分割。 上面的几种算法都是基于静态背景下的方法,下面主要介绍动态背景下运动目标的检测。 因为生活中我们在很多情况下背景图像都不是静态的,有时摄像机都是安装在一个运动

图像管理方案计划opencv代码

/. #include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();

基于opencv的运动目标检测和跟踪

本科毕业论文
(科研训练,毕业设计)

目: opencv 的运动目标检测
姓 学
名:汤超 院:信息科学与技术学院 系:电子工程系
专 年 学
业:电子信息工程 级:2005 号:22220055204057 职称:教授
指导教师(校内) :杨涛
2009 年
5 月
25 日

厦门大学电子工程系 2005 级本科毕业论文 -
基于 opencv 的运动目标检测和跟踪
摘要
Opencv(Open Source Computer Vision Library)是一种用于数字图像处理和计算机视 觉的函数库,由 Intel 微处理器研究实验室(Intel's MicroprocessorResearch Lab)的视 觉交互组(The Visual Interaetivity Group)开发.采用的开发语言是 C++,可以在 window: 系统及 Linux 系统下使用,该函数库是开放源代码的,能够从 Intel 公司的网站免费下载 得到.opencv 提供了针对各种形式的图像和视频源文件(如:bitmap 图像,video 文件和实 时摄像机)的帧提取函数和很多标准的图像处理算法,这些函数都可以直接用在具体的视频 程序开发项目中. 针对在背景中检测出运动目标并实施警戒等特定提示,本文利用 opencv 的运动物体 检测的数据结构,函数以及基本框架,建立了一个由人机交互界面模式.实施对物体的检 测.该方面在安防方面已经很受重视.相信在不久的将来将会成为一种监督秩序的方式.
关键字 视频,运动目标检测,帧差分

opencv摄像机标定代码

// cvCalib.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include #include void InitCorners3D(CvMat *Corners3D, CvSize ChessBoardSize, int Nimages, float SquareSize); int image_width = 768; int image_height = 576;//待标定图片的大小 const int ChessBoardSize_w = 7; const int ChessBoardSize_h = 7;//图片中可标定的角数 const CvSize ChessBoardSize = cvSize(ChessBoardSize_w,ChessBoardSize_h); const int NPoints = ChessBoardSize_w*ChessBoardSize_h;//角点个数 const int NImages=6;//待标定的图片数 int corner_count[NImages] = {0}; float SquareWidth = 10; //棋盘格子的边长,可任意设定,不影响内参数 CvMat *intrinsics; CvMat *distortion_coeff; CvMat *rotation_vectors; CvMat *translation_vectors; CvMat *object_points; CvMat *point_counts; CvMat *image_points; void main() { IplImage *current_frame_rgb; IplImage *current_frame_gray; IplImage *chessBoard_Img; CvPoint2D32f corners[NPoints*NImages]; chessBoard_Img =cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 3); current_frame_gray = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 1); current_frame_rgb = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 3); int captured_frames=0;

开题报告--监控系统中的行人检测算法的实现

开 题 报 告 -- 监 控 系 统 中 的 行 人 检测算法的实现

毕业设计(论文)开题报告
题 目 监控系统中的行人检测算法的实现
学院
通信工程
专业
信息对抗技术
姓名
班级
学号
指导教师

一、综述本课题国内外研究动态,说明选题的依据和意义
科学技术的快速发展,在给人带来利益和便利的同时,也给人带来了安全隐患。 如为保护某些具有较高的经济价值或技术优势的核心技术及机密而设立的禁区,交 通工具的快速行驶等都会给人们带来安全隐患。因此,监控系统(特别是智能监控 系统)越来越受到人们的重视。纵观各种影响社会安全稳定的事件,给人们带来严 重损失的除不可控因素(地震、火山喷发等)外,主要是人的行为。因此,在监控 系统中实现行人检测将可以避免巨大的人身、经济等损失,也成为了国内外研究的 热点。
目前,清华大学、浙江大学、上海交通大学计算机实验室以及中国科学院自动 化研究所等是国内在行人检测研究上比较著名的高校或研究机构。而且,中国科学 院自动化研究所的生物识别与安全技术研究中心开发的人脸识别系统已经投入使用 (2008 年北京奥运会和 2010 年上海世博会等重大活动)。浙江大学人工智能研究 所采用了单目视觉的方法[1] ,中科院的李和平、胡占义等提出基于监督学习的异常 检测和行为建模算法[2]。国外著名的智能监控系统有 IBM 的智能监控系统和以色列 的 IOImage 公司推出的智能监控系统。另外,卡耐基梅隆大学开发的 NabLab.10 系统已经应用 于汽车的检测系统。虽然国内的监控系统行业近些年发展较快,但是和国外相比仍 有一定的差距。
监控系统中行人检测技术研究至今,比较成熟的算法主要有 Leibe 等人基于“局 部特性的编码”进行的行人检测、Oliver 等人利用边缘图像来对不同的形状模型进行 匹配(ASM)和 Dalal 与 Triggs 提出的基于梯度直方图 HOG+支持向量机 SVM 的行 人检测算法等。而在所有的行人检测技术,基本都包括了运动目标检测和运动目标 识别两个关键技术。
运动目标检测是指通过比较视频图像中像素点的变化判断是否有运动物体,并 通过图像处理技术将运动目标分割出来。运动目标的检测是运动目标识别的前提和 保障,目前主要有光流法和帧差法(包括对称帧差法和背景减除法)。运动目标识别 是对运动目标检测阶段获得的运动目标进行处理,识别出其是行人还是其他的物体。 目前主要有基于运动的方法、基于模板匹配的方法、基于统计学习方法[3]等。
OpenCV 是著名的开源的计算机视觉的函数库,由大量的 C 函数和 C++类构 成作为接口,实现了图像处理和计算机视觉方面的很多通用算法。而且 OpenCV 中 的机器学习函数库实现了机器学习研究领域中比较常见、应用较为广泛的学习方法, 包括了贝叶斯分类器、K 邻近算法、支持向量机、决策树、Adaboost 算法以及神经 网路算法,基本上覆盖了机器学习领域中的主流算法。因此,使用 OpenCV 能够较 灵活的实现行人检测。

基于opencv2.0的车牌检测与字符分割的代码

本程序主要实现的是车牌的定位与检测 主要是利用申继龙论文里面的方法 1、采集得到的图像 2、把RGB图像转换成HSI彩色图像 3、利用设定的H、S阈值得到二值图像 4、对二值图像水平投影获得候选区域 5、对候选区域的HSI图像边缘检测 */ #include "stdafx.h" #include "opencv2/opencv.hpp" #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/nonfree/features2d.hpp" #include "opencv2/imgproc/imgproc_c.h" #include "opencv2/legacy/legacy.hpp" #include "opencv2/legacy/compat.hpp" #include #include #include #include #include #include #include #include #include using namespace std; using namespace cv; #define pi 3.14159265 IplImage* srcImage=NULL;//存储原图片 IplImage*srcImage1=NULL;//存储原始图片的副本 IplImage* HSI=NULL; static IplImage* grayImage=NULL;//存储原图片灰度图 static double posdouble=0.0; IplImage* channelOneImage=NULL; IplImage* channelTwoImage=NULL; IplImage* channelThreeImage=NULL; IplImage* plateImage=NULL;//存储车牌图像 IplImage* grayPlateImage=NULL;//存储车牌灰度图像 vectorcharacterImageList;//存储7个车牌字符图像的容器vectorxList;//存储7个车牌字符的起始和结束位置

opencv之HOG特征详解与行人检测

HOG(Histogram of Oriented Gradient)特征在对象检测与模式匹配中是一种常见的特征提取算法,是基于本地像素块进行特征直方图提取的一种算法,对象局部的变形与光照影响有很好的稳定性,最初是用HOG特征来来识别人像,通过HOG特征提取+SVM训练,可以得到很好的效果,OpenCV已经有了。HOG特征提取的大致流程如下: 详细步骤 第一步:灰度化 对HOG特征提取来说第一步是对输入的彩色图像转换为灰度图像,图像灰度化的方法有很多,不同灰度化方法之间有一些微小的差异,从彩色到灰度的图像转换可以表示如下: 第二步:计算图像梯度 计算图像的X方向梯度dx与Y方向梯度dy,根据梯度计算mag与角度,计算梯度时候可以先高斯模糊一下(可选步骤),然后使用sobel或者其它一阶导数算子计算梯度值dx、dy、mag、angle:

第三步:Cell分割与Block 对于图像来说,分成8x8像素块,每个块称为一个Cell,每个2x2大小的 Cell称为一个Block,每个Cell根据角度与权重建立直方图,每20度为一 个BIN,每个Cell得到9个值、每个Block得到36个值(4x9), 图像如下: 每个Block为单位进行L2数据归一化,作用是抵消光照/迁移影响,L2的归一化的公式如下: 第四步:生成描述子 对于窗口64x128范围大小的像素块,可以得到8x16个Cell,使用Block 在窗口移动,得到输出的向量总数为7x15x36=3780特征向量,每次Block 移动步长是八个像素单位,一个Cell大小。

使用HOG特征数据 HOG特征本身是不支持旋转不变性与多尺度检测的,但是通过构建高斯金字塔实现多尺度的开窗检测就会得到不同分辨率的多尺度检测支持。OpenCV中HOG多尺度对象检测API如下: virtual void cv::HOGDescriptor::detectMultiScale( InputArray img, std::vector< Rect > & foundLocations, double hitThreshold = 0, Size winStride = Size(), Size padding = Size(), double scale = 1.05, double finalThreshold = 2.0, bool useMeanshiftGrouping = false ) Img-表示输入图像 foundLocations-表示发现对象矩形框 hitThreshold-表示SVM距离度量,默认0表示,表示特征与SVM分类超平面之间 winStride-表示窗口步长 padding-表示填充 scale-表示尺度空间 finalThreshold-最终阈值,默认为2.0 useMeanshiftGrouping-不建议使用,速度太慢拉 使用OpenCV预训练SVM行人HOG特征分类器实现多尺度行人检测的代码如下: import cv2 as cv if __name__ == '__main__': src = cv.imread("D:/images/pedestrian.png") cv.imshow("input", src)

基于opencv的人脸识别程序-代码详解

#include "cv.h" #include "highgui.h" #include #ifdef _EiC #define WIN32 #endif static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; void detect_and_draw( IplImage* image ); const char* cascade_name = "haarcascade_frontalface_alt.xml";//人脸检测分类器 int main( int argc, char** argv ) { CvCapture* capture = 0; IplImage *frame, *frame_copy = 0; int optlen = strlen("--cascade="); const char* input_name; if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 ) { cascade_name = argv[1] + optlen; input_name = argc > 2 ? argv[2] : 0; } else { cascade_name = "E:\毕业设计\智能机器人动态人脸识别系统\陈建州程序.xml";//分类器路径 input_name = argc > 1 ? argv[1] : 0; } cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); if( !cascade )//如果没有找到分类器,输出以下 { fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); fprintf( stderr, "Usage: facedetect --cascade=\"\" [filename|camera_index]\n" ); return -1;

行人检测与目标跟踪算法研究

基于opencv中光流法的运动 行人目标跟踪与检测 一、课题研究背景及方法 行人检测具有极其广泛的应用:智能辅助驾驶,智能监控,行人分析以及智 能机器人等领域。从2005年以来行人检测进入了一个快速的发展阶段,但是也存在很多问题还有待解决,个人觉得主要还是在性能和速度方面还不能达到一个权衡。 早期以静态图像处理中的分割、边缘提取、运动检测等方法为主。例如 (1)以Gavrila为代表的全局模板方法:基于轮廓的分层匹配算法,构造了将近2500个轮廓模板对行人进行匹配, 从而识别出行人。为了解决模板数量众多而引起的速度下降问题,采用了由粗到细的分层搜索策略以加快搜索速度。另外,匹配的时候通过计算模板与待检测窗口的距离变换来度量两者之间的相似性。 (2)以Broggi为代表的局部模板方法:利用不同大小的二值图像模板来对人头和肩部进行建模,通过将输入图像的边缘图像与该二值模板进行比较从而识别行人,该方法被用到意大利Parma大学开发的ARGO智能车中。 (3)以Lipton为代表的光流检测方法:计算运动区域内的残余光流; (4)以Heisele为代表的运动检测方法:提取行人腿部运动特征; (5)以Wohler为代表的神经网络方法:构建一个自适应时间延迟神经网络来判断是否是人体的运动图片序列; 以上方法,存在速度慢、检测率低、误报率高的特点。 2、行人检测的研究现状

(1)基于背景建模的方法:分割出前景,提取其中的运动目标,然后进一步 提取特征,分类判别;在存在下雨、下雪、刮风、树叶晃动、灯光忽明忽暗等场 合,该方法的鲁棒性不高,抗干扰能力较差。且背景建模方法的模型过于复杂,对 参数较为敏感。 (2)基于统计学习的方法:根据大量训练样本构建行人检测分类器。提取的 特征一般有目标的灰度、边缘、纹理、形状、梯度直方图等信息,分类器包括神经 网络、SVM,adaboost等。该方法存在以下难点: (a)行人的姿态、服饰各不相同; (b)提取的特征在特征空间中的分布不够紧凑; (c)分类器的性能受训练样本的影响较大; (d)离线训练时的负样本无法涵盖所有真实应用场景的情况; 尽管基于统计学习的行人检测方法存在着诸多的缺点,但依然有很多人将注 意力集中于此。 行人检测国外研究情况: 法国研究人员Dalal在2005的CVPR发表的HOG+SVM的行人检测算法(Histograms of Oriented Gradients for Human Detection, Navneet Dalel,Bill Triggs, CVPR2005)。 Dollar 在 2010 年 BMVC 的《The fastest pedestrian detector in the west》一文中提出了一种新的思想,这种思想只需要训练一个标准 model,检测N/K(K ≈10)然后其余的 N-N/K 种大小的图片的特征不需要再进行这种复杂的计算,而是跟据这 N/K 次的结果,由另外一种简单的算法给估计出来,这种思 想实现的基础是大小相近的图像的特征可以被足够精确的估计出来;同年,德国

opencv,模板匹配源码

竭诚为您提供优质文档/双击可除opencv,模板匹配源码 篇一:opencv模板匹配 opencv模板匹配 V1.0 zhbrain 1、2、1)2)3、1)2) opencv模板匹配原理--没有金字塔................................................. ..........................4模板匹配—使用金字塔................................................. ...............................................5主要函数简介................................................. ................................................... ........5程序流程................................................. ................................................... ................5验证和结

果................................................. ................................................... ...............5实验环境................................................. ................................................... ................5实验结果................................................. ................................................... . (5) opencv模板匹配 1、opencv模板匹配原理--没有金字塔 函数: cvmatchtemplate(source,target,result,method);说明:source:源图像,一般我们使用灰度图像;如果source 为Rgb图像,使用函数cvcvtcolor(source,dst,cV_Rgb2gRay)这里,dst为转换后的灰度图像。target:模板图像。 Result:匹配后的矩阵,width=s_width–t_taget+1,height=s_height–t_height+1使用函数 iplimage*result=cvcreateimage(resultsize,ipl_depth_ 32F,1)获得。method:cV_tm_sqdiFF: cV_tm_sqdiFF_noRmed cV_tm_ccoRR

基于OpenCV的运动目标检测与跟踪毕业设计

基于VC的运动图像跟踪算法设计

沈阳航空航天大学毕业设计(论文) 摘要 运动目标检测与跟踪作为计算机视觉领域的一个重要分支与基础,在工业、医疗保健、航空航天、军事等各个领域具有广泛的应用前景,一直受到广泛的关注,并成为计算机视觉领域的一个研究热点。但是由于运动目标检测问题本身的复杂性,运动目标的检测与跟踪依然面临着诸多挑战。本文在现有研究成果的基础上,对静态场景下的运动目标检测跟踪进行了深入的讨论。 本文首先对运动目标检测的基本方法----帧间差分法与背景差分法进行了深入的学习和探讨,然后,借助于OpenCV技术,在Visual C++ 6.0编程环境下开发了运动目标检测跟踪系统。该系统首先对采集的视频图像序列进行相关的预处理之后,将视频图像序列中的运动目标比较可靠地检测出来。通过系统的测试结果和数据可以得出结论:本文基于OpenCV设计的运动目标检测跟踪系统具有良好的实时性,能够正确地进行运动目标的实时检测与跟踪。 关键词:运动目标检测;帧间差分法;视频图像;OpenCV

基于VC的运动图像跟踪算法设计 Algorithm Design of Image Motion Tracking Based on VC Abstract Moving target detection and tracking field of computer vision as an important branch of the foundation, in the industrial, healthcare, aerospace, military and other fields with a wide range of applications, has been widespread concern, and the field of computer vision to become a research hotspot. However, due to moving target detection complexity of the problem itself, moving target detection and tracking is still facing many challenges. In this paper, based on the results of existing research in static scenes of the moving target detection and tracking in-depth discussion. This article first basic method of moving target detection - frame difference method and background subtraction method conducted in-depth study and discussion, and then, by means of OpenCV technology, Visual C 6.0 programming environment developed a moving target detection and tracking system. The system and the collection of the associated video sequence after pretreatment, the video image of the moving target sequence comparison reliably detected. Through systematic test results and data can be concluded: Based on OpenCV design moving target detection and tracking system has good real-time, be able to properly carry out real-time moving target detection and tracking. Keywords: moving target detection; frame difference method; video frame; OpenCV

OpenCV下肤色检测代码

1.void cvSkinSegment(IplImage* img, IplImage* mask){ 2. CvSize imageSize = cvSize(img->width, img->height); 3. IplImage *imgY = cvCreateImage(imageSize, IPL_DEPTH_8U, 1); 4. IplImage *imgCr = cvCreateImage(imageSize, IPL_DEPTH_8U, 1); 5. IplImage *imgCb = cvCreateImage(imageSize, IPL_DEPTH_8U, 1); 6. 7. 8. IplImage *imgYCrCb = cvCreateImage(imageSize, img->depth, img->nChannels ); 9. cvCvtColor(img,imgYCrCb,CV_BGR2YCrCb); 10. cvSplit(imgYCrCb, imgY, imgCr, imgCb, 0); 11.int y, cr, cb, l, x1, y1, value; 12. unsigned char *pY, *pCr, *pCb, *pMask; 13. 14. pY = (unsigned char *)imgY->imageData; 15. pCr = (unsigned char *)imgCr->imageData; 16. pCb = (unsigned char *)imgCb->imageData; 17. pMask = (unsigned char *)mask->imageData; 18. cvSetZero(mask); 19. l = img->height * img->width; 20.for (int i = 0; i < l; i++){ 21. y = *pY; 22. cr = *pCr; 23. cb = *pCb; 24. cb -= 109; 25. cr -= 152 26. ; 27. x1 = (819*cr-614*cb)/32 + 51; 28. y1 = (819*cr+614*cb)/32 + 77; 29. x1 = x1*41/1024; 30. y1 = y1*73/1024; 31. value = x1*x1+y1*y1; 32.if(y<100) (*pMask)=(value<700) ? 255:0; 33.else (*pMask)=(value<850)? 255:0; 34. pY++; 35. pCr++; 36. pCb++; 37. pMask++; 38. } 39. cvReleaseImage(&imgY); 40. cvReleaseImage(&imgCr); 41. cvReleaseImage(&imgCb); 42. cvReleaseImage(&imgYCrCb);

相关主题
文本预览
相关文档 最新文档