2008年6月28日 星期六

OpenCV隨機的實作-CvRandState的實作

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型別陣列名稱,隨機的長度);



1 意見:

匿名 提到...

helpful!

Copyright 2008-2009,yester