0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV(C++)創(chuàng)建圖片繪制圖形(矩形、圓、文字、線段等等)

DS小龍哥-嵌入式技術(shù) ? 來源: DS小龍哥-嵌入式技術(shù) ? 作者: DS小龍哥-嵌入式技 ? 2023-06-07 09:19 ? 次閱讀

一、OpenCV介紹

OpenCV 是基于開源許可證的跨平臺計算機視覺庫,提供了一組豐富、廣泛的圖像處理和計算機視覺算法。OpenCV 支持多種編程語言,包括 C++、Python、Java 等,可以運行在 Linux、Windows、Mac OS 等平臺上。

OpenCV 能夠在圖像上繪制各種幾何形狀、文本和曲線,以及對圖像進行調(diào)整、裁剪和旋轉(zhuǎn)等操作,這些功能都為圖像的分析和處理提供了很大的幫助。

以下是 OpenCV 可以繪制圖像的一些應用:

(1)圖像標注:在圖像上添加標注或者注釋,例如在目標檢測或者圖像分類任務中,通過在圖像上繪制框、標簽信息來標記檢測到的目標。

(2)處理后顯示:例如在圖像處理過程中,可以在處理前和處理后的圖像上繪制對比圖,直觀地顯示圖像處理的效果。

(3)實時顯示:通過持續(xù)不斷地在屏幕上繪畫來實現(xiàn)實時顯示效果,例如在視頻處理中輸出處理后的視頻流并將其實時渲染在屏幕上。

二、繪制圖形

【1】繪制圖形彈窗顯示

下面代碼實現(xiàn)的功能:

使用 OpenCV(C++) 新建一張透明圖片,在圖片里繪制一個矩形、一條直線、一段文字、一個圓。

// 創(chuàng)建一張大小為 512x512,具有 alpha 通道的透明圖片
 cv::Mat img(512, 512, CV_8UC4, cv::Scalar(0, 0, 0, 0));
 ?
 // 在圖片上繪制一個矩形
 cv::rectangle(img, cv::Point(50, 50), cv::Point(200, 150), cv::Scalar(255, 0, 0, 255), -1);
 ?
 // 在圖片上繪制一條直線
 cv::line(img, cv::Point(300, 100), cv::Point(450, 100), cv::Scalar(0, 255, 0, 255), 3);
 ?
 // 在圖片上繪制一段文本
 std::string text = "Hello, OpenCV!";
 cv::putText(img, text, cv::Point(50, 300), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255, 255), 2);
 ?
 // 在圖片上繪制一個圓
 cv::circle(img, cv::Point(400, 350), 50, cv::Scalar(255, 255, 0, 255), -1);
 ?
 // 顯示圖片
 cv::imshow("image", img);
 cv::waitKey(0);

cv::Mat 是 OpenCV 中表示圖像的數(shù)據(jù)結(jié)構(gòu),它可以存儲多通道的圖像。

cv::Scalar 是一個四通道的實數(shù)向量,用于表示像素點的顏色和 alpha 值。

cv::Point 是一個二維整型向量,用于表示像素點的坐標。

cv::rectangle 函數(shù)用于在圖片上繪制矩形。

cv::line 函數(shù)用于在圖片上繪制直線。

cv::putText 函數(shù)用于在圖片上繪制文本。

cv::circle 函數(shù)用于在圖片上繪制圓。

【2】繪制圖形保存到本地

// 創(chuàng)建一張大小為 512x512,具有 alpha 通道的透明圖片
 cv::Mat img(512, 512, CV_8UC4, cv::Scalar(0, 0, 0, 0));
 ?
 // 在圖片上繪制一個矩形
 cv::rectangle(img, cv::Point(50, 50), cv::Point(200, 150), cv::Scalar(255, 0, 0, 255), -1);
 ?
 // 在圖片上繪制一條直線
 cv::line(img, cv::Point(300, 100), cv::Point(450, 100), cv::Scalar(0, 255, 0, 255), 3);
 ?
 // 在圖片上繪制一段文本
 std::string text = "Hello, OpenCV!";
 cv::putText(img, text, cv::Point(50, 300), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255, 255), 2);
 ?
 // 在圖片上繪制一個圓
 cv::circle(img, cv::Point(400, 350), 50, cv::Scalar(255, 255, 0, 255), -1);
 ?
 // 保存圖片到本地
 cv::imwrite("output.png", img);

三、函數(shù)功能介紹

【1】繪制直線

cv::line 函數(shù)用于在圖像上繪制一條直線,其參數(shù)如下:

void cv::line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
               int thickness = 1, LineTypes lineType = LINE_8, int shift = 0);
  • img: 輸入輸出參數(shù),表示待繪制的目標圖像。

  • pt1: 輸入?yún)?shù),表示的是直線的起點坐標,是一個 cv::Point 類型的對象。

  • pt2: 輸入?yún)?shù),表示的是直線的終點坐標,也是一個 cv::Point 類型的對象。

  • color: 輸入?yún)?shù),表示繪制直線的顏色以及透明度,是一個 cv::Scalar 類型的對象。常見的顏色有:紅色(0, 0, 255)、綠色(0, 255, 0)、藍色(255, 0, 0)等。

  • thickness: 可選參數(shù),表示繪制直線的寬度。默認值為 1 表示繪制一個像素寬度的直線,如果設(shè)置為負值,則表示繪制一條填充直線。

  • lineType
    

    : 可選參數(shù),表示直線的類型,可以取以下幾個值:

    • cv::LINE_4: 表示繪制一條 4 連通的直線,默認值。
    • cv::LINE_8: 表示繪制一條 8 連通的直線。
    • cv::LINE_AA: 表示繪制一條抗鋸齒的直線。
  • shift: 可選參數(shù),表示坐標點像素值所占用的位數(shù),默認為 0。

【2】繪制圓

cv::circle 函數(shù)用于在圖像上繪制一個圓,其參數(shù)如下:

void cv::circle(InputOutputArray img, Point center, int radius, const Scalar& color,
                 int thickness = 1, LineTypes lineType = LINE_8, int shift = 0);
  • img: 輸入輸出參數(shù),表示待繪制的目標圖像。

  • center: 輸入?yún)?shù),表示圓心坐標,是一個 cv::Point 類型的對象。

  • radius: 輸入?yún)?shù),表示圓的半徑。

  • color: 輸入?yún)?shù),表示繪制圓的顏色以及透明度,是一個 cv::Scalar 類型的對象。

  • thickness: 可選參數(shù),表示圓線條的寬度。默認值為 1 表示繪制一個像素寬度的圓,如果設(shè)置為負值,則表示繪制一條填充的圓。

  • lineType
    

    : 可選參數(shù),表示圓邊界的類型,可以取以下幾個值:

    • cv::LINE_4: 表示繪制四個相鄰的點的圓邊界,默認值。
    • cv::LINE_8: 表示繪制八個相鄰的點的圓邊界。
    • cv::LINE_AA: 表示繪制抗鋸齒的圓邊界。
  • shift: 可選參數(shù),表示坐標點像素值所占用的位數(shù),默認值為 0。

【3】繪制矩形

cv::rectangle 函數(shù)用于在圖像上繪制一個矩形,其參數(shù)如下:

void cv::rectangle(InputOutputArray img, Rect rect, const Scalar& color,
                    int thickness = 1, LineTypes lineType = LINE_8, int shift = 0);
  • img: 輸入輸出參數(shù),表示待繪制的目標圖像。

  • rect: 輸入?yún)?shù),表示矩形,是一個 cv::Rect 類型的對象,可以通過傳遞左上角和右下角坐標的方式來定義一個矩形。

  • color: 輸入?yún)?shù),表示繪制矩形的顏色以及透明度,是一個 cv::Scalar 類型的對象。

  • thickness: 可選參數(shù),表示矩形邊框的寬度。默認值為 1 表示繪制一個像素寬度的矩形,如果設(shè)置為負值,則表示繪制一條填充的矩形。

  • lineType
    

    : 可選參數(shù),表示矩形邊框的類型,可以取以下幾個值:

    • cv::LINE_4: 表示繪制四個相鄰的點的矩形邊框,默認值。
    • cv::LINE_8: 表示繪制八個相鄰的點的矩形邊框。
    • cv::LINE_AA: 表示繪制抗鋸齒的矩形邊框。
  • shift: 可選參數(shù),表示坐標點像素值所占用的位數(shù),默認值為 0。

【4】繪制文本

cv::putText 函數(shù)用于在圖像上繪制文本,其參數(shù)如下:

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);
  • img: 輸入輸出參數(shù),表示待繪制的目標圖像。

  • text: 輸入?yún)?shù),表示要繪制的文本字符串。

  • org: 輸入?yún)?shù),表示文本框左下角的坐標點,是一個 cv::Point 類型的對象。

  • fontFace
    

    : 輸入?yún)?shù),表示字體類型,可以取以下幾個值:

    • cv::FONT_HERSHEY_COMPLEX: 復雜風格字體。
    • cv::FONT_HERSHEY_COMPLEX_SMALL: 小字號復雜風格字體。
    • cv::FONT_HERSHEY_DUPLEX: 雙線條字體。
    • cv::FONT_HERSHEY_PLAIN: 單線條字體。
    • cv::FONT_HERSHEY_SIMPLEX: 正常大小的字體。
    • cv::FONT_HERSHEY_TRIPLEX: 三線條字體。
  • fontScale: 輸入?yún)?shù),表示字體大小縮放比例。

  • color: 輸入?yún)?shù),表示繪制文本的顏色以及透明度,是一個 cv::Scalar 類型的對象。

  • thickness: 可選參數(shù),表示文本輪廓線條的寬度。默認值為 1 表示繪制一個像素寬度的文本,如果設(shè)置為負值,則表示繪制一條填充的文本。

  • lineType
    

    : 可選參數(shù),表示文本邊界的類型,可以取以下幾個值:

    • cv::LINE_4: 表示繪制四個相鄰的點的文本邊界,默認值。
    • cv::LINE_8: 表示繪制八個相鄰的點的文本邊界。
    • cv::LINE_AA: 表示繪制抗鋸齒的文本邊界。
  • bottomLeftOrigin: 可選參數(shù),表示坐標點是否為文本框左下角的坐標點,默認值為 false,表示坐標點為文本框左上角的坐標點。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207921
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2943

    瀏覽量

    104110
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73304
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    622

    瀏覽量

    41091
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84081
收藏 人收藏

    評論

    相關(guān)推薦

    推薦幾個去掉圖片上的文字的技巧!!

     推薦幾個去掉圖片上的文字的技巧!!1、使用仿制圖章工具去除文字。 這是比較常用的方法。具體的操作是,選取仿制圖章工具,按住 Al
    發(fā)表于 06-02 18:08

    VC繪制圖形的示例(含源代碼)

    VC繪制圖形的示例(含源代碼) [hide][/hide]
    發(fā)表于 05-10 10:13

    【安富萊】【STemWin教程】第10章 2-D圖形庫之繪制圖形

    `第10章 2-D圖形庫之繪制圖形 本期主要講解2-D圖形庫的圖形繪制,包括繪制多邊形,
    發(fā)表于 03-25 11:21

    第10章 2-D圖形庫之繪制圖形

    轉(zhuǎn)stemwin教程本期主要講解2-D圖形庫的圖形繪制,包括繪制多邊形,繪制,
    發(fā)表于 10-12 10:13

    國產(chǎn)CAD制圖軟件中閉合命令的使用技巧

    在使用浩辰CAD制圖軟件繪制圖紙的過程中,如果存在不閉合的圖形,有些操作就會無法進行,比如在填充時候則需要填充區(qū)域是封閉的。那么怎么才能將圖形閉合呢?接下來和小編一起來看看國產(chǎn)CAD浩
    發(fā)表于 08-11 15:10

    機械CAD制圖軟件入門教程:繪制倒角/

    在使用浩辰機械CAD制圖軟件繪制圖紙的過程中,如何才能快速的對一些倒角/倒進行處理呢?下面就和小編一起來看看浩辰機械CAD制圖軟件中快速繪制
    發(fā)表于 10-13 14:51

    C語言繪制圖像梯度圖原理介紹

    *2401、采集原始圖像配置ESP32輸出灰度圖,像素太高無法存儲及處理。320*240= 75K。2、圖像梯度計算參考代碼:C語言繪制圖像梯度圖 原理介紹:圖像的梯度 h...
    發(fā)表于 01-11 06:36

    如何將單片機攝像頭讀取回傳的RGB數(shù)組繪制圖片

    咚咚咚的關(guān)于使用Matlab————將單片機攝像頭讀取回傳的RGB數(shù)組繪制圖片(一)效果展示(二)源碼分享(三)需要改進的地方及不足(一)效果展示(二)源碼分享(Excel部分函數(shù))=HEX2BIN
    發(fā)表于 01-20 07:13

    如何使用emWin的API繪制圖形

    應用程序: 此示例代碼使用 emWin 的 API 繪制圖形, 可以用作按鈕, 更改面板上文字編輯的值 。 BSP 版本:M480系列BSP CMSIS V3.03.001 硬件
    發(fā)表于 08-23 07:37

    M480使用emWin的API繪制圖形

    應用程序: 此示例代碼使用 emWin 的 API 繪制圖形, 可以用作按鈕, 更改面板上文字編輯的值 。 BSP 版本:M480系列BSP CMSIS V3.03.001 硬件
    發(fā)表于 08-30 08:58

    C#教程之圖片繪制文字

    C#教程之圖片繪制文字,很好的C#資料,快來學習吧。
    發(fā)表于 04-20 11:13 ?5次下載

    查找和繪制圖片輪廓矩

    OpenCV3編程入門》書本配套源代碼:查找和繪制圖片輪廓矩
    發(fā)表于 06-06 15:20 ?3次下載

    OpenCV3編程入門-源碼例程全集-查找和繪制圖片輪廓矩

    OpenCV3編程入門-源碼例程全集-查找和繪制圖片輪廓矩
    發(fā)表于 09-17 22:54 ?2次下載

    手動版實現(xiàn)帶箭頭的線段繪制

    我根據(jù)一個矩形進行了各種角度旋轉(zhuǎn),就想通過繪制一個帶方向的線段表示它,通過旋轉(zhuǎn)矩陣很容易的獲取了兩個點坐標,但是很快遇到了一個新問題,怎么繪制那個箭頭,就是帶箭頭的
    的頭像 發(fā)表于 05-17 11:24 ?1639次閱讀

    鴻蒙開發(fā)接口圖形圖像:【W(wǎng)ebGL】

    WebGL提供圖形繪制的能力,包括對當前繪制圖形的位置、顏色等進行處理。
    的頭像 發(fā)表于 05-30 09:31 ?391次閱讀
    鴻蒙開發(fā)接口<b class='flag-5'>圖形</b>圖像:【W(wǎng)ebGL】