yirenonege 发表于 2011-3-23 16:50:29

兔司机教你做个自跟踪摄像头,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=9999

http://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:01:27

本帖最后由 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,论坛改了之后地址变了,可惜不能更新到楼主位置了。提示一下可以用来做太阳能电池板跟踪吆。读书的时候拓展一下知识面,挺好的。毕业了也就没时间了,基本上此贴要说的也就这么多了

yl604922959 发表于 2011-3-23 17:09:09

e....

bad_fpga 发表于 2011-3-23 17:16:22

不错,看看

zy473551 发表于 2011-3-23 17:17:48

回家再看。下班锻炼身体去了!

Ian11122840 发表于 2011-3-23 17:18:05

嘿嘿,高兴的飘过一下~~

renpeng009 发表于 2011-3-23 17:53:09

都是动物头像

wcm_e 发表于 2011-3-23 17:55:47

mark了看

H007 发表于 2011-3-24 22:54:04

mark、改天再看

jrcsh 发表于 2011-3-24 23:12:24

很......悬

59hang 发表于 2011-3-25 07:13:46

不久前买了个可以自动跟踪摄像头,这是它的介绍: Creative WebCam Center是一套功能强大的应用程序,让你可以执行先进的视频应用,例如:远程监控、动态侦测以及间隔摄影等等,并提供了浏览捕捉下来的视频及图片的功能。搭配 WebCam Live! Motion的可移动镜头,左右移动范围达200度;上下移动达105度。------试了效果很一般,

longquan 发表于 2011-3-25 07:42:44

马克#

chess01 发表于 2011-3-25 08:20:01

mark!!

lsw0136 发表于 2011-3-25 08:34:03

mark

wenfeiexe 发表于 2011-3-25 08:50:45

看看

583893280 发表于 2011-3-25 09:37:41

mark

zhuhanliang 发表于 2011-3-25 10:03:51

mark ...

yirenonege 发表于 2011-3-25 15:03:13

回复【15楼】zhuhanliang
-----------------------------------------------------------------------

楼上,提上裤子,注意影响...

andriy 发表于 2011-3-25 16:56:09

貌似蛮有意思的,留名,回头好好研究下。

fy024 发表于 2011-3-25 17:35:02

牛!!

DoDo915 发表于 2011-3-25 18:57:59

Mark

chengluoran 发表于 2011-3-25 19:02:19

mark

121212 发表于 2011-3-25 19:36:41

mark

lixupeng 发表于 2011-3-25 19:55:25

学习!!!!!

yuxuanqq 发表于 2011-3-25 19:55:29

可以下到《学习OPENCV》的原本,呵呵没在这个电脑上,这书很不错,我拜读啦两个月,有了OPENCV,什么CV的问题都能解决。

但是,还有几个很不错的软件哦~ 比如 NI vision。我也常用。还有一个我忘记啦,是机器视觉的最专业的软件。“h”开头的

计算机视觉!

我做过机械仪表的数字化改造,就是把摄像头对到机械仪表盘上,标定之后就能出读书到计算机上录取,精度比眼高,速度比人快建议大家学习一下!

其实这个就和地形匹配有点关系啦。可以结合google 地图 和GPS 再加上地形匹配,我们的四轴可以像战斧一样钻进人家的窗户里

CODE2 发表于 2011-3-25 20:10:07

好吧,这个我承认是打酱油的!

tinwy.zhang 发表于 2011-3-25 20:18:32

mark

gloryzkl 发表于 2011-3-25 20:33:35

mark

sl961102 发表于 2011-3-26 00:01:02

学习一下。

ming076 发表于 2011-3-26 00:16:37

哈哈,这个讲解挺不错的。

EILIANHELL 发表于 2011-3-26 00:20:24

MARK

hubeilcsun3 发表于 2011-3-26 11:53:16

MARK

yywin1986 发表于 2011-3-28 15:30:12

学习

yirenonege 发表于 2011-3-30 10:36:18

http://cache.amobbs.com/bbs_upload782111/files_37/ourdev_626732QKRDI8.JPG
(原文件名:论文内容.JPG)

点击此处下载 ourdev_626733VYSPUJ.zip(文件大小:2.31M) (原文件名:camshift算法部分文献.zip)

wangguanfu 发表于 2011-3-30 10:38:11

昨天碰一牛人买家,这个是他的一些作品。。
http://www.cnblogs.com/yangyangcv/

yirenonege 发表于 2011-3-30 11:26:54

回复【35楼】wangguanfu
-----------------------------------------------------------------------

"对CCV就不做过多介绍了,多点触摸的利器,几乎所有做多点触摸的公司都是直接使用或是间接借鉴了CCV,作为开发者之一鄙人相当自豪啊。"

这个没法比啊,人家专业是这个~~~

zht9961020 发表于 2011-3-30 12:50:47

回复【35楼】wangguanfu
-----------------------------------------------------------------------

这个好像是模板匹配之类的,sift特征匹配等

STC89C55 发表于 2011-3-30 12:54:44

回头学……

rocket13 发表于 2011-3-30 15:42:51

回复【24楼】yuxuanqq
-----------------------------------------------------------------------
你说的那个叫halcon
www.mvtec.com/halcon/

lionliu 发表于 2011-3-30 15:48:11

m

plc_avr 发表于 2011-3-30 16:04:52

mark!!!

cqsgcqsg 发表于 2011-3-30 16:58:50

tang0571 发表于 2011-3-30 17:04:16

貌似很好,mark~

litchijun 发表于 2011-5-24 13:14:55

mark

121212 发表于 2011-5-24 13:34:08

maark

sunmy 发表于 2011-5-24 14:26:11

我承认,我看不懂

lxw2087290 发表于 2011-6-1 14:33:17

MARK

ap0405209 发表于 2011-6-1 16:20:06

GOOD

STM32_Study 发表于 2011-6-1 18:07:32

请教兔斯基,OpenCV 能不能做对焦检测?用于控制镜头的聚焦

summerstar 发表于 2011-6-1 22:01:05

mark!

my_love 发表于 2011-6-2 06:14:58

mark

Adouhm 发表于 2011-6-2 08:40:06

回复【楼主位】yirenonege
-----------------------------------------------------------------------

这个我还真想过!
只是柑橘没什么用啊!

msq-tc 发表于 2011-6-2 08:53:37

好呀

chrisforbt 发表于 2011-8-21 13:21:45

mark

af00 发表于 2011-8-21 13:51:49

不明白,顶了再看

uestc 发表于 2011-8-21 13:58:52

mark

yigang8a 发表于 2011-8-26 20:08:44

mark!!

wisology 发表于 2011-11-21 14:12:41

mark

lilolog 发表于 2011-11-21 18:08:06

创新的那个云台摄像头貌似有sdk可惜太贵了

pcwhy 发表于 2011-11-21 18:46:40

打包拿走。。

ShawnLinson 发表于 2011-11-21 19:32:01

回复【35楼】wangguanfu
昨天碰一牛人买家,这个是他的一些作品。。
http://www.cnblogs.com/yangyangcv/
-----------------------------------------------------------------------

这个太牛X了啊!!

allquestions 发表于 2011-11-21 19:44:43

mark一下

jacky2011 发表于 2011-11-21 19:48:05

顶!!

vcrm 发表于 2011-11-21 20:01:16

这个很有意思的样子,也想自己整一个。。

wpnx 发表于 2011-11-21 23:01:41

mark

ITOP 发表于 2011-11-21 23:16:23

MARK!!

wcm_e 发表于 2011-11-21 23:17:55

牛人

bingshuihuo888 发表于 2011-11-22 08:53:05

maark

at90s 发表于 2011-11-22 09:09:10

mark

changhui0222 发表于 2011-11-22 09:16:59

MK

XYM741 发表于 2011-11-23 12:37:27

好贴!好人~!留个记号!

diguotieji 发表于 2011-11-23 14:04:55

好人啊,不对,应该是好兔子啊,非常感谢

nirvanasyl 发表于 2011-11-24 16:21:34

mark

s-t-m-3-2 发表于 2011-11-24 16:23:38

mark,,,这个是趋势。。。。。

l09046162 发表于 2011-11-24 16:31:17

mark!!!

xslff 发表于 2011-11-24 16:36:33

先留个爪印,以后慢慢学!

kingboy100 发表于 2011-11-24 17:45:23

mark

clogord 发表于 2011-11-24 18:11:20

太好玩了 MARK一下

kihell 发表于 2011-11-24 18:37:40

牛人 MARK

JUNGO 发表于 2011-11-24 19:18:09

都是高手……

chxumengyang 发表于 2011-11-25 08:50:29

好东西啊,学习一下

sufangzhou 发表于 2011-11-28 21:56:09

学习下。。。准备加上个武器系统。。。。

willyi 发表于 2011-12-5 21:06:38

有意思mark

ydy65683 发表于 2012-4-25 19:54:21

很不错 学习一下

hpjywd 发表于 2012-4-26 15:47:57

学习学习

ydy65683 发表于 2012-4-28 15:57:44

lz,你在第5点中说的opencv中的那个例子叫啥啊? 小弟在弄人脸跟踪,只能做到画红圈跟踪人脸,控制摄像头随着转动这块不知道用啥函数代码实现,希望lz能详细指教一下~真心感谢!

hjh198773 发表于 2012-8-29 12:54:30

你的QQ是多少啊?

hjh198773 发表于 2012-8-29 13:56:22

djlakdjlsjdlajljdlajsljla

hjh198773 发表于 2012-8-29 14:08:46

你QQ 是多少啊?

hjh198773 发表于 2012-8-29 15:28:12

你QQ是多少啊?

hjh198773 发表于 2012-8-29 15:28:54

你QQ是多少啊?

hjh198773 发表于 2012-8-29 15:31:00

你QQ 是多少啊?

hjh198773 发表于 2012-8-29 15:31:30

你QQ 多少啊?

laroo0405 发表于 2012-8-29 15:41:06

mark一下

babyhua 发表于 2012-8-29 16:05:51

mark!!!!!!!!!

yirenonege 发表于 2012-8-29 16:08:20

hjh198773 发表于 2012-8-29 15:31 static/image/common/back.gif
你QQ 多少啊?

我现在不搞图像处理了,只是当时有兴趣研究了一下,我以为陈年老帖没人看了,取消回复了。。。主要是修改了OPENCV里面自带的例程,里面有一个摄像头追踪物体的代码,阅读之后找到追踪到后的坐标就可以了 {:victory:}

yirenonege 发表于 2012-8-29 16:09:58

ydy65683 发表于 2012-4-28 15:57 static/image/common/back.gif
lz,你在第5点中说的opencv中的那个例子叫啥啊? 小弟在弄人脸跟踪,只能做到画红圈跟踪人脸,控制摄像头随 ...

很抱歉现在才看到,我记得是安装完opencv安装文件夹里的例程里自带

kxm2008 发表于 2012-8-29 17:07:34

很厉害的大牛

hjh198773 发表于 2012-8-29 17:45:14

载安装好opencv库后可以看到里面有一些例子,其中一个是摄像头跟踪选定物体的应用程序,这个在哪下载啊?
控制云台有源代码吗?
你上面的代码是什么?

hjh198773 发表于 2012-8-29 17:46:43

能不能把这个项目具体的说说下啊?
页: [1] 2
查看完整版本: 兔司机教你做个自跟踪摄像头,0基础入门篇,会51单片机就可以