本文所要实现的结果是:通过在摄像头中选择一个追踪点,通过电脑控制摄像头的舵机,使这一点始终在图像的中心。
要点:使用光流法在舵机旋转的同时进行追踪,若该点运动,则摄像头跟踪联动。
# 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 角落; vector pre_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实现物体点追踪效果