opencv + arduino实现物体点追踪效果

  

本文所要实现的结果是:通过在摄像头中选择一个追踪点,通过电脑控制摄像头的舵机,使这一点始终在图像的中心。
  

  

要点:使用光流法在舵机旋转的同时进行追踪,若该点运动,则摄像头跟踪联动。
  

        # include   # include   # include   # include   # include   # include         使用名称空间性病;   使用名称空间的简历;      #定义WINDOW_NAME”【程序窗口】”      空白on_MouseHandle (int, int x, int y, int旗帜,void *参数);   空白DrawRectangle(简历::Mat&img,简历::矩形框);   无效的跟踪(垫和框架,vector临时);      处理hComm;   LPCWSTR pStr=L“COM4为”;   char lpOutbuffer [100];   DWORD dwbyte=100;   垫srcImage、grayImage tempImage1、tempImage imageROI, grayprev;   int g_maxCornerNumber=1;   双qualityLevel=0.01;   双minDistance=10;   int blockSize=3;   双k=0.04;   vector角落;   vectorpre_corners;   vector计数;   vector状态;   vector犯错;   矩形g_rectangle;   矩形g_temprectangle;   bool g_bDrawingBox=false;         int主要(int命令行参数个数,char * * argv)   {   垫框架;   垫的结果;      COMSTAT COMSTAT;   DWORD dwError;   BOOL bWritestat;   hComm=它仅仅(pStr GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, NULL);   如果(hComm==INVALID_HANDLE_VALUE)   {   cout<& lt;“误”;   返回1;   }   其他的   {   cout<& lt;“真正的”;   }   DCB DCB;   GetCommState (hComm, dcb);   dcb.BaudRate=9600;   dcb.ByteSize=8;   dcb.Parity=NOPARITY;   dcb.StopBits=TWOSTOPBITS;   bool设置=SetCommState (hComm, dcb);   bool一口=SetupComm (hComm、1024、1024);      VideoCapture捕获(0);      namedWindow (WINDOW_NAME);   setMouseCallback (WINDOW_NAME on_MouseHandle (void *),框架);      而(1)   {   捕捉祝辞祝辞框架;      如果(! frame.empty ())   {   cvtColor(框架、grayImage CV_RGB2GRAY);   如果(g_bDrawingBox)   矩形(框架、g_rectangle.tl (), g_rectangle.br(),标量(255255255));   如果(corners.size () !=0)   {   bool可以=PurgeComm (hComm PURGE_TXCLEAR);   如果([0]角落.x> (frame.cols/2 + 100)   {   lpOutbuffer [0]=' a ';   bool ne=WriteFile (hComm、lpOutbuffer dwbyte,, dwbyte, NULL);   }   else if ([0] .x<角落;(frame.cols/2 - 100))   {   lpOutbuffer [0]=' b ';   bool ne=WriteFile (hComm、lpOutbuffer dwbyte,, dwbyte, NULL);   }   跟踪(框架、角落);   矩形(帧点([0][0].x-10角落,角落.y-10),点([0]。x + 10,角落角落[0].y + 10),标量(255255255));   }   imshow (WINDOW_NAME框架);   }   其他的   {   printf ("——(!)没有捕获的框架——打破!”);   打破;   }      int c=waitKey (50);   如果((char) c==27)   {   打破;   }   }   返回0;   }   空白on_MouseHandle (int, int x, int y, int旗帜,void *参数)   {      Mat&形象=*(简历:垫*)参数;   开关(事件)   {   案例EVENT_MOUSEMOVE:   {   如果(g_bDrawingBox)   {   g_rectangle。宽度=x-g_rectangle.x;   g_rectangle。身高=y-g_rectangle.y;   }   }   打破;      案例EVENT_LBUTTONDOWN:   {   g_bDrawingBox=true;   g_rectangle=矩形(x, y, 0, 0);   }   打破;      案例EVENT_LBUTTONUP:   {   g_bDrawingBox=false;   如果(g_rectangle。宽度& lt;0)   {   g_rectangle。x +=g_rectangle.width;   g_rectangle。宽度*=1;   }      如果(g_rectangle。高度& lt;0)   {   g_rectangle。y +=g_rectangle.height;   g_rectangle。高度*=1;   }   imageROI=grayImage (g_rectangle);   goodFeaturesToTrack (imageROI角落,g_maxCornerNumber、qualityLevel minDistance,垫(),blockSize,假,k);   for (int i=0;我& lt;corners.size ();我+ +)   {   角落[我]。x=[我]。x + g_rectangle.x角落;   [我]角落.y=[我].y + g_rectangle.y角落;   }   }   打破;      }   }      无效的跟踪(垫和框架,vector临时)   {   cvtColor(框架、tempImage1 COLOR_BGR2GRAY);      如果(grayprev.empty ())   {   tempImage1.copyTo (grayprev);   }      calcOpticalFlowPyrLK (grayprev tempImage1、临时pre_corners,地位,犯错);      (size_t我=0;i

opencv + arduino实现物体点追踪效果