opencv3点追踪

1.点追踪
程序运行后会启动摄像头,按键盘上的r键来启动自动点的追踪,在摄像头下移动物体可以看到物体上的点这物体一起运动
2.源代码
//---------------------------------【头文件、命名空间包含部分】----------------------------
//  描述:包含程序所使用的头文件和命名空间
//-------------------------------------------------------------------------------------------------
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <iostream>
#include <ctype.h>

using namespace cv;
using namespace std;

static void help()
{
 
}

Point2f point;
bool addRemovePt = false;

//--------------------------------【onMouse( )回调函数】------------------------------------
//  描述:鼠标操作回调
//-------------------------------------------------------------------------------------------------
static void onMouse(int event, int x, int y, int /*flags*/, void* /*param*/)
{

 if (event == EVENT_LBUTTONDOWN)
 {
  point = Point2f((float)x, (float)y);
  addRemovePt = true;
 }
}

//-----------------------------------【main( )函数】--------------------------------------------
//  描述:控制台应用程序的入口函数,我们的程序从这里开始
//-------------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{
 help();

 VideoCapture cap;

 TermCriteria termcrit(TermCriteria::MAX_ITER | TermCriteria::EPS, 20, 0.03);
 Size subPixWinSize(10, 10), winSize(31, 31);

 const int MAX_COUNT = 500;
 bool needToInit = false;
 bool nightMode = false;


 cap.open(0);

 if (!cap.isOpened())
 {
  cout << "Could not initialize capturing...\n";
  return 0;
 }

 namedWindow("LK Demo", 1);
 setMouseCallback("LK Demo", onMouse, 0);

 Mat gray, prevGray, image;
 vector<Point2f> points[2];

 for (;;)
 {
  Mat frame;
  cap >> frame;
  if (frame.empty())
   break;

  frame.copyTo(image);
  cvtColor(image, gray, COLOR_BGR2GRAY);

  if (nightMode)
   image = Scalar::all(0);

  if (needToInit)
  {
   // 自动初始化
   goodFeaturesToTrack(gray, points[1], MAX_COUNT, 0.01, 10, Mat(), 3, 0, 0.04);
   cornerSubPix(gray, points[1], subPixWinSize, Size(-1, -1), termcrit);
   addRemovePt = false;
  }
  else if (!points[0].empty())
  {
   vector<uchar> status;
   vector<float> err;
   if (prevGray.empty())
    gray.copyTo(prevGray);
   calcOpticalFlowPyrLK(prevGray, gray, points[0], points[1], status, err, winSize,
    3, termcrit, 0, 0.001);
   size_t i, k;
   for (i = k = 0; i < points[1].size(); i++)
   {
    if (addRemovePt)
    {
     if (norm(point - points[1][i]) <= 5)
     {
      addRemovePt = false;
      continue;
     }
    }

    if (!status[i])
     continue;

    points[1][k++] = points[1][i];
    circle(image, points[1][i], 3, Scalar(0, 255, 0), -1, 8);
   }
   points[1].resize(k);
  }

  if (addRemovePt && points[1].size() < (size_t)MAX_COUNT)
  {
   vector<Point2f> tmp;
   tmp.push_back(point);

   cornerSubPix(gray, tmp, winSize, Size(-1, -1), termcrit);
   points[1].push_back(tmp[0]);
   addRemovePt = false;
  }

  needToInit = false;
  imshow("LK Demo", image);

  char c = (char)waitKey(10);
  if (c == 27)
   break;
  switch (c)
  {
  case 'r':
   needToInit = true;
   break;
  case 'c':
   points[0].clear();
   points[1].clear();
   break;
  case 'n':
   nightMode = !nightMode;
   break;
  }

  std::swap(points[1], points[0]);
  cv::swap(prevGray, gray);
 }

 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值