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

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

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

#include<opencv2\opencv.hpp>
#include<opencv\cv.h>
#include<opencv\highgui.h>
#include<math.h>
#include<Windows.h>
#include<string.h> 

using namespace std;
using namespace cv; 

#define WINDOW_NAME "【程序窗口】"    

void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle( cv::Mat& img, cv::Rect box );
void tracking(Mat &frame,vector<Point2f> temp); 

HANDLE hComm;
LPCWSTR pStr=L"COM4";
char lpOutbuffer[100];
DWORD dwbyte=100;
Mat srcImage,grayImage,tempImage1,tempImage,imageROI,grayprev;
int g_maxCornerNumber = 1;
double qualityLevel = 0.01;
double minDistance = 10;
int blockSize = 3;
double k = 0.04;
vector<Point2f> corners;
vector<Point2f> pre_corners;
vector<Point2f> counts;
vector<uchar> status;
vector<float> err;
Rect g_rectangle;
Rect g_temprectangle;
bool g_bDrawingBox = false; 

int main( int argc, char** argv )
{
  Mat frame;
  Mat result; 

  COMSTAT Comstat;
  DWORD dwError;
  BOOL bWritestat;
  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";
  }
  DCB dcb;
  GetCommState(hComm,&dcb);
  dcb.BaudRate=9600;
  dcb.ByteSize=8;
  dcb.Parity=NOPARITY;
  dcb.StopBits=TWOSTOPBITS;
  bool set=SetCommState(hComm,&dcb);
  bool sup=SetupComm(hComm,1024,1024); 

  VideoCapture capture(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)
        {
          bool can=PurgeComm(hComm,PURGE_TXCLEAR);
          if (corners[0].x>(frame.cols/2+100))
          {
            lpOutbuffer[0]='a';
            bool ne=WriteFile(hComm,lpOutbuffer,dwbyte,&dwbyte,NULL);
          }
          else if (corners[0].x<(frame.cols/2-100))
          {
            lpOutbuffer[0]='b';
            bool ne=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(" --(!) No captured frame -- Break!");
        break;
      } 

      int c = waitKey(50);
      if( (char)c == 27 )
      {
        break;
      }
  }
  return 0;
}
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{ 

  Mat& image = *(cv::Mat*) param;
  switch( event)
  {
  case EVENT_MOUSEMOVE:
    {
      if( g_bDrawingBox )
      {
        g_rectangle.width = x-g_rectangle.x;
        g_rectangle.height = y-g_rectangle.y;
      }
    }
    break; 

  case EVENT_LBUTTONDOWN:
    {
      g_bDrawingBox = true;
      g_rectangle =Rect( x, y, 0, 0 );
    }
    break; 

  case EVENT_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 (int i = 0; i < corners.size(); i++)
      {
        corners[i].x=corners[i].x+g_rectangle.x;
        corners[i].y=corners[i].y+g_rectangle.y;
      }
    }
    break; 

  }
} 

void tracking(Mat &frame,vector<Point2f> temp)
{
  cvtColor(frame, tempImage1, COLOR_BGR2GRAY); 

  if (grayprev.empty())
  {
    tempImage1.copyTo(grayprev);
  } 

  calcOpticalFlowPyrLK(grayprev, tempImage1, temp, pre_corners, status, err); 

  for (size_t i=0; i<pre_corners.size(); i++)
  {
    line(frame, temp[i], pre_corners[i], Scalar(0, 0, 255));
    circle(frame, pre_corners[i], 4, Scalar(0, 255, 0), -1,8,0);
  } 

  swap(pre_corners, corners);
  swap(grayprev, tempImage1);
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Opencv光流运动物体追踪详解

    光流的概念是由一个叫Gibson的哥们在1950年提出来的.它描述是空间运动物体在观察成像平面上的像素运动的瞬时速度,利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法.那么所说的光流到底是什么? 简单来说,上图表现的就是光流,光流描述的是图像上每个像素点的灰度的位置(速度)变化情况,光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的"运动".研究光流场的目的就是为了从

  • Opencv基于CamShift算法实现目标跟踪

    CamShift算法全称是"Continuously Adaptive Mean-Shift"(连续的自适应MeanShift算法),是对MeanShift算法的改进算法,可以在跟踪的过程中随着目标大小的变化实时调整搜索窗口大小,对于视频序列中的每一帧还是采用MeanShift来寻找最优迭代结果,至于如何实现自动调整窗口大小的,可以查到的论述较少,我的理解是通过对MeanShift算法中零阶矩的判断实现的. 在MeanShift算法中寻找搜索窗口的质心用到窗口的零阶矩M00和一阶矩M1

  • 使用OpenCV实现检测和追踪车辆

    本文实例为大家分享了OpenCV实现检测和追踪车辆的具体代码,供大家参考,具体内容如下 完整源码GitHub 使用高斯混合模型(BackgroundSubtractorMOG2)对背景建模,提取出前景 使用中值滤波去掉椒盐噪声,再闭运算和开运算填充空洞 使用cvBlob库追踪车辆,我稍微修改了cvBlob源码来通过编译 由于要对背景建模,这个方法要求背景是静止的 另外不同车辆白色区域不能连通,否则会认为是同一物体 void processVideo(char* videoFilename) {

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

    本文所要实现的结果是:通过在摄像头中选择一个追踪点,通过pc控制摄像头的舵机,使这一点始终在图像的中心. 要点:使用光流法在舵机旋转的同时进行追踪,若该点运动,则摄像头跟踪联动. #include<opencv2\opencv.hpp> #include<opencv\cv.h> #include<opencv\highgui.h> #include<math.h> #include<Windows.h> #include<string.h

  • python+opencv实现动态物体追踪

    简单几行就可以实现对动态物体的追踪,足见opencv在图像处理上的强大. python代码: import cv2 import numpy as np camera=cv2.VideoCapture(0) firstframe=None while True: ret,frame = camera.read() if not ret: break gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) gray=cv2.GaussianBlur(gray,(21

  • python opencv 检测移动物体并截图保存实例

    最近在老家找工作,无奈老家工作真心太少,也没什么面试机会,不过之前面试一家公司,提了一个有意思的需求,检测河面没有有什么船只之类的物体,我当时第一反应是用opencv做识别,不过回家想想,河面相对的东西比较少,画面比较单一,只需要检测有没有移动的物体不就简单很多嘛,如果做街道垃圾检测的话可能就很复杂了,毕竟街道上行人,车辆,动物,很多干扰物,于是就花了一个小时写了一个小的demo,只需在程序同级目录创建一个img目录就可以了 # -*-coding:utf-8 -*- __author__ =

  • opencv检测动态物体的实现

    之前我在超市看到当有物体经过时,监控的屏幕边缘会出现绿框.感觉蛮有意思的.来用opencv试试能不能实现类似的效果.   我采用的检测动态物体的方法是,比较前后两帧图像,即当前画面与上一帧的画面出现了不同.我们把两帧画面进行比较.然后框选出运动的物体.我们还希望程序可以判断当前窗口到底有没有物体在运动.那么我们就需要添加一个状态.为了方便我们找到什么时间有物体移动,我打印出时间.   当我们的程序检测到移动的物体时,会捕捉到它的轮廓,添加一个外接整矩形框,返回x,y的坐标.当不返回坐标时,则意味

  • 基于OpenCv的运动物体检测算法

    基于一个实现的基于OpenCv的运动物体检测算法,可以用于检测行人或者其他运动物体. #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> int main( int argc, char** argv ) //声明IplImage指针 IplImage* pFrame = NULL; IplImage* pFrImg = NULL; IplImage* pBk

  • WebGL three.js学习笔记之阴影与实现物体的动画效果

    实现物体的旋转.跳动以及场景阴影的开启与优化 本程序将创建一个场景,并实现物体的动画效果 运行的结果如图: 运行结果 完整代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Three.js</title> <script src="../../../Import/three.js

  • Unity实现物体左右移动效果

    本文实例为大家分享了Unity实现物体左右移动效果的具体代码,供大家参考,具体内容如下 效果如下 代码: using UnityEngine; using System.Collections; //Add this script to the platform you want to move. //左右移动的平台 public class MovingPlatform : MonoBehaviour { //Platform movement speed.平台移动速度 public floa

  • Python+OpenCV实现实时眼动追踪的示例代码

    使用Python+OpenCV实现实时眼动追踪,不需要高端硬件简单摄像头即可实现,效果图如下所示. 项目演示参见:https://www.bilibili.com/video/av75181965/ 项目主程序如下: import sys import cv2 import numpy as np import process from PyQt5.QtCore import QTimer from PyQt5.QtWidgets import QApplication, QMainWindow

  • Python OpenCV实现人物动漫化效果

    目录 前言 效果展示 代码展示 前言 前几天玩抖音,发现一个人像动漫化的操作,觉得很好玩儿.我心想:python既然这么强大,是不是也可以使用python程序来实现这样一个操作呢? 哈哈!我自己当然是没有这个本事编写这样一个牛逼的程序出来,但是百度可以呀,并且还很好用.百度AI开放平台给我们提供了完整的接口,甚至贴心的将代码都给我们写好了.这些接口还支持很多主流语言都呢,像Java.Python.PHP.C#等,我们做的就是直接调用它即可. 效果怎么样呢?我们先来看看下方的对比图吧. 效果展示

随机推荐