OpenCV也提供了另一个数据结构来做Rand的实作,CvRandState,被包在"cvcompat.h"里,"cvcompat.h"的完整意 思是Computer Vision Compatility,CvRandState的特色是可以选定常态分布及均匀分布,不过,它只能运用在矩阵跟一维数组.
矩阵的部份程序代码如下
RandState矩阵的实作
#include <cv.h>
#include <highgui.h>
int main()
{
IplImage *Image1;
CvSize ImageSize1 = cvSize(320,240);
Image1 = cvCreateImage(ImageSize1,IPL_DEPTH_8U,3);
cvZero(Image1);
CvRandState RandState1;
cvRandInit(&
RandState1,0,255,cvGetTickCount(),CV_RAND_UNI);
cvRandSetRange(&
RandState1,0,127,0);
cvRandSetRange(&
RandState1,128,255,1);
cvRand(&
RandState1,Image1);
cvNamedWindow("cvRand",1);
cvShowImage("cvRand",Image1);
cvWaitKey(0);
}
这 个结果也好玩了,因为它随机的范围RGB值都不一样,因此执行结果为偏绿色的随机数,这边,开启了一个Channel为3的RGB图形,给他全0的值,让 他变成黑色,接着,使用CvRandState数据结构,用cvRandInit()初始化它,随机范围是0~255,种子是时间(可输入大小为 64bits),均匀分布,这里会使个它的随机RGB值范围都是0~255,接着,用cvRandSetRange()改变了B(第三个参数)值的范围为 0~127,再用cvRandSetRange()改变G值范围为128~255,而R值,没有被cvRandSetRange()改变到,因此它的范围 是0~255,再来就是设定图形啦,给它的是Image1及被设定过后的RandState1,会对图形自动产生随机,跟CvArr()一样,不过这边可 以任意改变RGB值范围,而这里不一定是要用到通道3的RGB值,可以用通道格式为1,2,3的图形.
再来是一维数组的实作
RandState一维数组的实作
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
float FloatArray[20];
CvRandState RandState1;
cvRandInit(&
RandState1,30,20,cvGetTickCount(),CV_RAND_NORMAL);
cvbRand(&
RandState1,FloatArray,20);
for(int i=0;i<20;i++)
{
printf("%f/n",FloatArray[i]);
}
system("pause");
free(&
RandState1);
}
这 边开启了一个空间为20个float数组,RandState1数据结构及初始化它,给他常态分布,平均数为30标准偏差为20,及以时间的种子,再用 cvbRand()制作常态分布随机数组,给他CvRandState数据结构,float数组名,及随机的大小,亦可以随机到前十个数组空间就好.这 里数组规定要用Float型别做随机实作,在做printf()就必须要用"%f".
cvRandInit()
初始化CvRandState数据结构,可以选定随机分布的种类,并给定它种子,有两种情形
cvRandInit(CvRandState数据结构,随机上界,随机下界,均匀分布参数,64bits种子的数字)
cvRandInit(CvRandState数据结构,平均数,标准偏差,常态分布参数,64bits种子的数字)
(问题编译器如何识别?)
cvRandSetRange()
修改CvRandState数据结构的参数内容,均匀分布的话可以每个信道的上下界常态分布可以修改每个通道的平均数,标准偏差.
cvRandSetRange(CvRandState数据结构,均匀分布上界,均匀分布下界,目标信道数据)
cvRandSetRange(CvRandState数据结构,常态分布平均数,常态分布标准偏差,目标信道数据)
cvRand()
将CvMat或IplImage数据结构随机化,用被设定过的CvRandState数据结构来随机.
cvRand(CvRandState数据结构,CvMat或IplImage数据结构)
cvbRand()
将一维数组随机化,可以设定随机的长度
cvbRand(RandState数据结构,Float型别数组名,随机的长度);