Learning OpenCV

2009.09.08

What Is New?

20100128

今天可以是学习的辛苦啊,一直学习到这个时候(03:35),不过虽然很辛苦.但是看着自己一页一页的笔记,很是欣慰.

还有几页,第十章的内容就看完了.下一步准备跳过12,13章,看第14章的Mechine Learning,因为这章我感觉还和验证码的识别有些关系,至于11章(Camera Models and Calibration)和12章(Projection and 3D Vision)貌似和验证码识别关系不大,既然现在的时间不是很充裕.那就把这些不相关的章节略去.直接学习些有用的吧.

Show图:

书上是这么解释的:

“We’l write a program (Example 10-2) whose output will show the car circling around (in red) as well as the measurement we make (in yellow) and the location predicted by the Kalman filter (in white).”

20100127

好几天荒废的学业,今天又重新拾起.看了两个小节的书,抄写了两个示例程序

现在学习的主要是动作跟踪判断和识别之类的东西.

有图有真相:

上图是Motion Template(运动模型)对手的方向进行跟踪的效果.

上图为应用Horn-Schunck方法处理的Optical Flow(光流)结果.

20100124

从”昨天”晚上开始学习Optical Flow(光流)部分,这个倒是慢慢扣就可以的.

但是想自己用OpenCV画一个箭头形状的线都算不好它们之间的三角函数关系.头晕啊.学习了这么长时间的OpenCV和数学,居然连这个都做不了.真是无奈啊!!!

Pyramid Lucas-Kanade optical flow example:

20100121

第九章的学习任务基本完成.目前不准备做课后的习题了,为了赶进度,明日学习下一章的内容!

今天的示例程序的输出图,最后结果前一帧:

Delaunay处理的结果

上图中,黑色线为Delaunay Triangulation处理的效果,绿色线为Voronoi Tesselation处理的效果.

最后结果很想教堂的窗户.(龟裂的效果)

最后的效果其实就是把第一个图绿色线圈起来的部分填充上随机的颜色.(程序中随机参数没有完全设置好,每次产生的都是同样的图形和颜色)

20100120

完成三个小节的学习:

  1. Watershed Algorithm
  2. Image Repair by Inpainting
  3. Mean-Shift Segmentation

那个”分水岭算法”的演示程序之前一直没有看明白,今天无意中发现原来是这么用的.真的好无奈.

再有就是那个所谓的图像修复技术,感觉实在是有些简单.只能马马虎虎的”修复”一下:

最后一个Mean-Shift Segmentation(均值漂移分割)感觉貌似有用,但,也就仅限于使用函数,具体用在何种场合现在还是闹不清楚.参数:cvPyrMeanShiftFiltering( img, dst, 20, 40, 1 );

20100119

真是郁闷,编写了N多行,最后提示连接错误.

外加前几天编写的一并统计.共6个文件885行.

给你几个截图吧:

上面那个图是Background Averaging背景减去法处理后的结果.

上面的是cvRunningAvg函数处理后的结果,图中间的那个是”累加”处理的结果,会有一种飘逸的效果.

至于CodeBook法,由于编译链接的时候有错误显示,所以没有办法截图.见谅.

20100112

两个月来又一次开始OpenCV的学习,感觉有些生疏.

今天写的是一个视频帧相减的程序,如图:

20091105

这几天其实没有什么进度,关键是OpenCV这个书后面章节的内容已经超出了我的学习能力范围.大多是一些数学公式的推导.而且由于我的数学基础不行,再加上这些东西的内容艰深.导致进度缓慢.

这不,昨天看了一些”卷积(Convolution)”的部分内容,今天就做了一个小的测试.关于使用cvFilter2D(IplImage* src, IplImage* dst, const CvMat* kernel, CvPoint anchor=cvPoint(-1, -1) );这个函数的.其中的那个矩阵(Martix),通过这两天的学习,我找到了一个3*3的矩阵:

[ 0 0 0 ]

[ 1 0 -1]

[ 0 0 0 ]

利用这个可以做出如下效果:

Ch6 Test Convolution (关于卷积的处理)

20091103

晚上无聊没事.还把之前一直想做的一个OpenCV的”Project”做了一些.就是一个通过Trackbar来控制RGB三色显示颜色的程序, 输出颜色倒是挺简单,关键是那个显示颜色属性的字.比如白色是”FFFFFF”,黑色是”000000″,但是就是这个让我做了半天,因为 Trackbar的Value是int型的,我现需要的是大写十六进制的输出.所以有些难.

但是还好,用了一个相对比较笨的方法实现了输出.是反色输出颜色属性.如图:

Select_Color 的输出.

那个”123456″是我特意选择出来的,是十六进制的表示.即代表:(R,18; G,52; B,86).相对来说还是比较简单的.

20091102

今天又做了两个练习分别是5-11,5-12.

其中5-11做的是cvPyrSegmentation()函数的处理.不过这个函数到底是怎么来的,我还真的不太明了.现在只知道照着代码敲.明天再研究一下.

Exercise_5_11练习的cvPyrSegmentation()函数处理效果

而5-12也不太难,就是把代码抄一下.不过那个IplImage*数组生成及销毁(Release)还是有点意思.下面是两个不同的处理版本,关于阀值处理的.

第一个是cvThreshold()处理效果(其中:Threshold:128, Max_value: 255, 而那个threshold_type分别为:

  • CV_THRESH_BINARY
  • CV_THRESH_BINARY_INV
  • CV_THRESH_TRUNC
  • CV_THRESH_TOZERO_INV
  • CV_THRESH_TOZERO

Exercise_5_12 cvThreshold()函数处理后的效果

第二个是cvAdaptiveThreshold()函数处理的效果,但是Threshold_type只能使用CV_THRESH_BINARY和CV_THRESH_BINARY_INV两个类型.

Exercise_5_12 cvAdaptvieThreshold()函数处理结果

20091101

做第五章练习,有个题目居然没有看懂.无奈自己的英语水平.

跳过去这个,下一个题目的截图,关于cvResize()和cvPyrDown()对图片缩小差异的题目.我估计cvPyrDown()对对图片使用了高斯模糊处理(默认参数:IPL_GAUSSIAN_5x5),所以缩小的图像看起来有些”模糊”的感觉.而cvResize()函数的默认处理参数为:CV_INTER_LINEAR.Show图大家看:

Exercise_5_10

20091030

明天就要返校了.估计这也是我最后的更新了.到了学校再说吧!

做了两个练习:Exercise 5.7和Exercise 5.8.

Exercise_5_7

下面的这个就是模仿”Sapce”了.这也是我刚刚完成的”Project”的想法来源.不过…

Exercise_5_8

不过我的这个Project是动态的.没有办法上传截图.(其实截图看不出来什么,之所以是动态的,是因为利用了人眼的”误差”).

(Space&Stars.截图略)

20091029

昨天晚上开始,做些练习.第五章的.

也不知道怎么的,突然就又想起来做练习了.记得前几天放假的时候做过一些.感觉不错,现在又找到这样的感觉.

主要是Exercise 5.6花费的时间比较长.Exercise 5.5还好说一点.不过通过做5.6倒是有把cvFloodFill又学习了一遍.上回看的时候没有太看仔细.现在反过来看,一下子就明白了不少.同时感觉自己的英文水平还是真的差的太多.还需要继续努力学习啊!

Exercise 5.5 Take a picture of a scene:

Exercise_5_5

Exercise 5.6 Create a clean mask from noise:

Exercise_5_6

20091026

晚上没有事情做.还是做做OpenCV,但是练习现在也没有心情做.

那就做一个自己以前想起来做的东西.一个Canny的处理程序:

Best Threshold

其实,这个东西原本想用于此处:

QQ_Captcha

20091021

发现,复课以后很难再安心学习.每天也就是应付功课一样写一些代码.

不过我想,这种情况还要继续.那就这样吧.

20091020

晚上写了一个示例程序.做的是图像某个线的RGB值的输出.截图就不做了.YY吧,

20091019

今天虽然说是开始上课了.但是由于是星期一,没有太多的课,还是比较清闲的.上午看的是VC++那本教材,下午就是做的OpenCV,完成了第四章练习的第八题.同时还做了一个第五章的一个题.比较简单.

昨天的题:

Exercise_4_8

下面的图像,是题目要求做出来.有些恐怖,那个白色的骷髅是我画出来的.

在网上找来半天也没有找到合适的.后来也就自己做了一个:skull.jpg

Exercise_4_8_skull

下面的是今天做的第五章习题.

Exercise_5_4

20091018

下面的是Exercise 4.6的截图,上面的字符都是”打”上去的.注意那个”meiyou.org”还有”192.168.157.19″.

Exercise 4-6的截图

Perspective Transformation的截图:

Exercise 4-7

最后其实还有一个人脸识别的练习.但是现在还没有弄好,所以暂时不更新截图.

20091017

昨天的练习一直做到凌晨.一个图片信息提取程序.如图:

Exercise_4_3

其他的,也有一些,现在上传上来:

Exercise 3-5

Exercise_3_6

下面这张比较恐怖…(我不是故意的,这是产生一个MASK后处理的效果)

Exercise_3_7

今天做的小程序截图:

Exercise_4_4

20091015

这几天没有敲代码.今天特意做一些习题.第二章和第三章.

cvCircle&cvCreateMatcvPtr2D

Exercise 5

20091014

上午把第八章看完,下午和晚上就是查一下不会的单词.

终于有时间把第八章看完,明天继续第九章的学习.自己给自己加油!

20091013

看来清闲的一天也不能清闲.一天除了上午还查了一下昨天看书的单词外其他的就没有看太多.

小失落.

20091012

今天是软件学院封校不上课第一天,预订计划是停课一周.那么这周主要看一些OpenCV的知识.

本来OpenCV的这个课本都是英语,看起来很费劲.现在可以沉下心来做些事情.

Ex_8_2

Example 8 3:cvDrawContours应用举例

20091009

这几天很少看OpenCV了,因为功课毕竟还是不能耽误的.

不过由于明天是星期六,事情不太多.所以晚上还是有时间看看我的OpenCV.今天就没有编写什么程序了.只是看书.已经看到了Chapter 8: Contours(轮廓),第234页.

20091007

看书,写代码.不过现在由于内容比较艰深已经看不懂太多.只能为了看而看.为了写而写.

template matching 处理结果

20091006

晚上把代码敲了一下,真多,一个文件居然有158行.呵呵.调试就费老劲了.

Example 7-3 输出结果截图

20091004

昨天编写了一些代码,但是由于时间原因没有更新,其实就是一些变换一个是Affine Transform,另一个是Perspective Transfrom.如图:

cvWarpAffine

cvGetPerspectiveTransform

Log-polar Transform Example

由于第六章剩下的内容已经超过我的数学认知范围,所以我还是选择先跳过这些章节.直接看第七章:Histogram and Matching.

Histogram处理结果图

20091002

今天看了一下Hough转换的一些知识,主要是Line和Circle的识别.如图:

cvHoughLines2

cvHoughCirlcles

20091001

今天学习了两个函数:cvLaplace和cvCanny.具体效果如图:

cvLaplace

cvCanny函数处理后的效果

上面那个效果我感觉特别棒!因为我原本学习OpenCV的目的就是用来处理验证码信息的,现在看来我是学对方向了.真的,上面的那个效果一下子就把我震撼了.(处理函数为:cvCanny( src, dst, 500, 1000, 3 );

OpenCV真是太强了!

20090930

今天终于进行到了第六章: Image Transforms,然后练习了两个函数:cvCopyMakeBorder和cvSobel,效果如图:

cvCopyMakeBorder函数的处理结果,连个不同参数

cvSobel处理后的效果,比较恐怖.

然后又实现了一个Resize函数,效果如下(大小都一样,但是所用的interpolation不一样,分别为:CV_INTER_NN,CV_INTER_LINEAR,CV_INTER_AREA,CV_INTER_CUBIC

使用cvResize函数处理出来的Tower,净月潭的了望塔

20090926

做了第五章后面的练习题.头三个题目还是很简单的.就是堆砌代码.上图:

不同格式的cvSmooth()函数结果

20090923

今天学习的是Threshold(阀值化)部分,就是现实一个黑白图像,但是应该是只有”黑”,”白”两色.还是看图实在:

cvPyrSegmentation处理后的结果.

cvThreshold处理后的结果.

cvAdaptiveThreshold与cvThreshold的对比

20090922

今天晚上研究了一下”Image Morphology”,也就是图像形态学.Show图:

cvErode函数与cvDilate函数的测试

几种不同的Kernel的对比

20090919

晚上写了一些东西,主要是书上的示例函数的实现.发现一些问题,CV_BILATERAL无法使用.明天再研究一下!

OpenCV Image Processing cvSmooth Function

20090917

最近几天也没有往后看,一直在编写107的练习题目,发现图像编程也挺有意思的.

还是写一些代码实在!

获取坐标及RGB值,如图:

背景图片是入江纱绫

20090915

今天忙一天的编程比赛.晚上才有一些时间来写OpenCV的程序,还挺有意思的.

20090914

昨天晚上编写了一个可以在一个图片上显示三个图像的程序.为了编写它,折腾了我一下午和一晚上.不过效果还可以.看图:

three in one

20090912

还是更新的昨天的.

20090911

昨天晚上编写的代码由于没有时间来上传,现在上传上来,主要是第三章的矩阵处理技术.

20090909

Show some captures of my OpenCV Example works.

OpenCV_Me

OpenCV_Tabels

Coding Every Day

Chapter 2: Introduction to OpenCV

20090908:(6 Files, 143 Lines)

20090909:(4 Files, 151 Lines)

20091015:(1 File, 79 Lines)

Chapter 3: Getting to Know OpenCV

20090910:(8 Files, 178 Lines)

20091015:(3 Files, 97 Lines)

20091016:(4 Files, 151 Lines)

Chapter 4: HighGUI

20090910:(1 File, 24 Lines)

20090913:(5 Files, 393 Lines)

20090915:(1 File, 70 Lines)

20090916:(2 Files, 269 Lines)

20091016:(1 File, 145 Lines)

20091017:(1 File, 98 Lines)

20091018:(3 Files, 360 Lines)

Chapter 5: Image Processing

20090919:(1 File, 54 Lines)

20090922:(2 Files, 146 Lines)

20090923:(4 Files, 164 Lines)

20090926:(4 Files, 159 Lines)

20091019:(1 File, 57 Lines)

20091028:(2 Files, 137 Lines)

20091029:(3 Files, 130 Lines)

20091101:(1 File, 71 Lines)

20091102:(2 Files, 111 Lines)

Chapter 6: Image Transforms

20090930:(3 Files, 148 Lines)

20091001:(2 Files, 75 Lines)

20091002:(2 Files, 101 Lines)

20091003:(2 Files, 97 Lines)

20091004:(1 File, 40 Lines)

20091105:(1 File, 48 Lines)

Chapter 7: Histograms and Matching

20091004:(1 File, 67 Lines)

20091006:(1 File, 158 Lines)

20091007:(1 File, 49 Lines)

Chapter 8: Contours

20091009:(0 File, 0 Line)

20091012:(2 Files, 100 Lines)

20091014:(0 File, 0 Line)

Chapter 9: Image Parts and Segmentation

20091020:(1 File, 49 Lines)

20091021:(2 Files, 111 Lines)

20100112:(1 File, 55 Lines)

20100119:(6 Files, 885 Lines)

20100120:(3 Files, 230 Lines)

20100121:(1 File, 149 Lines)

Chapter 10: Tracking and Motion

20100124:(2 Files, 158 Lines)

20100127:(2 Files, 233 Lines)

20100128:(1 File, 96 Lines)

Coding Lines

20100128

Total: 99 Files,6418 Lines. (Add 1 File, 96 Lines)

20100127

Total: 98 Files,6322 Lines. (Add 2 Files, 233 Lines)

20100124

Total: 96 Files,6089 Lines. (Add 2 Files, 158 Lines)

20100121

Total: 94 Files,5931 Lines. (Add 1 File, 149 Lines)

20100120

Total: 93 Files,5782 Lines. (Add 3 Files, 230 Lines)

20100119

Total: 90 Files,5552 Lines. (Add 5 Files, 885 Lines)

20100112

Total: 84 Files,4667 Lines. (Add 1 File, 55 Lines)

20091105

Total: 83 Files,4612 Lines. (Add 1 File, 48 Lines)

20091103

Total: 82 Files,4564 Lines. (Add 1 File, 120 Lines)

20091102

Total: 81 Files,4444 Lines. (Add 2 Files, 111 Lines)

20091101

Total: 79 Files,4333 Lines. (Add 1 File, 71 Lines)

20091029

Total: 78 Files,4262 Lines. (Add 4 Files, 221 Lines)

20091028

Total: 74 Files,4041 Lines. (Add 2 Files, 137Lines)

20091025

Total: 72 Files,3904 Lines. (Add 2 Files, 171 Lines)

20091021

Total: 70 Files,3733 Lines. (Add 2 Files, 111 Lines)

20091020

Total: 68 Files,3622 Lines. (Add 1 File, 49 Lines)

20091019

Total: 67 Files,3573 Lines. (Add 1 File, 57 Lines)

20091018

Total: 66 Files,3516 Lines. (Add 3 Files, 360 Lines)

20091017

Total: 63 Files,3156 Lines. (Add 1 File, 98 Lines)

20091016

Total: 62 Files,3058 Lines. (Add 5 Files, 296 Lines)

20091015

Total: 57 Files,2762 Lines. (Add 4 Files, 176 Lines)

20091012

Total: 53 Files,2586 Lines. (Add 2 Files, 100 Lines)

20091007

Total: 51 Files,2486 Lines. (Add 1 File, 49 Lines)

20091006

Total: 50 Files,2437 Lines. (Add 1 File, 158 Lines)

20091004

Total: 49 Files,2279 Lines. (Add 2 Files, 107 Lines)

20091003

Total: 47 Files,2172 Lines. (Add 2 Files, 97 Lines)

20091002

Total: 45 Files,2075 Lines. (Add 2 Files, 101 Lines)

20091001

Total: 43 Files,1974 Lines. (Add 2 Files, 75 Lines)

20090930

Total: 41 Files,1899 Lines. (Add 3 Files, 148 Lines)

20090926

Total: 38 Files,1751 Lines. (Add 4 Files, 159 Lines)

20090923

Total: 34 Files,1592 Lines. (Add 4 Files, 164 Lines)

20090922

Total: 30 Files,1428 Lines. (Add 2 Files, 146 Lines)

20090919

Total: 28 Files,1282 Lines. (Add 1 File, 54 Lines)

20090917

Total: 27 Files,1228 Lines. (Add 2 Files, 269 Lines)

20090915

Total: 25 Files,959 Lines. (Add 1 File, 70 Lines)

20090914

Total: 24 Files,889 Lines. (Add 5 Files, 393 Lines)

20090912

Total: 19 Files,496 Lines. (Add 1 File, 24 Lines)

20090911

Total: 18 Files,472 Lines. (Add 8 Files, 178 Lines)

20090909

Total: 10 Files,294 Lines. (Add 4 Files, 151 Lines)

20090908

Total: 6 Files, 143 Lines. (Add 6 Files, 143 Lines)

文章地址:http://meiyou.org/2009/09/learning-opencv/

21 条留言我要留言 »

  •   1 - 开心凡人  |  2009-12-10 at 22:26  

    逛呀逛,拜访到这啦呵呵

  •   2 - wbd_tmd  |  2010-04-07 at 20:32  

    hello
    我也正看这个呢,但后面的练习题不会做,能给我看一下你第四章的课后练习题的代码吗?O(∩_∩)O~
    如果可以的话能发到我的邮箱吗!
    wbd_tmd@163.com
    不胜感激。。。\(^o^)/~

    郭一实 |  2010-04-14 at 12:25  

    @wbd_tmd, 我的《Learning OpenCV》代码在Google Code上的地址:http://code.google.com/p/guoyishi-works/source/browse/#svn/trunk/Learning%20OpenCV

  •   3 - xiaofevg  |  2010-06-25 at 19:46  

    你好!我刚学OPENCV 有好多不懂,你有第四章课后练习的代码吗?能否给我参考一下?我的邮箱是xiaofevg@163.com;不甚感激!

    xiaofevg |  2010-06-25 at 19:48  

    @xiaofevg, 说错了 不是第四章是第三章的!

  •   4 - xiaofevg  |  2010-06-27 at 10:50  

    郭同学:你好,关于cvSubS函数,书上说:如果mask!=0时dst(I)=src(I)-value。但默认的mask是等于0的,这时dst(I)又等于什么呢?;一直对许多函数中的mask不理解,不知道它的作用,不知道它对函数返回值或者函数作用的有什么影响! 你能否给我讲解一下,最好是举几个例子!希望你能为我解答!不甚感激!

    郭一实 |  2010-06-27 at 19:58  

    @xiaofevg, 其实mask就像是一个“面膜”,也就是说,只有当这个面膜有东西才会有效果,比如一般的面膜都会把眼睛和鼻子露出来,因此这些区域就不会对皮肤反应,也就是不起作用。
    在这里也是一样,比如cvSubS函数中的mask项,当mask的像素值不为0的时候才进行减法操作,不然当为0的时候不进行运算(这种情况下是针对一个像素来说的,同时这时mask是有值的)。在默认情况下,mask的值是NULL也就是空。而如果没有这个mask值赋过来,默认对这个src进行运算(这种情况下mask为空,是在“整体“的范围内说的,而不是一个像素)。
    看我在“20091030“写的内容,类似骷髅的概念。
    希望你能明白。再联系。
    (P.S.最近评论功能不是太好用,所以之前的回复没有及时显示。不好意思。)

  •   5 - xiaofevg  |  2010-06-27 at 22:43  

    你的意思是说,设定mask是对像素进行运算,而在默认的时候,是对整体进行运算?设定mask的时候,mask指定的部分也就是非零的部分才会参与运算,而mask为0的部分不参与运算?这么理解对吗?
    另外,我能问你一个题外话吗?你真仅仅是大二的学生吗?看你两年时间不到,学了这么多东西,而且看你写程序的风格,怎么看都像是一个拥有多年编程经验的老手啊!真是不可思议啊!我现在研一了,看着你的程序,看你做的课后练习,我真是自惭形秽啊!

    郭一实 |  2010-06-28 at 02:49  

    @xiaofevg, 针对第一个问题:是的,我是这样的认为的,而且看标准文档也是如此理解的。
    至于第二个问题,我确实是大二的学生。不过我认为在网络上牛人很多,我现在就是感觉自己和他们还有很大的差距,奋力急追才是。
    与君共勉。

  •   6 - xiaofevg  |  2010-06-28 at 08:34  

    嗯!现在牛人确实是很多啊!山外有山,人外有人!奋力直追吧!
    另外,十分感谢你的解答!

  •   7 - xiaofevg  |  2010-06-28 at 13:43  

    郭同学:在你的练习4——2,你获取像素点的BGR值是不是有点问题呢?
    int B = data[point.x * step + point.y + 0];
    int G = data[point.x * step + point.y + 1];
    int R = data[point.x * step + point.y + 2];
    我感觉应该是:
    int B = data[point.x * step + point.y*3 + 0];
    int G = data[point.x * step + point.y*3 + 1];
    int R = data[point.x * step + point.y*3 + 2];
    point.y应该还要乘以通道数;

    郭一实 |  2010-06-28 at 17:26  

    @xiaofevg, 不好意思,我确实是写错了。
    应该是:

    	int B = data[point.y * step + point.x * 3 + 0];
    	int G = data[point.y * step + point.x * 3 + 1];
    	int R = data[point.y * step + point.x * 3 + 2];

    参考:[1]

  •   8 - xiaofevg  |  2010-07-01 at 11:20  

    郭同学,你好!我在理解随机数生成函数上有些问题,拿cvRandArr()来说。给一个数组填充数是否可以理解为下面几个步骤:
    1,定义随机数生成器;另外,cvRNG(seed)里的seed也一直没理解它的作用。
    2,初始化,这里我们利用cvRandInit()函数,这个主要是做什么的呢?
    3,给数组填充随机数,也就是利用cvRandArr()函数,在这个函数里的param1,param2对于均匀分布而言不就是指上界和下界吗?我在填充一个32位浮点单通道的2维数组时,为什么生成的随机数都是0呢?我是这么设置的,你看看有什么问题?

      CvRNG rng_state=cvRNG(1);
      CvMat* location=cvCreateMat(100,1,CV_32FC1);
      cvRandArr(&rng_state,location,CV_RAND_NORMAL,cvRealScalar(100),cvRealScalar(30));
      float* ptr=(float*)(location->data.ptr);
      for(int i=0;i<100;i++) {
        printf("%f\n",ptr[i]); 
      }

    郭一实 |  2010-07-01 at 16:36  

    @xiaofevg
    对于第一个问题,因为现在使用函数生成的随机数都是伪随机数,所以“种子”的含义就是计算出下一个值的起始值。比如下面的公式:

    rand_num = ( rand_num + X ) * Y % Z;

    第一次启动函数,就要把seed的值赋给rand_num,下一次再使用上次算出来的值作为种子计算。[参考:1]
    对于第二个问题,就是就CvRandState这个结构进行初始化,比方说可以选择两种分布类型:CV_RAND_UNI和CV_RAND_NORMAL类型,不过这个函数官网没有介绍。[参考:1 2 3]
    对于第三个问题,你的代码好像不是均匀分布的吧,应该是正态分布(CV_RAND_NORMAL)的代码。
    同时,你的代码在我的机子下编译通过,结果正常。
    我给你看看我的代码,你看看能用不能:

    #include <iostream>
    #include <cv.h>
    #include <highgui.h>
     
    using namespace std;
     
    const int pointCount = 1000;
     
    int main( int argc, char** argv ) {
      CvRNG rng_state = cvRNG( 1 );
      CvMat* values = cvCreateMat( pointCount, 1, CV_32FC1 );
      cvRandArr( &rng_state,
                 values,
                 CV_RAND_NORMAL,
                 cvRealScalar(100),
                 cvRealScalar(50)
               );
      for ( int i = 0; i < pointCount; ++i ) {
        float value = *(float*)cvPtr1D( values, i, 0 );
        cout << value << "\t";
      }
      cout << endl;
     
      return 0;
    }

    [参考:1]

  •   9 - xiaofevg  |  2010-07-01 at 19:30  

    十分感谢你的解答!
    你的代码在我机子上运行正常!我的代码”CV_RAND_NORMAL“确实弄错了!
    关于seed我理解了!
    至于CvRandState这个结构进行初始化,是否是用来指定你将要采用的产生随机数的机制?比如,在cvRandInit()中把rng_state初始化选择了均匀分布,那么RandReal(&rng_state)就使用的是均匀分布来产生随机数.

    郭一实 |  2010-07-02 at 00:19  

    @xiaofevg
    我在网上找了一下,发现基本上没有那几个函数在使用,而且从这个地址来看,这些函数属于比较早的应用,估计现在写了以后会有兼容性问题,所以我还是不推荐使用这些函数。
    比如你说的功能就以通过cvRandArr()来实现。

    不过说过来,上面你对CvRandState的结构理解应该是正确的。

  •   10 - xiaofevg  |  2010-07-05 at 15:19  

    郭同学,我在理解直方图时有些问题,想跟你讨论一下。你是怎么理解的呢?
    1,书上说:”直方图就是对数据进行统计,并把统计数值放在bin中。bin中的数值为数据特征的统计量,如梯度,色彩,以及其它特征。”.那么到底bin里存储的是什么呢?它是一个什么样的数组呢?cvGetReal1D(hist->bins,i)这个数值代表的是什么量的值呢?很明显这个数值是受第i维直方图的块数所影响的,这更加让我无法理解bin里的数值的含义了。
    2,关于cvCreateHist()函数的第四个参宿uniform。当它=非0时,那么ranges[i]里包含的是第i维上的直方图的上下限,这么说来如果对于第i维的直方图有sizes个块,那么这sizes个块的上下限按理说都是一样的吧!
    3,当uniform=0时,ranges[i]包括lower0,upper0,lower1,upper1………lower(sizes[i]-1),upper(sizes[i]-1;很明显ranges[i]里包括2*sizes[i]个元素啊,为什么书上写的是sizes[i]+1个呢?是不是upper0=lower1,upper1=lower2,upper3=lower4……….如果是这样的话那么确实ranges[i]内有sizes[i]+1个元素。注:sizes[i]表示第i维直方图的块数。

Trackbacks

  1. 大二编程(九月篇) | meiyou.org
  2. 大二编程(十月篇) | meiyou.org
  3. 大二编程(十一月篇) | meiyou.org
  4. [编程]2010年01月 | meiyou.org

登陆 评论