opencv基本畫圖

目標(biāo)

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

  • 使用OpenCV函數(shù)行()繪制一行
  • 使用OpenCV函數(shù)橢圓()繪制橢圓
  • 使用OpenCV函數(shù)矩形()繪制一個(gè)矩形
  • 使用OpenCV函數(shù)圈()繪制一個(gè)
  • 使用OpenCV函數(shù)fillPoly()繪制一個(gè)填充的多邊形

OpenCV理論

對(duì)于本教程,大量使用兩個(gè)結(jié)構(gòu):cv :: Pointcv :: Scalar

point

2D point, 由圖像 x, y坐標(biāo)確定吨拍,可以定義成:

Point pt;
pt.x = 10;
pt.y = 8;

Point pt = Point(10, 8);

Scalar

  • 代表一個(gè)4元素向量。Scalar類型廣泛用于OpenCV中痪伦,用于傳遞像素值耍鬓。

  • 在本教程中阔籽,我們將廣泛使用它來表示BGR顏色值(3個(gè)參數(shù))流妻。如果不使用最后一個(gè)參數(shù)牲蜀,則無需定義最后一個(gè)參數(shù)。

  • 讓我們看一個(gè)例子绅这,如果我們被要求一個(gè)顏色參數(shù)涣达,我們給:

Scalar(a, b, c)

將定義一個(gè)BGR顏色,例如:Blue = a证薇,Green = bRed = c.

代碼實(shí)現(xiàn)

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

#define w 400
using namespace cv;

void MyEllipse(Mat img, double angle);

void MyFilledCircle(Mat img, Point center);

void MyPolygon(Mat img);

void MyLine(Mat img, Point start, Point end);

int main(void) 
{
    char atom_window[] = "Drawing 1: Atom";
    char rook_window[] = "Drawing 2: Rook";

    Mat atom_image = Mat::zeros(w, w, CV_8UC3);
    Mat rook_image = Mat::zeros(w, w, CV_8UC3);

    MyEllipse(atom_image, 90);
    MyEllipse(atom_image, 0);
    MyEllipse(atom_image, 45);
    MyEllipse(atom_image, -45);

    MyFilledCircle(atom_image, Point(w / 2, w / 2));

    MyPolygon(rook_image);

    rectangle(rook_image,
        Point(0, 7 * w / 8),
        Point(w, w),
        Scalar(0, 255, 255),
        FILLED,
        LINE_8);

    MyLine(rook_image, Point(0, 15 * w / 16), Point(w, 15 * w / 16));
    MyLine(rook_image, Point(w / 4, 7 * w / 8), Point(w / 4, w));
    MyLine(rook_image, Point(w / 2, 7 * w / 8), Point(w / 2, w));
    MyLine(rook_image, Point(3 * w / 4, 7 * w / 8), Point(3 * w / 4, w));

    imshow(atom_window, atom_image);
    moveWindow(atom_window, 0, 200);

    imshow(rook_window, rook_image);
    moveWindow(rook_window, w, 200);

    waitKey(0);
    return(0);
}
void MyEllipse(Mat img, double angle)
{
    int thickness = 2;
    int lineType = 8;
    ellipse(img,
        Point(w / 2, w / 2),
        Size(w / 4, w / 16),
        angle,
        0,
        360,
        Scalar(255, 0, 0),
        thickness,
        lineType);
}
void MyFilledCircle(Mat img, Point center)
{
    circle(img,
        center,
        w / 32,
        Scalar(0, 0, 255),
        FILLED,
        LINE_8);
}
void MyPolygon(Mat img)
{
    int lineType = LINE_8;
    Point rook_points[1][20];
    rook_points[0][0] = Point(w / 4, 7 * w / 8);
    rook_points[0][1] = Point(3 * w / 4, 7 * w / 8);
    rook_points[0][2] = Point(3 * w / 4, 13 * w / 16);
    rook_points[0][3] = Point(11 * w / 16, 13 * w / 16);
    rook_points[0][4] = Point(19 * w / 32, 3 * w / 8);
    rook_points[0][5] = Point(3 * w / 4, 3 * w / 8);
    rook_points[0][6] = Point(3 * w / 4, w / 8);
    rook_points[0][7] = Point(26 * w / 40, w / 8);
    rook_points[0][8] = Point(26 * w / 40, w / 4);
    rook_points[0][9] = Point(22 * w / 40, w / 4);
    rook_points[0][10] = Point(22 * w / 40, w / 8);
    rook_points[0][11] = Point(18 * w / 40, w / 8);
    rook_points[0][12] = Point(18 * w / 40, w / 4);
    rook_points[0][13] = Point(14 * w / 40, w / 4);
    rook_points[0][14] = Point(14 * w / 40, w / 8);
    rook_points[0][15] = Point(w / 4, w / 8);
    rook_points[0][16] = Point(w / 4, 3 * w / 8);
    rook_points[0][17] = Point(13 * w / 32, 3 * w / 8);
    rook_points[0][18] = Point(5 * w / 16, 13 * w / 16);
    rook_points[0][19] = Point(w / 4, 13 * w / 16);
    const Point* ppt[1] = { rook_points[0] };
    int npt[] = { 20 };
    fillPoly(img,
        ppt,
        npt,
        1,
        Scalar(255, 255, 255),
        lineType);
}
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);
}

解釋

繪制兩個(gè)例子(一個(gè)原子和一個(gè)車)度苔,我們必須創(chuàng)建兩個(gè)圖像和兩個(gè)窗口來顯示它們。

char atom_window[] = "Drawing 1: Atom";
char rook_window[] = "Drawing 2: Rook";
Mat atom_image = Mat::zeros(w, w, CV_8UC3);
Mat rook_image = Mat::zeros(w, w, CV_8UC3);

我們創(chuàng)建了繪制不同幾何形狀的功能浑度。例如寇窑,為了繪制原子,我們使用MyEllipse和MyFilledCircle:

MyEllipse(atom_image, 90);
MyEllipse(atom_image, 0);
MyEllipse(atom_image, 45);
MyEllipse(atom_image, -45);
MyFilledCircle(atom_image, Point(w / 2, w / 2));

并提請(qǐng)我們所使用的車MYLINE箩张,矩形和MyPolygon:

MyPolygon(rook_image);
rectangle(rook_image,
    Point(0, 7 * w / 8),
    Point(w, w),
    Scalar(0, 255, 255),
    FILLED,
    LINE_8);
MyLine(rook_image, Point(0, 15 * w / 16), Point(w, 15 * w / 16));
MyLine(rook_image, Point(w / 4, 7 * w / 8), Point(w / 4, w));
MyLine(rook_image, Point(w / 2, 7 * w / 8), Point(w / 2, w));
MyLine(rook_image, Point(3 * w / 4, 7 * w / 8), Point(3 * w / 4, w));

MyLine

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);
}

我們可以看到甩骏,MyLine只是調(diào)用函數(shù)line(),它執(zhí)行以下操作:

  • 開始點(diǎn)結(jié)束點(diǎn)繪制一條線
  • 該行顯示在圖像img中
  • 線顏色由(0,0,0)定義, 它是與黑色相對(duì)應(yīng)的RGB值
  • 線厚度設(shè)定為thickness(在這種情況下為2)
  • 線是8連接線(lineType = 8)

MyEllipse

void MyEllipse(Mat img, double angle)
{
    int thickness = 2;
    int lineType = 8;
    ellipse(img,
        Point(w / 2, w / 2),
        Size(w / 4, w / 16),
        angle,
        0,
        360,
        Scalar(255, 0, 0),
        thickness,
        lineType);
}

從上面的代碼先慷,我們可以看到函數(shù)ellipse()繪制一個(gè)橢圓饮笛,使得:

  • 橢圓顯示在圖像img中
  • 橢圓中心位于(w / 2,w / 2)點(diǎn), 大小(w / 4论熙,w / 16)
  • 定義橢圓旋轉(zhuǎn)角度
  • 橢圓延伸0360度之間的圓弧
  • 圖中的顏色將為(255,0,0)福青,表示BGR值為藍(lán)色。
  • 橢圓的厚度為2

MyFilledCircle

void MyFilledCircle(Mat img, Point center)
{
    circle(img,
        center,
        w / 32,
        Scalar(0, 0, 255),
        FILLED,
        LINE_8);
}

類似于橢圓函數(shù)脓诡,我們可以觀察到圓接受作為參數(shù):

  • 將圓圈顯示到圖像(img)
  • 圓的中心表示為點(diǎn)中心
  • 圓的半徑:w / 32
  • 圓的顏色:(0,0,255)无午,表示BGR中的紅色
  • 由于厚度 = -1,圓將被繪制填充

MyPolygon

void MyPolygon(Mat img)
{
    int lineType = LINE_8;
    Point rook_points[1][20];
    rook_points[0][0] = Point(w / 4, 7 * w / 8);
    rook_points[0][1] = Point(3 * w / 4, 7 * w / 8);
    rook_points[0][2] = Point(3 * w / 4, 13 * w / 16);
    rook_points[0][3] = Point(11 * w / 16, 13 * w / 16);
    rook_points[0][4] = Point(19 * w / 32, 3 * w / 8);
    rook_points[0][5] = Point(3 * w / 4, 3 * w / 8);
    rook_points[0][6] = Point(3 * w / 4, w / 8);
    rook_points[0][7] = Point(26 * w / 40, w / 8);
    rook_points[0][8] = Point(26 * w / 40, w / 4);
    rook_points[0][9] = Point(22 * w / 40, w / 4);
    rook_points[0][10] = Point(22 * w / 40, w / 8);
    rook_points[0][11] = Point(18 * w / 40, w / 8);
    rook_points[0][12] = Point(18 * w / 40, w / 4);
    rook_points[0][13] = Point(14 * w / 40, w / 4);
    rook_points[0][14] = Point(14 * w / 40, w / 8);
    rook_points[0][15] = Point(w / 4, w / 8);
    rook_points[0][16] = Point(w / 4, 3 * w / 8);
    rook_points[0][17] = Point(13 * w / 32, 3 * w / 8);
    rook_points[0][18] = Point(5 * w / 16, 13 * w / 16);
    rook_points[0][19] = Point(w / 4, 13 * w / 16);
    const Point* ppt[1] = { rook_points[0] };
    int npt[] = { 20 };
    fillPoly(img,
        ppt,
        npt,
        1,
        Scalar(255, 255, 255),
        lineType);
}

要繪制一個(gè)填充的多邊形祝谚,我們使用函數(shù)fillPoly()宪迟。我們注意到:

  • 多邊形將在img上繪制
  • 多邊形的頂點(diǎn)是ppt中的一組點(diǎn)
  • 多邊形的顏色由(255,255,255)定義,它是白色的BGR值

結(jié)果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踊跟,一起剝皮案震驚了整個(gè)濱河市踩验,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌商玫,老刑警劉巖箕憾,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拳昌,居然都是意外死亡袭异,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門炬藤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來御铃,“玉大人碴里,你說我怎么就攤上這事∩险妫” “怎么了咬腋?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)睡互。 經(jīng)常有香客問我根竿,道長(zhǎng),這世上最難降的妖魔是什么就珠? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任寇壳,我火速辦了婚禮,結(jié)果婚禮上妻怎,老公的妹妹穿的比我還像新娘壳炎。我一直安慰自己,他們只是感情好逼侦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布匿辩。 她就那樣靜靜地躺著,像睡著了一般偿洁。 火紅的嫁衣襯著肌膚如雪撒汉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天涕滋,我揣著相機(jī)與錄音睬辐,去河邊找鬼。 笑死宾肺,一個(gè)胖子當(dāng)著我的面吹牛溯饵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锨用,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丰刊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了增拥?” 一聲冷哼從身側(cè)響起啄巧,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掌栅,沒想到半個(gè)月后秩仆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猾封,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年澄耍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡齐莲,死狀恐怖痢站,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情选酗,我是刑警寧澤阵难,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站星掰,受9級(jí)特大地震影響多望,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氢烘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望家厌。 院中可真熱鬧播玖,春花似錦、人聲如沸饭于。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掰吕。三九已至果覆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間殖熟,已是汗流浹背局待。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留菱属,地道東北人钳榨。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纽门,于是被迫代替她去往敵國(guó)和親薛耻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容