兔司机教你做个自跟踪摄像头,0基础入门篇,会51单片机就可以
效果图在另一篇帖子里http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4626646&bbs_page_no=1&search_mode=3&search_text=yirenonege&bbs_id=9999http://cache.amobbs.com/bbs_upload782111/files_37/ourdev_624955JFSRK7.jpg
(原文件名:框架.jpg)
源程序找不到了,但是上位机和下位机需要自己写的加起来绝不超过200行,先写这些有问题大家再问吧
1了解什么是模式识别(Pattern Recognition),模式识别简单的说就是分类,把具有相同特征的事物分开;
机器学习(Machine Learning),是使机器自动适应环境的变化,通过不断的反馈调整自身:
机器视觉(machine vision),是机器用摄像头了解世界,解决问题的课题.
图像处理(image processing),要知道图像对机器说来是一个矩阵.举个简单的例子,黑白二值图像中0表示白,1表示黑.
说这些是大家百度 google的时候有关键词,这些课程有的大学本科就有,有的研究生阶段开设,就像高等数学\模电一样是一门学问
2了解现在的应用
http://www-2.cs.cmu.edu/afs/cs/project/cil/ftp/html/vision.html 梅尔卡梅隆大学机器视觉主页
http://www.verycd.com/topics/2727693/该课程前两节给出了不少现实的应用
说这些是告诉大家,不要害怕英文,建议多用google英文版搜索词汇,这个是忠告,因为有的英文文章写的很细,比看中文好多了.
3用到的算法camshift算法,是meanshift算法的派生推广吧,Mean Shift这个概念最早是由Fukunaga等人于1975年在一篇关于概率密度梯度函数的估计的文献
中提出来的(FUKUNAGE K, HOSTETLER L D. The estimation of the gradient of a density function with application in pattern recognition
. IEEE Trans. on Information Theory, 1975,21:32-40.).后来被推广到机器视觉领域.由于收敛速度快,稳定,国话叫鲁棒性.得到广泛应用.
说这些是告诉大家,这个算法的家学渊源,不是某个人突发奇想,一下子完成的,有坚实的理论根基.那篇论文下下来之后,确实会死好些脑细胞,不感兴趣不看
也罢.
4opencv,又intel发起的视觉开源库,基本涵盖了机器视觉的经典算法,霍夫变换,开尔曼滤波,支持向量机等内容.可以说是机器视觉的程序实现.最重要的是它
像linux一样是开源的,在opencv中文网站可以下载的到(http://www.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5)
5下载安装好opencv库后可以看到里面有一些例子,其中一个是摄像头跟踪选定物体的应用程序,在那个文件夹里还有它的源码.大家仔细分析一下就可看出,哪
个数据结构中包含识别的物体的位置.用串口发送控制命令给下位机即可.
6机械部分.电机的种类很多,这里是舵机,舵机是一种位置伺服的电机.通过发送pwm控制电机转动的角度.有电源\地\信号 三根线.淘宝有卖云台的,价格在
100+左右.云台由两舵机和链接部件组成.话说买给我的有颗螺丝根本就没法拧下去,发来的时候有点歪,感觉怪怪的,懒的计较了.下面我用相机拍了几张照片
有兴趣可以看一下舵机内部.清晰到你爽,\(^o^)/.话说到这里,其实用扫描仪扫电路最爽了,淘个二手的100,玩够了再100卖了
7 将摄像头绑定在云台上,好吧,你找到物体的坐标了和控制电机的方法了,那就那就随便写点简单的程序让摄像头中被追踪的物体始终处于视野中心吧 : )
8 <<学习opencv>>千万不要买中文版的看下图你就知道了,看了中文的你会越看越糊涂
------------------------------------谜一样的分割线------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_37/ourdev_624841I6NRHU.jpg
中文的翻译,书上是我的专用书注符号,大家别介意 (原文件名:译文.jpg)
http://cache.amobbs.com/bbs_upload782111/files_37/ourdev_624842CXGLOW.jpg
英文原文,话说清华出版社纸张和东南没法比啊 (原文件名:原文.jpg)
http://cache.amobbs.com/bbs_upload782111/files_37/ourdev_624843XVAM4W.jpg
好吧,都比我牛,也许我看错了 (原文件名:前言.jpg)
点击此处下载 ourdev_624844K9D1PB.rar(文件大小:6.38M) (原文件名:舵机分解图.rar) 本帖最后由 yirenonege 于 2012-8-29 17:36 编辑
#ifdef _CH_
#pragma package <opencv>
#endif
#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <ctype.h>
#endif
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;
CvConnectedComp track_comp;
int hdims = 16;
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* 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;
break;
}
}
CvScalar hsv2rgb( float hue )
{
int rgb, p, sector;
static const int sector_data[]=
{{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] = 255;
rgb] = 0;
rgb] = p;
return cvScalar(rgb, rgb, rgb,0);
}
int main( int argc, char** argv )
{
CvCapture* capture = 0;
if( argc == 1 || (argc == 2 && strlen(argv) == 1 && isdigit(argv)))
capture = cvCaptureFromCAM( argc == 2 ? argv - '0' : 0 );
else if( argc == 2 )
capture = cvCaptureFromAVI( argv );
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, 0 );
cvCreateTrackbar( "Vmin", "CamShiftDemo", &vmin, 256, 0 );
cvCreateTrackbar( "Vmax", "CamShiftDemo", &vmax, 256, 0 );
cvCreateTrackbar( "Smin", "CamShiftDemo", &smin, 256, 0 );
for(;;)
{
IplImage* frame = 0;
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 );
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 );
cvSplit( hsv, hue, 0, 0, 0 );
if( track_object < 0 )
{
float max_val = 0.f;
cvSetImageROI( hue, selection );
cvSetImageROI( mask, selection );
cvCalcHist( &hue, hist, 0, mask );
cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );
cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );
cvResetImageROI( hue );
cvResetImageROI( mask );
track_window = selection;
track_object = 1;
cvZero( histimg );
bin_w = histimg->width / hdims;
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 );
cvAnd( backproject, mask, backproject, 0 );
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 );
if( image->origin )
track_box.angle = -track_box.angle;
cvEllipseBox( image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 ); //cvEllipseBox是画一个椭圆的函数,我记得应该有中心点的位置,要看opencv函数的原型
}
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( (char) c == 27 )
break;
switch( (char) 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;
}
#ifdef _EiC
main(1,"camshiftdemo.c");
#endif我安装的是1.0版本的opencv 在C:\Program Files\OpenCV\samples\c里有一个可执行的程序camshiftdemo.exe,你要有摄像头就能运行,里面还有它的源代码。当年吵得沸沸扬扬的绿坝里,骗取人民大量税收的大骗子用的是这个开源的视觉处理库。。。另外串口部分,用windows 或者是linux下的串口程序就好了,反正都是大家熟悉的c语言。 至于控制部分,我是把图像分成9个区,跟踪的物体的坐标落在哪个区域里了判断出来发给单片机就行了
//cvEllipseBox是画一个椭圆的函数,我记得应该有中心点的位置的参数,要看opencv官方提供的函数的原型的解释。
图像处理识别不是电子工程师不可触及的雷区,理解了他们的含义调用起来。希望有志于此的本科生学好数学,考研继续研究,也就是好多人疑问要不要读研究生,工作经验不是更好。像这种相对专业的东西,基本上都是得花时间专门搞的,那时候就是写库给别人用的层次了。{:titter:}
此处是当时的效果图,http://www.amobbs.com/thread-4626646-1-1.html,论坛改了之后地址变了,可惜不能更新到楼主位置了。提示一下可以用来做太阳能电池板跟踪吆。读书的时候拓展一下知识面,挺好的。毕业了也就没时间了,基本上此贴要说的也就这么多了 e.... 不错,看看 回家再看。下班锻炼身体去了! 嘿嘿,高兴的飘过一下~~ 都是动物头像 mark了看 mark、改天再看 很......悬 不久前买了个可以自动跟踪摄像头,这是它的介绍: Creative WebCam Center是一套功能强大的应用程序,让你可以执行先进的视频应用,例如:远程监控、动态侦测以及间隔摄影等等,并提供了浏览捕捉下来的视频及图片的功能。搭配 WebCam Live! Motion的可移动镜头,左右移动范围达200度;上下移动达105度。------试了效果很一般, 马克# mark!! mark 看看 mark mark ... 回复【15楼】zhuhanliang
-----------------------------------------------------------------------
楼上,提上裤子,注意影响... 貌似蛮有意思的,留名,回头好好研究下。 牛!! Mark mark mark 学习!!!!! 可以下到《学习OPENCV》的原本,呵呵没在这个电脑上,这书很不错,我拜读啦两个月,有了OPENCV,什么CV的问题都能解决。
但是,还有几个很不错的软件哦~ 比如 NI vision。我也常用。还有一个我忘记啦,是机器视觉的最专业的软件。“h”开头的
计算机视觉!
我做过机械仪表的数字化改造,就是把摄像头对到机械仪表盘上,标定之后就能出读书到计算机上录取,精度比眼高,速度比人快建议大家学习一下!
其实这个就和地形匹配有点关系啦。可以结合google 地图 和GPS 再加上地形匹配,我们的四轴可以像战斧一样钻进人家的窗户里 好吧,这个我承认是打酱油的! mark mark 学习一下。 哈哈,这个讲解挺不错的。 MARK MARK 学习 http://cache.amobbs.com/bbs_upload782111/files_37/ourdev_626732QKRDI8.JPG
(原文件名:论文内容.JPG)
点击此处下载 ourdev_626733VYSPUJ.zip(文件大小:2.31M) (原文件名:camshift算法部分文献.zip) 昨天碰一牛人买家,这个是他的一些作品。。
http://www.cnblogs.com/yangyangcv/ 回复【35楼】wangguanfu
-----------------------------------------------------------------------
"对CCV就不做过多介绍了,多点触摸的利器,几乎所有做多点触摸的公司都是直接使用或是间接借鉴了CCV,作为开发者之一鄙人相当自豪啊。"
这个没法比啊,人家专业是这个~~~ 回复【35楼】wangguanfu
-----------------------------------------------------------------------
这个好像是模板匹配之类的,sift特征匹配等 回头学…… 回复【24楼】yuxuanqq
-----------------------------------------------------------------------
你说的那个叫halcon
www.mvtec.com/halcon/ m mark!!! 顶 貌似很好,mark~ mark maark 我承认,我看不懂 MARK GOOD 请教兔斯基,OpenCV 能不能做对焦检测?用于控制镜头的聚焦 mark! mark 回复【楼主位】yirenonege
-----------------------------------------------------------------------
这个我还真想过!
只是柑橘没什么用啊! 好呀 mark 不明白,顶了再看 mark mark!! mark 创新的那个云台摄像头貌似有sdk可惜太贵了 打包拿走。。 回复【35楼】wangguanfu
昨天碰一牛人买家,这个是他的一些作品。。
http://www.cnblogs.com/yangyangcv/
-----------------------------------------------------------------------
这个太牛X了啊!! mark一下 顶!! 这个很有意思的样子,也想自己整一个。。 mark MARK!! 牛人 maark mark MK 好贴!好人~!留个记号! 好人啊,不对,应该是好兔子啊,非常感谢 mark mark,,,这个是趋势。。。。。 mark!!! 先留个爪印,以后慢慢学! mark 太好玩了 MARK一下 牛人 MARK 都是高手…… 好东西啊,学习一下 学习下。。。准备加上个武器系统。。。。 有意思mark 很不错 学习一下 学习学习 lz,你在第5点中说的opencv中的那个例子叫啥啊? 小弟在弄人脸跟踪,只能做到画红圈跟踪人脸,控制摄像头随着转动这块不知道用啥函数代码实现,希望lz能详细指教一下~真心感谢! 你的QQ是多少啊? djlakdjlsjdlajljdlajsljla 你QQ 是多少啊? 你QQ是多少啊? 你QQ是多少啊? 你QQ 是多少啊? 你QQ 多少啊? mark一下 mark!!!!!!!!! hjh198773 发表于 2012-8-29 15:31 static/image/common/back.gif
你QQ 多少啊?
我现在不搞图像处理了,只是当时有兴趣研究了一下,我以为陈年老帖没人看了,取消回复了。。。主要是修改了OPENCV里面自带的例程,里面有一个摄像头追踪物体的代码,阅读之后找到追踪到后的坐标就可以了 {:victory:} ydy65683 发表于 2012-4-28 15:57 static/image/common/back.gif
lz,你在第5点中说的opencv中的那个例子叫啥啊? 小弟在弄人脸跟踪,只能做到画红圈跟踪人脸,控制摄像头随 ...
很抱歉现在才看到,我记得是安装完opencv安装文件夹里的例程里自带 很厉害的大牛 载安装好opencv库后可以看到里面有一些例子,其中一个是摄像头跟踪选定物体的应用程序,这个在哪下载啊?
控制云台有源代码吗?
你上面的代码是什么? 能不能把这个项目具体的说说下啊?
页:
[1]
2