使用Opencv中的Camshift进行视频中目标跟踪是一个不错的选择,这方面的示例很多,但是大多代码不全,或者代码存在问题,不能正常使用,这里,对很多文章进行整理后,贴出了正确可以使用的代码。

安装Opencv ,他是exe,可以直接安装。

安装完成后,建立工程勿忘记在工程汇总添加include和lib的搜索目录,最后也要添加动态链接库如下:

使用开发环境:VS2010实测。

动态链接库

opencv_core245d.lib

opencv_core245.lib

opencv_highgui245.lib

opencv_highgui245d.lib

opencv_imgproc245.lib

opencv_imgproc245d.lib

opencv_video245.lib

opencv_video245d.lib

如果不安装错误信息的其中一条如下:

错误1error LNK2019: 无法解析的外部符号 "void __cdecl cv::destroyWindow(class std::basic_string,class std::allocator > const &)" (?destroyWindow@cv@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),该符号在函数 _main 中被引用E:\documents\visual studio 2010\Projects\Track\Track\main.obj

错误原因:库文件设置不正确

解决办法:项目->属性->连接器->输入->附加依赖项,添加程序所依赖的库文件,本程序用到opencv_core220d.lib 和opencv_highgui220d.lib(上面的动态库建议全部加上)

使用过程中还可能出现其他错误比如:

proxytrans.ax could not be loaded

本错误时Opencv1.0中的一个注册项的缺省安装造成,安装opencv1.0就可以了,地址如下:

http://www.opencv.org.cn/download/OpenCV_1.0.exe

另一个错误:

错误::“cvSetMouseCallback”: 不能将参数 2 从“void (__cdecl *)(int,int,int,int)”转换为“CvMouseCallback”

原因:函数命名不符合Opencv的命名规范如下更改即可。

//void on_mouse( int event, int x, int y, int flags )

void on_mouse(int event, int x, int y, int flags, void* param)

汇总例程的下载地址:

一个可以参考的教程下载地址如下:

下面贴出本例程中,使用的代码,实现了,简单的目标的跟踪:使用的是笔记本自带的摄像头,可以简单的跟踪你的脸哦,呵呵。还不是太灵敏,有待改进,本例程是结合,Opencv自带的例程以及网友的贡献代码更改,有任何问题,可以给我留言,或者联系我,方式见上。

#include "cv.h"

#include "highgui.h"

#include

#include

IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0;

CvHistogram *hist = 0;

int backproject_mode = 0;

int select_object = 0;

int track_object = 0;

int show_hist = 1;

CvPoint origin;

CvRect selection;

CvRect track_window;

CvBox2D track_box; // tracking 返回的区域 box,带角度

CvConnectedComp track_comp;

int hdims = 48; // 划分HIST的个数,越高越精确

float hranges_arr[] = {0,180};

float* hranges = hranges_arr;

int vmin = 10, vmax = 256, smin = 30;

//void on_mouse( int event, int x, int y, int flags )

void on_mouse(int event, int x, int y, int flags, void* param)

{

if( !image )

return;

if( image->origin )

y = image->height - y;

if( select_object )

{

selection.x = MIN(x,origin.x);

selection.y = MIN(y,origin.y);

selection.width = selection.x + CV_IABS(x - origin.x);

selection.height = selection.y + CV_IABS(y - origin.y);

selection.x = MAX( selection.x, 0 );

selection.y = MAX( selection.y, 0 );

selection.width = MIN( selection.width, image->width );

selection.height = MIN( selection.height, image->height );

selection.width -= selection.x;

selection.height -= selection.y;

}

switch( event )

{

case CV_EVENT_LBUTTONDOWN:

origin = cvPoint(x,y);

selection = cvRect(x,y,0,0);

select_object = 1;

break;

case CV_EVENT_LBUTTONUP:

select_object = 0;

if( selection.width > 0 && selection.height > 0 )

track_object = -1;

#ifdef _DEBUG

printf("\n # 鼠标的选择区域:");

printf("\n X = %d, Y = %d, Width = %d, Height = %d",

selection.x, selection.y, selection.width, selection.height);

#endif

break;

}

}

CvScalar hsv2rgb( float hue )

{

int rgb[3], p, sector;

static const int sector_data[][3]=

{{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}};

hue *= 0.033333333333333333333333333333333f;

sector = cvFloor(hue);

p = cvRound(255*(hue - sector));

p ^= sector & 1 ? 255 : 0;

rgb[sector_data[sector][0]] = 255;

rgb[sector_data[sector][1]] = 0;

rgb[sector_data[sector][2]] = p;

#ifdef _DEBUG

printf("\n # Convert HSV to RGB:");

printf("\n HUE = %f", hue);

printf("\n R = %d, G = %d, B = %d", rgb[0],rgb[1],rgb[2]);

#endif

return cvScalar(rgb[2], rgb[1], rgb[0],0);

}

int main( int argc, char** argv )

{

CvCapture* capture = 0;

IplImage* frame = 0;

if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))

capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );

else if( argc == 2 )

capture = cvCaptureFromAVI( argv[1] );

if( !capture )

{

fprintf(stderr,"Could not initialize capturing...\n");

return -1;

}

printf( "Hot keys: \n"

"\tESC - quit the program\n"

"\tc - stop the tracking\n"

"\tb - switch to/from backprojection view\n"

"\th - show/hide object histogram\n"

"To initialize tracking, select the object with mouse\n" );

//cvNamedWindow( "Histogram", 1 );

cvNamedWindow( "CamShiftDemo", 1 );

cvSetMouseCallback( "CamShiftDemo", on_mouse, NULL ); // on_mouse 自定义事件

cvCreateTrackbar( "Vmin", "CamShiftDemo", &vmin, 256, 0 );

cvCreateTrackbar( "Vmax", "CamShiftDemo", &vmax, 256, 0 );

cvCreateTrackbar( "Smin", "CamShiftDemo", &smin, 256, 0 );

for(;;)

{

int i, bin_w, c;

frame = cvQueryFrame( capture );

if( !frame )

break;

if( !image )

{

/* allocate all the buffers */

image = cvCreateImage( cvGetSize(frame), 8, 3 );

image->origin = frame->origin;

hsv = cvCreateImage( cvGetSize(frame), 8, 3 );

hue = cvCreateImage( cvGetSize(frame), 8, 1 );

mask = cvCreateImage( cvGetSize(frame), 8, 1 );

backproject = cvCreateImage( cvGetSize(frame), 8, 1 );

hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 ); // 计算直方图

histimg = cvCreateImage( cvSize(320,200), 8, 3 );

cvZero( histimg );

}

cvCopy( frame, image, 0 );

cvCvtColor( image, hsv, CV_BGR2HSV ); // 彩色空间转换 BGR to HSV

if( track_object )

{

int _vmin = vmin, _vmax = vmax;

cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),

cvScalar(180,256,MAX(_vmin,_vmax),0), mask ); // 得到二值的MASK

cvSplit( hsv, hue, 0, 0, 0 ); // 只提取 HUE 分量

if( track_object < 0 )

{

float max_val = 0.f;

cvSetImageROI( hue, selection ); // 得到选择区域 for ROI

cvSetImageROI( mask, selection ); // 得到选择区域 for mask

cvCalcHist( &hue, hist, 0, mask ); // 计算直方图

cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 ); // 只找最大值

cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 ); // 缩放 bin 到区间 [0,255]

cvResetImageROI( hue ); // remove ROI

cvResetImageROI( mask );

track_window = selection;

track_object = 1;

cvZero( histimg );

bin_w = histimg->width / hdims; // hdims: 条的个数,则 bin_w 为条的宽度

// 画直方图

for( i = 0; i < hdims; i++ )

{

int val = cvRound( cvGetReal1D(hist->bins,i)*histimg->height/255 );

CvScalar color = hsv2rgb(i*180.f/hdims);

cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),

cvPoint((i+1)*bin_w,histimg->height - val),

color, -1, 8, 0 );

}

}

cvCalcBackProject( &hue, backproject, hist ); // 使用 back project 方法

cvAnd( backproject, mask, backproject, 0 );

// calling CAMSHIFT 算法模块

cvCamShift( backproject, track_window,

cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),

&track_comp, &track_box );

track_window = track_comp.rect;

if( backproject_mode )

cvCvtColor( backproject, image, CV_GRAY2BGR ); // 使用backproject灰度图像

if( image->origin )

track_box.angle = -track_box.angle;

cvEllipseBox( image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 );

}

if( select_object && selection.width > 0 && selection.height > 0 )

{

cvSetImageROI( image, selection );

cvXorS( image, cvScalarAll(255), image, 0 );

cvResetImageROI( image );

}

cvShowImage( "CamShiftDemo", image );

cvShowImage( "Histogram", histimg );

c = cvWaitKey(10);

if( c == 27 )

break; // exit from for-loop

switch( c )

{

case 'b':

backproject_mode ^= 1;

break;

case 'c':

track_object = 0;

cvZero( histimg );

break;

case 'h':

show_hist ^= 1;

if( !show_hist )

cvDestroyWindow( "Histogram" );

else

cvNamedWindow( "Histogram", 1 );

break;

default:

;

}

}

cvReleaseCapture( &capture );

cvDestroyWindow("CamShiftDemo");

return 0;

}

java opencv 视频教程_OpenCV视频目标跟踪示例教程(Meanshift)相关推荐

  1. dlib库包的介绍与使用,opencv+dlib检测人脸框、opencv+dlib进行人脸68关键点检测,opencv+dlib实现人脸识别,dlib进行人脸特征聚类、dlib视频目标跟踪

    文章目录: 1 dlib库介绍 2 dlib人脸检测:绘制出人脸检测框 2.1 dlib人脸检测源码 2.2 opencv + dlib 人脸检测 2.3 dlib人脸检测总结 3 dlib人脸关键点 ...

  2. Java OpenCV 图像处理30 视频分析和对象跟踪 视频读取

    Java OpenCV 图像处理30 视频分析和对象跟踪 视频读取 Java OpenCV-4.0.0 图像处理 视频分析和对象跟踪 视频读取 package com.xu.opencv.video; ...

  3. 漫谈视频目标跟踪与分割

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文整理记录了旷视研究院Detection组针对视频目标跟踪与分割问题的探讨和收获,并从喜闻乐见的图像 ...

  4. 视频目标跟踪从0到1,概念与方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读 从目标跟踪的应用场景,底层模型,组件,类型和具体算法几个方面 ...

  5. TensorFlow知网文章1-TensorFlow平台下的视频目标跟踪深度学习模型设计

    1.TensorFlow平台下的视频目标跟踪深度学习模型设计 刘帆刘鹏远李兵徐彬彬 中国人民解放军军械工程学院四系 视频目标识别与跟踪的本质是在连续视频帧中找到感兴趣的运动目标所处的位置. 现有很多成 ...

  6. 基于均值漂移的视频目标跟踪算法的研究

    背景介绍 计算机视觉作为一门多技术融合的学科,涉及模式识别和视频图像处理等众多领域.基于视频的目标检测与跟踪技术是计算机视觉领域中最主要的研究方向之一,它是智能监控.移动机器人视觉导航以及人机交互等应 ...

  7. 收藏 一文熟悉视频目标跟踪技术

    01 研究背景介绍 近年来,随着大数据.云计算.人工智能等领域日新月异的发展及交互融合,智慧电商.智慧交通.智慧城市等概念越发受到关注.随着人们对更智能.更便捷.更高质量生活的向往,同时伴随着重大的学 ...

  8. CVPR2018已公布关于视频目标跟踪的论文简要分析与总结

    CVPR2018已公布关于视频目标跟踪的论文简要分析与总结 一,A Twofold Siamese Network for Real-Time Object Tracking 论文名称 A Twofo ...

  9. 视频教程-大型Java项目视频教程_王勇老师DRP项目教程完整版292集-Java

    大型Java项目视频教程_王勇老师DRP项目教程完整版292集 动力节点王勇老师,CCTV<影响力对话>栏目特约嘉宾,Java培训知名讲师,中国Java培训领军人物,北京动力节点创始人,董 ...

最新文章

  1. Sublime Text 3 及Package Control 安装(附上一个3103可用的Key)
  2. ASP.NET 打开新窗口几种方法
  3. ML之ME/LF:机器学习中常见模型评估指标/损失函数(LiR损失、L1损失、L2损失、Logistic损失)求梯度/求导、案例应用之详细攻略
  4. JAVA_OA(六):SpringMVC拦截器
  5. 【C语言】第三章 基本运算与顺序结构 题解
  6. MFC为窗口创建线程,以及线程与窗口间的通信
  7. 【Lintcode】076.Longest Increasing Subsequence
  8. Storm中关于Topology的设计
  9. XP引导Ubuntu--Ubuntu手记之系统配置
  10. 监督学习的基本假设——联合概率分布,独立同分布
  11. Mini USB 引脚定义及机械尺寸
  12. 程序员35岁以后干什么?大龄程序员现状揭秘
  13. Linux unison 效率,linux利用unison实现双向或多向实时同步
  14. 2019杭电多校Problem 5 Snowy Smile题解
  15. 如何计算802.11 PHY Data Rate (11ac/11ax)
  16. XMUOJ·纸片选择
  17. css 语音,CSS3新特性一览-- 语音
  18. 标准IP数据包是否保证数据部分的正确性?
  19. 为什么signed char的范围是-128~127
  20. Cadence OrCAD Capture 检索和定位功能的介绍图文视频教程

热门文章

  1. Egg.js搭建后台服务API
  2. RTL8111 Mac版驱动地址
  3. 交叉熵损失函数(softmax分类器)
  4. BCC校验(异或校验)在线计算
  5. 计算机网络---网络层功能概述
  6. c#使用NPOI批量导出数据到excel表格里
  7. 【人工智能】人工智能顶级研究所+人工智能顶级研究机构+人工智能顶级大学推荐!
  8. Linux下脚本对拍
  9. 关于我Camstar的博文
  10. 【2018虚拟现实】VR眼镜不只是当下,它就是未来!不仅是VR小电影和游戏!