隨機(jī)生成器和OpenCV文本

2018-08-30 11:05 更新

目標(biāo)

在本教程中,您將學(xué)習(xí)如何:

  • 使用隨機(jī)數(shù)生成器類(cv :: RNG)以及如何從均勻分布中獲取隨機(jī)數(shù)。
  • 使用函數(shù)cv :: putText在OpenCV窗口中顯示文本

Code

  • 在前面的教程(基本繪圖)中,我們繪制了不同的幾何圖形,作為輸入?yún)?shù),如坐標(biāo)(以cv :: Point的形式),顏色,厚度等。您可能已經(jīng)注意到,我們給出了這些參數(shù)的特定值。
  • 在本教程中,我們打算為繪圖參數(shù)使用隨機(jī)值。此外,我們打算用大量的幾何圖形填充我們的形象。由于我們將以隨機(jī)的方式對它們進(jìn)行初始化,所以這個過程將是自動的,并且使用循環(huán)。
  • 此代碼位于您的OpenCV示例文件夾中。否則你可以從這里抓住它

說明

  • 我們首先檢查主要功能。我們觀察到,我們首先做的是創(chuàng)建一個隨機(jī)數(shù)生成器對象(RNG):
RNG rng( 0xFFFFFFFF );

RNG實(shí)現(xiàn)一個隨機(jī)數(shù)生成器。在本例中,rng是以0xFFFFFFFF值初始化的RNG元素

  • 然后我們創(chuàng)建一個初始化為零的矩陣(這意味著它將顯示為黑色),指定其高度,寬度和類型:
Mat image = Mat :: zeros(window_height,window_width,CV_8UC3);
imshow(window_name,image);
  • 然后我們繼續(xù)畫瘋狂的東西。看看代碼后,可以看到它主要分為8個部分,定義為函數(shù):
c = Drawing_Random_Lines(image,window_name,rng);
if(c!= 0return 0;
c = Drawing_Random_Rectangles(image,window_name,rng);
if(c!= 0return 0;
c = Drawing_Random_Ellipses(image,window_name,rng);
if(c!= 0return 0;
c = Drawing_Random_Polylines(image,window_name,rng);
if(c!= 0return 0;
c = Drawing_Random_Filled_Polygons(image,window_name,rng);
if(c!= 0return 0;
c = Drawing_Random_Circles(image,window_name,rng);
if(c!= 0return 0;
c = Displaying_Random_Text(image,window_name,rng);
if(c!= 0return 0;
c = Displaying_Big_End(image,window_name,rng);

所有這些功能都遵循相同的模式,因此我們將僅分析其中的一些功能,因?yàn)橥瑯拥慕忉屵m用于所有的功能。

  • 檢出函數(shù)Drawing_Random_Lines
int Drawing_Random_Lines( Mat image, char* window_name, RNG rng )
{
  int lineType = 8;
  Point pt1, pt2;
  for( int i = 0; i < NUMBER; i++ )
  {
   pt1.x = rng.uniform( x_1, x_2 );
   pt1.y = rng.uniform( y_1, y_2 );
   pt2.x = rng.uniform( x_1, x_2 );
   pt2.y = rng.uniform( y_1, y_2 );
   line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 );
   imshow( window_name, image );
   if( waitKey( DELAY ) >= 0 )
   { return -1; }
  }
  return 0;
}
  • 我們可以看到以下內(nèi)容:
  1. 該用于循環(huán)將重復(fù)NUMBER次。由于函數(shù)cv :: line在該循環(huán)內(nèi),這意味著將生成NUMBER行。
  2. 線極值由pt1和pt2給出。對于pt1,我們可以看到:
pt1.x = rng.uniform(x_1,x_2);
pt1.y = rng.uniform(y_1,y_2);
  • 我們知道rng是一個隨機(jī)數(shù)生成器對象。在上面的代碼中,我們調(diào)用rng.uniform(a,b)。這產(chǎn)生了值a和b之間的隨機(jī)均勻分布(包括在a中,排除在b中)。
  • 從上面的解釋,我們推導(dǎo)出極值pt1和pt2將是隨機(jī)值,所以線位置將是非常不可預(yù)測的,給出一個很好的視覺效果(查看下面的結(jié)果部分)。
  • 另外觀察一下,我們注意到在cv :: line參數(shù)中,輸入顏色:
    randomColor(RNG)
    

我們來看看功能的實(shí)現(xiàn):

static Scalar randomColor( RNG& rng )
  {
  int icolor = (unsigned) rng;
  return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
  }

我們可以看到,返回值是具有3個隨機(jī)初始化值的標(biāo)量,它被用作線顏色的R,GB參數(shù)。因此,線條的顏色也是隨機(jī)的!

  • 上面的說明適用于生成圓,橢圓,多邊形等的其他函數(shù)。中心和頂點(diǎn)等參數(shù)也隨機(jī)生成。
  • 在完成之前,我們還應(yīng)該看看Display_Random_Text和Displaying_Big_End的功能,因?yàn)樗鼈兌加幸恍┯腥さ墓δ埽?/li>
  • Display_Random_Text:
int Displaying_Random_Text( Mat image, char* window_name, RNG rng )
{
  int lineType = 8;
  for ( int i = 1; i < NUMBER; i++ )
  {
    Point org;
    org.x = rng.uniform(x_1, x_2);
    org.y = rng.uniform(y_1, y_2);
    putText( image, "Testing text rendering", org, rng.uniform(0,8),
             rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType);
    imshow( window_name, image );
    if( waitKey(DELAY) >= 0 )
      { return -1; }
  }
  return 0;
}

一切看起來很熟悉,但表達(dá)式:

putText(image,“testing text rendering”,org,rng.uniform(0,8),
         rng.uniform(0,100)* 0.05 + 0.1,randomColor(rng),rng.uniform(1,10),lineType);

那么函數(shù)cv :: putText是做什么的呢?在我們的例子中:

  1. 繪制文本**“測試文本渲染”**在圖像中
  2. 文本的左下角將位于Point org中
  3. 字體類型是一個隨機(jī)整數(shù)值,范圍為:。[0,8>
  4. 字體的大小由表達(dá)式rng.uniform(0,100)x0.05 + 0.1表示(表示其范圍為 0.1,5.1 ][0.1,5.1>
  5. 文本顏色是隨機(jī)的(由randomColor(rng)表示))
  6. 文本厚度范圍介于1到10之間,由rng.uniform(1,10)

因此,我們將在隨機(jī)位置獲得(分析其他繪圖功能)NUMBER個文本在我們的圖像上。

  • Displaying_Big_End

int Displaying_Big_End( Mat image, char* window_name, RNG rng )
{
  Size textsize = getTextSize("OpenCV forever!", FONT_HERSHEY_COMPLEX, 3, 5, 0);
  Point org((window_width - textsize.width)/2, (window_height - textsize.height)/2);
  int lineType = 8;
  Mat image2;
  for( int i = 0; i < 255; i += 2 )
  {
    image2 = image - Scalar::all(i);
    putText( image2, "OpenCV forever!", org, FONT_HERSHEY_COMPLEX, 3,
           Scalar(i, i, 255), 5, lineType );
    imshow( window_name, image2 );
    if( waitKey(DELAY) >= 0 )
      { return -1; }
  }
  return 0;
}

除了函數(shù)getTextSize(獲取參數(shù)文本的大?。┲?,我們可以觀察到的新操作在foor循環(huán)中:

image2 = image  -  Scalar :: all(i)

所以,image2是圖像和Scalar :: all(i)的減法。事實(shí)上,這里發(fā)生的一切是,image2的每個像素都將減去圖像的每個像素減去i的值(記住,對于每個像素,我們考慮三個值,如R,G和B,因此每個像素會受到影響)

還要記住,減法運(yùn)算總是在內(nèi)部執(zhí)行飽和運(yùn)算,這意味著獲得的結(jié)果將始終在允許的范圍內(nèi)(對于我們的示例,不會為負(fù)值,在0到255之間)。

結(jié)果

正如您剛才在“代碼”部分所看到的,程序?qū)⒁来螆?zhí)行不同的繪圖功能,這將產(chǎn)生:

  • 首先,一個隨機(jī)的NUMBER行將出現(xiàn)在屏幕上,如可以在這個屏幕截圖中看到的:

隨機(jī)生成器和OpenCV文本

  • 然后,一組新的數(shù)字,這些時間矩形將跟隨。
  • 現(xiàn)在將出現(xiàn)一些橢圓,其中每個都有隨機(jī)位置,大小,厚度和弧長:

隨機(jī)生成器和OpenCV文本

  • 現(xiàn)在,具有03段的折線將出現(xiàn)在屏幕上,再次以隨機(jī)配置。

隨機(jī)生成器和OpenCV文本

  • 填充的多邊形(在此示例中為三角形)將跟隨。
  • 最后幾何圖形出現(xiàn):圈子!

隨機(jī)生成器和OpenCV文本

  • 接近尾聲,文字*“測試文字呈現(xiàn)”*將以各種字體,大小,顏色和位置出現(xiàn)。
  • 而大端(也是這樣表達(dá)了一個大道理):

隨機(jī)生成器和OpenCV文本


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號