opencv+arduino实现物体点追踪效果
本文所要实现的结果是:通过在摄像头中选择一个追踪点,通过pc控制摄像头的舵机,使这一点始终在图像的中心。
要点:使用光流法在舵机旋转的同时进行追踪,若该点运动,则摄像头跟踪联动。
#include#include #include #include #include #include usingnamespacestd; usingnamespacecv; #defineWINDOW_NAME"【程序窗口】" voidon_MouseHandle(intevent,intx,inty,intflags,void*param); voidDrawRectangle(cv::Mat&img,cv::Rectbox); voidtracking(Mat&frame,vector temp); HANDLEhComm; LPCWSTRpStr=L"COM4"; charlpOutbuffer[100]; DWORDdwbyte=100; MatsrcImage,grayImage,tempImage1,tempImage,imageROI,grayprev; intg_maxCornerNumber=1; doublequalityLevel=0.01; doubleminDistance=10; intblockSize=3; doublek=0.04; vector corners; vector pre_corners; vector counts; vector status; vector err; Rectg_rectangle; Rectg_temprectangle; boolg_bDrawingBox=false; intmain(intargc,char**argv) { Matframe; Matresult; COMSTATComstat; DWORDdwError; BOOLbWritestat; hComm=CreateFile(pStr,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,NULL); if(hComm==INVALID_HANDLE_VALUE) { cout<<"FLASE"; return-1; } else { cout<<"TURE"; } DCBdcb; GetCommState(hComm,&dcb); dcb.BaudRate=9600; dcb.ByteSize=8; dcb.Parity=NOPARITY; dcb.StopBits=TWOSTOPBITS; boolset=SetCommState(hComm,&dcb); boolsup=SetupComm(hComm,1024,1024); VideoCapturecapture(0); namedWindow(WINDOW_NAME); setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&frame); while(1) { capture>>frame; if(!frame.empty()) { cvtColor(frame,grayImage,CV_RGB2GRAY); if(g_bDrawingBox) rectangle(frame,g_rectangle.tl(),g_rectangle.br(),Scalar(255,255,255)); if(corners.size()!=0) { boolcan=PurgeComm(hComm,PURGE_TXCLEAR); if(corners[0].x>(frame.cols/2+100)) { lpOutbuffer[0]='a'; boolne=WriteFile(hComm,lpOutbuffer,dwbyte,&dwbyte,NULL); } elseif(corners[0].x<(frame.cols/2-100)) { lpOutbuffer[0]='b'; boolne=WriteFile(hComm,lpOutbuffer,dwbyte,&dwbyte,NULL); } tracking(frame,corners); rectangle(frame,Point(corners[0].x-10,corners[0].y-10),Point(corners[0].x+10,corners[0].y+10),Scalar(255,255,255)); } imshow(WINDOW_NAME,frame); } else { printf("--(!)Nocapturedframe--Break!"); break; } intc=waitKey(50); if((char)c==27) { break; } } return0; } voidon_MouseHandle(intevent,intx,inty,intflags,void*param) { Mat&image=*(cv::Mat*)param; switch(event) { caseEVENT_MOUSEMOVE: { if(g_bDrawingBox) { g_rectangle.width=x-g_rectangle.x; g_rectangle.height=y-g_rectangle.y; } } break; caseEVENT_LBUTTONDOWN: { g_bDrawingBox=true; g_rectangle=Rect(x,y,0,0); } break; caseEVENT_LBUTTONUP: { g_bDrawingBox=false; if(g_rectangle.width<0) { g_rectangle.x+=g_rectangle.width; g_rectangle.width*=-1; } if(g_rectangle.height<0) { g_rectangle.y+=g_rectangle.height; g_rectangle.height*=-1; } imageROI=grayImage(g_rectangle); goodFeaturesToTrack(imageROI,corners,g_maxCornerNumber,qualityLevel,minDistance,Mat(),blockSize,false,k); for(inti=0;i temp) { cvtColor(frame,tempImage1,COLOR_BGR2GRAY); if(grayprev.empty()) { tempImage1.copyTo(grayprev); } calcOpticalFlowPyrLK(grayprev,tempImage1,temp,pre_corners,status,err); for(size_ti=0;i 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。