1. 程式人生 > >基本繪圖、隨機生成器、字型

基本繪圖、隨機生成器、字型

文章目錄

官網連結

常用的畫圖函式

  • 官網在 imgproc 模組下 -> Drawing Functions
  • 畫圖函式預設的座標方向:
    在這裡插入圖片描述

線段

  1. void cv::line
    (
    InputOutputArray img,     // 在哪個圖中畫
    Point pt1,          //第一個點
    Point pt2,         // 第二個點
    const Scalar & color,        // Scalar(255,0,0) 藍色
    int thickness = 1,        // 寬度,FILLED:填充
    int lineType = LINE_8,        // 畫線的演算法型別,一般選擇LINE_8就行,
    int shift = 0         //端點座標小數的個數,大部分情況 0 即可
    )
void MyLine( Mat img, Point start, Point end )
{
  int thickness = 2;
  int lineType = LINE_8;
  line( img,
    start,
    end,
    Scalar( 0, 0, 0 ),
    thickness,
    lineType );
}



橢圓

  1. void cv::ellipse (
    InputOutputArray img,     //目標影象
    Point center,        //橢圓的中心點
    Size axes,        //兩個主軸的大小一半,下圖中青色的線,相當於AXES_WIDTH,AXES_HEIGHT
    double angle,        //橢圓的旋轉角度
    double startAngle,        // 畫弧用的(藍色),畫弧的起始角度,如果畫橢圓 就是 0
    double endAngle,        // 畫弧用的(藍色),畫弧的結束角度,如果畫橢圓 就是 360
    const Scalar & color,        //顏色:Scalar(255,0,0)就是藍色
    int thickness = 1,        // 線的寬度,FILLED:填充
    int lineType = LINE_8,        // 畫線的演算法型別:LINE_8就行
    int shift = 0         // 中心點座標的小數位個數,大部分是整數,0即可
    )

在這裡插入圖片描述


  ellipse( img,
       Point( 200, 200 ), 
       Size( 100, 50), 長軸200,短軸100
       45,
       0,
       360,
       Scalar( 255, 0, 0 ),
       2,
       LINE_8);

結果:圖是400*400 大小





矩形

  1. void cv::rectangle (
    InputOutputArray img,        // 目標影象
    Point pt1,        // 矩形定點1,
    Point pt2,        // 矩形定點2,和1相對(對角線)
    const Scalar & color,        // 顏色:Scalar(255,0,0)藍色
    int thickness = 1,        // 線寬度,FILLED:填充
    int lineType = LINE_8,        // 畫線演算法
    int shift = 0         // 定點座標小數點的位數,0即可
    )

  rectangle( rook_image,
         Point( 0, 350 ),
         Point( 400, 400),
         Scalar( 0, 255, 255 ),
         FILLED,
         LINE_8 );

結果:影象大小:400*400
在這裡插入圖片描述





  1. void cv::circle (
    InputOutputArray img,        // 目標影象
    Point center,        // 圓的中心點
    int radius,        // 圓的半徑
    const Scalar & color,        // 顏色
    int thickness = 1,        // 線寬度,FILLED:填充
    int lineType = LINE_8,        //線型別
    int shift = 0         // 中點,半徑 的小數點個數
    )
	circle(img,oint(200,200),200,Scalar(0,0,255),FILLED,LINE_8);

結果:400*400的圖中畫了半徑200的圓ff
在這裡插入圖片描述





箭頭

  1. void cv::arrowedLine (
    InputOutputArray img,         //
    Point pt1,        // 開始點
    Point pt2,        // 指向的 點
    const Scalar & color,        //
    int thickness = 1,        //
    int line_type = 8,        //
    int shift = 0,        //
    double tipLength = 0.1         // 箭頭的長度是線段的0.1
    )



填充多邊形

  1. void cv::fillPoly (
    InputOutputArray img,        //
    const Point ** pts,        //定點的首地址的二級指標
    const int * npts,        // 多邊形定點個數
    int ncontours,        //
    const Scalar & color,        //
    int lineType = LINE_8,        //
    int shift = 0,        //
    Point offset = Point()         //
    )
  w=400;
  Point rook_points[20];
  
  rook_points[0]  = Point(    w/4,   7*w/8 );
  rook_points[1]  = Point(  3*w/4,   7*w/8 );
  rook_points[2]  = Point(  3*w/4,  13*w/16 );
  rook_points[3]  = Point( 11*w/16, 13*w/16 );
  rook_points[4]  = Point( 19*w/32,  3*w/8 );
  rook_points[5]  = Point(  3*w/4,   3*w/8 );
  rook_points[6]  = Point(  3*w/4,     w/8 );
  rook_points[7]  = Point( 26*w/40,    w/8 );
  rook_points[8]  = Point( 26*w/40,    w/4 );
  rook_points[9]  = Point( 22*w/40,    w/4 );
  rook_points[10] = Point( 22*w/40,    w/8 );
  rook_points[11] = Point( 18*w/40,    w/8 );
  rook_points[12] = Point( 18*w/40,    w/4 );
  rook_points[13] = Point( 14*w/40,    w/4 );
  rook_points[14] = Point( 14*w/40,    w/8 );
  rook_points[15] = Point(    w/4,     w/8 );
  rook_points[16] = Point(    w/4,   3*w/8 );
  rook_points[17] = Point( 13*w/32,  3*w/8 );
  rook_points[18] = Point(  5*w/16, 13*w/16 );
  rook_points[19] = Point(    w/4,  13*w/16 );

  const Point* ppt =  rook_points ;
  int npt = 20 ;
  fillPoly( img,
        &ppt, //
        &npt, //多邊形定點個數
        1,
        Scalar( 255, 255, 255 ),
        LINE_8);

結果:400*400的圖
在這裡插入圖片描述




字型相關函式

寫字

  1. void cv::putText (
    InputOutputArray img,        //
    const String & text,        // 字串
    Point org,        // 右下角的座標
    int fontFace,        // 字型
    double fontScale,        // 字的大小
    Scalar color,        //
    int thickness = 1,        //
    int lineType = LINE_8,        //
    bool bottomLeftOrigin = false         // 預設false,ture的話,字將是倒的
    )
putText(img,"julian",Point(10,50),5,2,Scalar(255,0,0))

結果:
在這裡插入圖片描述



得到字串寬度和高度

  1. Size cv::getTextSize (
    const String & text,        // 字串
    int fontFace,        // 字型
    double fontScale,        // 字大小
    int thickness,        //線寬度
    int * baseLine         //
    )
  • 可以使用此函式來得到預顯示的字串的文字框大小,進行佈局,比如我想將字串放中間
	int base =0;
	Size textsize = getTextSize("julian",5,2,2,&base);
	Point xx;
	xx.x=(atom_image.cols-textsize.width)/2;
	xx.y=(atom_image.rows-textsize.height)/2;
	putText(atom_image,"julian",xx,5,2,Scalar(255,0,0));


結果:
在這裡插入圖片描述




隨機數生成器:cv:: RNG

  • 隨機數生成器都是偽隨機,只要種子不變,生成的隨機演算法不變,每次的執行結果就是一樣的。

建構函式

  1. cv::RNG::RNG()
  2. cv::RNG::RNG ( uint64 state)
RNG rng; // 第一種,預設以2^32-1 做種子
RNG rng(1);//第二種,以給定的值做種子


得到隨機數

普通:

  1. unsigned cv::RNG::next ( ) :使用MWC演算法更新種子,返回32位的隨機數
  2. cv::RNG::operator double ( ) :返回下一個 double型的數
  3. cv::RNG::operator float ( ) :返回下一個 float型的數
  4. cv::RNG::operator schar ( ) :。。。
  5. cv::RNG::operator short ( ) :。。。
  6. 。。。。。。。。。()//都差不多

  7. unsigned cv::RNG::operator() ()://和next一樣
  8. unsigned cv::RNG::operator() ( unsigned N ) ://返回的數對N取模,等價於返回 [0 N)

均勻分佈:

  1. int cv::RNG::uniform (
    int a,      // 均勻分佈的下限
    int b       //均勻分佈的上限
    )

  2. float cv::RNG::uniform (
    float a,
    float b
    )

  3. double cv::RNG::uniform (
    double a,
    double b
    )

返回的值是int 、float、還是double只取決於傳入的引數,和被賦值的左值型別無關。如果你想呼叫浮點數,傳入的是整數,要麼向a1那樣進行型別轉化,要麼在後面加一個點

RNG rng;
// always produces 0
double a = rng.uniform(0, 1);

// produces double from [0, 1)
double a1 = rng.uniform((double)0, (double)1);

// produces float from [0, 1)
float b = rng.uniform(0.f, 1.f);

// produces double from [0, 1)
double c = rng.uniform(0., 1.);


高斯分佈:
  1. double cv::RNG::gaussian ( double sigma )
    :sigma (高斯分佈的標準差 σ \sigma ),返回一個從高斯分佈N(0, σ \sigma )的取樣值


填充特定分佈的資料到矩陣

  1. void cv::RNG::fill (
    InputOutputArray mat,      //被填充的矩陣,
    int distType,      // 分佈型別 RNG::UNIFORM 或者 RNG::NORMAL.
    InputArray a,      // 是均勻分佈這個值是下限值a,是高斯分佈的話就是均值
    InputArray b,      //是均勻分佈這個值是上限值b,是高斯分佈的話就是標準差 σ \sigma
    bool saturateRange = false       //只對均勻分佈有效,如果是ture:將會產生[ a, b ]之間的值;如果是false:最終填充的資料將會根據影象資料型別進行截斷,比如傳入影象是CV_C8U1:最終填充資料將是[0,255]
    )

如果是多通道的影象,填充資料分別對每個通道單獨進行填充,比如對3通道進行高斯分佈資料填充,並不是直接由3*3的協方差矩陣形成的高斯分佈,然後取樣填充到影象中。而是分別形成3個高斯分佈,再分別進行取樣填充到3個通道。