《OpenCV3程式設計入門》——4.3 基本影象繪製
阿新 • • 發佈:2018-11-28
目錄
基本影象繪製涉及到的繪製函式如下:
- 用於繪製直線的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函式用法詳解