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

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

1.#include <Windows.h>2.3.#include <cv.h>4.#include <cxcore.h>5.#include <highgui.h>6.7.#include <fstream>8.#include <iostream>9.#include <iomanip>10.#include <algorithm>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<<message<<endl;20. exit(0);21.}22.#undef UNICODE23.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"<<endl;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"<<endl;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. //canny87. 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_LINK_RUNS);91. //original contours92. CvSeq* tseq=contourSeqAll;93. for (;contourSeqAll;contourSeqAll=contourSeqAll->h_next){94. cvDrawContours(pImgContourAll,contourSeqAll,cvScalar(255,0,0),cvScalar(0,0,255),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 contours102. 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 contours109. /*cout<<"contours:"<<endl;110. for (int i=0;i<contourAppr->total;i++){111. CvPoint* p=(CvPoint*)CV_GET_SEQ_ELEM(CvPoint,contourAppr,i);112. cout<<p->x<<","<<p->y<<endl;113. cvCircle(pImgHull,*p,3,cvScalar(0,255,255));114. cvShowImage("hull",pImgHull);115. cvWaitKey(0);116. }*/117.118.119. ////convex hull120. CvSeq* hull=cvConvexHull2(contourAppr);121. //convexity defects122. CvSeq* defectSeq=cvConvexityDefects(contourAppr,hull);123. //rearrange the detectSeq in linked sequence124.125. for (int i=0;i<defectSeq->total;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<<i<<" :("<<dp->start->x<<","<<dp->start->y<<")"<<endl; 133. }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);。

相关主题