利用OpenCV函数生成随机数,填充数组。主要参考OpenCV中文网站OpenCV手册
http://www.opencv.org.cn/index.php/Cxcore%E6%95%B0%E7%BB%84%E6%93%8D%E4%BD%9C
函数:RandArr
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int _tmain(int argc, _TCHAR* argv[])
{
/* let'snoisy_screen be the floating-point 2d array that is to be "crapped"*/
CvMat* noisy_screen = cvCreateMat(10,10, CV_32F); // 为noisy_screen申请空间
CvRandState rng_state;// = cvRNG(0xffffffff); // 修改为CvRandState形式, 原文有错误
int i,pointCount = 1000;
/* allocatethe array of coordinates of points */
CvMat*locations = cvCreateMat( pointCount, 1, CV_32SC2 ); // 设置是两个通道,坐标形式
/* arr ofrandom point values */
CvMat*values = cvCreateMat( pointCount, 1, CV_32FC1 );
CvSize size= cvGetSize( noisy_screen );
cvRandInit(&rng_state,
0,1, /* 现在使用虚参数以后再调整*/
0xffffffff/*这里使用一个确定的种子 */,
CV_RAND_UNI/* 指定为均匀分布类型*/ );
/* 初始化locations*/
cvRandArr(&rng_state.state, locations, CV_RAND_UNI, cvScalar(0,0,0,0),cvScalar(size.width,size.height,0,0) );
// 二维数据,所以需要x,y维的数据来进行
/* modifyRNG to make it produce normally distributed values */
rng_state.disttype= CV_RAND_NORMAL;
cvRandSetRange(&rng_state,
30/* deviation */,
100/* average point brightness */,
-1/* initialize all the dimensions */ );
/* generatevalues */
cvRandArr(&rng_state.state, values, CV_RAND_NORMAL,
cvRealScalar(100),// average intensity
cvRealScalar(30)// deviation of the intensity
);
// 一维数组情况下参数是cvRealScalar(), 而二维数组情况下是cvScalar()
/* set thepoints */
for( i = 0;i < pointCount; i++ )
{
CvPointpt = *(CvPoint*)cvPtr1D( locations, i, 0 );
floatvalue = *(float*)cvPtr1D( values, i, 0 );
*((float*)cvPtr2D(noisy_screen, pt.y, pt.x, 0 )) += value;
}
/* not toforget to release the temporary arrays */
cvReleaseMat(&locations );
cvReleaseMat(&values );
/* RNGstate does not need to be deallocated */