1. 程式人生 > >《OpenCV3程式設計入門》——4.3 基本影象繪製

《OpenCV3程式設計入門》——4.3 基本影象繪製

目錄

1、DrawEllipse()函式的寫法

2、DrawFilledCircle()函式的寫法

3、DrawPolygon()函式的寫法

4、DrawLine()函式的寫法

基本繪製圖形程式碼:

moveWindow函式


基本影象繪製涉及到的繪製函式如下:

  • 用於繪製直線的line函式
  • 用於繪製橢圓的ellipse函式
  • 用於繪製矩形的rectangle函式
  • 用於繪製圓的circle函式
  • 用於繪製填充的多變形的fillPoly函式

下邊程式碼WINDOW_WIDTH有如下的巨集定義:

# define WINDOW_WIDTH 600   //定義視窗大小的巨集


1、DrawEllipse()函式的寫法

//-------------------------------【DrawEllipse( )函式】--------------------------------
//		描述:自定義的繪製函式,實現了繪製不同角度、相同尺寸的橢圓
//-----------------------------------------------------------------------------------------
void DrawEllipse( Mat img, double angle )
{
	int thickness = 2;
	int lineType = 8;

    //呼叫OpenCV中ellipse函式
	ellipse( img,
		Point( WINDOW_WIDTH/2, WINDOW_WIDTH/2 ),
		Size( WINDOW_WIDTH/4, WINDOW_WIDTH/16 ),
		angle,
		0,
		360,
		Scalar( 255, 129, 0 ),
		thickness,
		lineType );
}

 上述程式碼,呼叫了OpenCV中ellipse函式:

  • 橢圓繪製在img上
  • 橢圓中心點為( WINDOW_WIDTH/2, WINDOW_WIDTH/2 )
  • 大小位於矩形( WINDOW_WIDTH/4, WINDOW_WIDTH/16 )內
  • 橢圓旋轉角度為angle,擴充套件的弧度從0度到360度。從水平方向逆時針為正,順時針為負
  • 圖色為Scalar(255, 129, 0)代表的藍色
  • 線寬(thickness)為2
  • 線型(lineType)為8(8聯通線型)

2、DrawFilledCircle()函式的寫法

//-----------------------------------【DrawFilledCircle( )函式】---------------------------
//		描述:自定義的繪製函式,實現了實心圓的繪製
//-----------------------------------------------------------------------------------------
void DrawFilledCircle( Mat img, Point center )
{
	int thickness = -1;
	int lineType = 8;

	circle( img,
		center,
		WINDOW_WIDTH/32,
		Scalar( 0, 0, 255 ),
		thickness,
		lineType );
}

  上述程式碼,呼叫了OpenCV中circle函式:

  • 圓繪製在img上
  • 圓中心點由center定義
  • 圓半徑為WINDOW_WIDTH/32
  • 圖形顏色為Scalar(0, 0, 255)代表的紅色(BGR)
  • 線寬(thickness)為-1,所以為實心圓,線粗為負值,則表示填充。
  • 線型lineType)為8(8聯通線型)

3、DrawPolygon()函式的寫法

//-----------------------------------【DrawPolygon( )函式】--------------------------
//		描述:自定義的繪製函式,實現了凹多邊形的繪製
//--------------------------------------------------------------------------------------
void DrawPolygon( Mat img )
{
	int lineType = 8;

	//建立一些點
	Point rookPoints[1][20];
	rookPoints[0][0]  = Point(    WINDOW_WIDTH/4,   7*WINDOW_WIDTH/8 );
	rookPoints[0][1]  = Point(  3*WINDOW_WIDTH/4,   7*WINDOW_WIDTH/8 );
	rookPoints[0][2]  = Point(  3*WINDOW_WIDTH/4,  13*WINDOW_WIDTH/16 );
	rookPoints[0][3]  = Point( 11*WINDOW_WIDTH/16, 13*WINDOW_WIDTH/16 );
	rookPoints[0][4]  = Point( 19*WINDOW_WIDTH/32,  3*WINDOW_WIDTH/8 );
	rookPoints[0][5]  = Point(  3*WINDOW_WIDTH/4,   3*WINDOW_WIDTH/8 );
	rookPoints[0][6]  = Point(  3*WINDOW_WIDTH/4,     WINDOW_WIDTH/8 );
	rookPoints[0][7]  = Point( 26*WINDOW_WIDTH/40,    WINDOW_WIDTH/8 );
	rookPoints[0][8]  = Point( 26*WINDOW_WIDTH/40,    WINDOW_WIDTH/4 );
	rookPoints[0][9]  = Point( 22*WINDOW_WIDTH/40,    WINDOW_WIDTH/4 );
	rookPoints[0][10] = Point( 22*WINDOW_WIDTH/40,    WINDOW_WIDTH/8 );
	rookPoints[0][11] = Point( 18*WINDOW_WIDTH/40,    WINDOW_WIDTH/8 );
	rookPoints[0][12] = Point( 18*WINDOW_WIDTH/40,    WINDOW_WIDTH/4 );
	rookPoints[0][13] = Point( 14*WINDOW_WIDTH/40,    WINDOW_WIDTH/4 );
	rookPoints[0][14] = Point( 14*WINDOW_WIDTH/40,    WINDOW_WIDTH/8 );
	rookPoints[0][15] = Point(    WINDOW_WIDTH/4,     WINDOW_WIDTH/8 );
	rookPoints[0][16] = Point(    WINDOW_WIDTH/4,   3*WINDOW_WIDTH/8 );
	rookPoints[0][17] = Point( 13*WINDOW_WIDTH/32,  3*WINDOW_WIDTH/8 );
	rookPoints[0][18] = Point(  5*WINDOW_WIDTH/16, 13*WINDOW_WIDTH/16 );
	rookPoints[0][19] = Point(    WINDOW_WIDTH/4,  13*WINDOW_WIDTH/16 );

	const Point* ppt[1] = { rookPoints[0] };
	int npt[] = { 20 };

	fillPoly( img,
		ppt,
		npt,
		1,
		Scalar( 255, 255, 255 ),
		lineType );
}

   上述程式碼,呼叫了OpenCV中fillPoly函式:

  • 繪製在img上
  • 多變形的頂點集為ppt
  • 要繪製的多變形的頂點數目為npt
  • 繪製多變形的數量為1
  • 圖形顏色為Scalar(255, 255, 255)代表的白色
  • 線型(lineType)為8(8聯通線型)

4、DrawLine()函式的寫法

//-----------------------------------【DrawLine( )函式】--------------------------
//		描述:自定義的繪製函式,實現了線的繪製
//---------------------------------------------------------------------------------
void DrawLine( Mat img, Point start, Point end )
{
	int thickness = 2;
	int lineType = 8;
	line( img,
		start,
		end,
		Scalar( 0, 0, 0 ),
		thickness,
		lineType );
}

 上述程式碼,呼叫了OpenCV中line函式


基本繪製圖形程式碼:

主函式為(與上述函式組合起來):

//---------------------------------【標頭檔案、名稱空間包含部分】----------------------------
//          描述:包含程式所使用的標頭檔案和名稱空間
//------------------------------------------------------------------------------------------------

# include <opencv2/opencv.hpp>
using namespace cv;


//-----------------------------------【巨集定義部分】-------------------------------------------- 
//		描述:定義一些輔助巨集 
//------------------------------------------------------------------------------------------------ 
#define WINDOW_NAME1 "【繪製圖1】"        //為視窗標題定義的巨集 
#define WINDOW_NAME2 "【繪製圖2】"        //為視窗標題定義的巨集 
#define WINDOW_WIDTH 600//定義視窗大小的巨集


//--------------------------------【全域性函式宣告部分】-------------------------------------
//		描述:全域性函式宣告
//-----------------------------------------------------------------------------------------------
void DrawEllipse(Mat img, double angle);//繪製橢圓
void DrawFilledCircle(Mat img, Point center);//繪製圓
void DrawPolygon(Mat img);//繪製多邊形
void DrawLine(Mat img, Point start, Point end);//繪製線段


//---------------------------------------【main( )函式】--------------------------------------
//		描述:控制檯應用程式的入口函式,我們的程式從這裡開始執行
//-----------------------------------------------------------------------------------------------
int main(void)
{

    // 建立空白的Mat影象
    Mat atomImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
    Mat rookImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);

   
    // ---------------------<1>繪製化學中的原子示例圖------------------------

    //【1.1】先繪製出橢圓
    DrawEllipse(atomImage, 90);
    DrawEllipse(atomImage, 0);   //0度是水平的
    DrawEllipse(atomImage, 45);  //水平自逆時針旋轉
    DrawEllipse(atomImage, -45); //水平自順時針旋轉

    //【1.2】再繪製圓心
    DrawFilledCircle(atomImage, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2));

    // ----------------------------<2>繪製組合圖-----------------------------
    //【2.1】先繪製出多邊性
    DrawPolygon(rookImage);

    // 【2.2】繪製矩形
    rectangle(rookImage,
        Point(0, 7 * WINDOW_WIDTH / 8),
        Point(WINDOW_WIDTH, WINDOW_WIDTH),
        Scalar(0, 255, 255),
        -1,
        8);

    // 【2.3】繪製一些線段
    DrawLine(rookImage, Point(0, 15 * WINDOW_WIDTH / 16), Point(WINDOW_WIDTH, 15 * WINDOW_WIDTH / 16));
    DrawLine(rookImage, Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH / 4, WINDOW_WIDTH));
    DrawLine(rookImage, Point(WINDOW_WIDTH / 2, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH / 2, WINDOW_WIDTH));
    DrawLine(rookImage, Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH));

    // ---------------------------<3>顯示繪製出的影象------------------------
    imshow(WINDOW_NAME1, atomImage);
    moveWindow(WINDOW_NAME1, 0, 200);  //設定視窗的位置和尺寸
    imshow(WINDOW_NAME2, rookImage);
    moveWindow(WINDOW_NAME2, WINDOW_WIDTH, 200);

    waitKey(0);
    return(0);
}

執行結果為:


moveWindow函式

上述程式碼設計moveWindow函式,對此函式如有疑問,請參考博文moveWindow函式用法詳解