番外3. Python OpenCV 中如何繪制各種圖形?

      網(wǎng)友投稿 1054 2025-03-31

      本系列專欄寫作方式

      本系列專欄寫作將采用首創(chuàng)的問答式寫作形式,快速讓你學(xué)習(xí)到 OpenCV 的初級(jí)、中級(jí)、高級(jí)知識(shí)。

      3. Python OpenCV 中如何繪制各種圖形?

      本篇博客主要分享一下在 Python OpenCV 中繪制不同的幾何圖形。

      這里的幾何圖形,主要涉及的是平面圖形,例如直線,圓形,矩形,橢圓形,當(dāng)然在圖像上繪制文字也屬于圖形范疇

      涉及到的具體函數(shù)包括 cv2.line、 cv2.circle、 cv2.rectangle、 cv2.ellipse、 cv2.putText

      接下來我們將針對(duì)這些函數(shù)進(jìn)行說明,重點(diǎn)會(huì)為你解釋這些函數(shù)使用過程中存在的各種問題。

      上述函數(shù)雖然數(shù)量較多,但是函數(shù)內(nèi)部的參數(shù)大致一樣,都包括如下內(nèi)容,可以提前記憶一下

      image:要操作的圖像,就是你要在上面繪制圖形的原圖;

      color:圖形的顏色,以 BGR 為例,參數(shù)的數(shù)據(jù)類型是一個(gè)元組,所以參數(shù)格式為 (0,0,255)紅色,如果是灰度圖,只需要傳入一個(gè)灰度值即可;

      thickness:圖形的線條粗細(xì),默認(rèn)值是 1,如果希望圖形內(nèi)部全部填充,即閉合圖形,需要設(shè)置為 -1;

      linetype:線條的類型,8 連通線,4 連通線,抗鋸齒,默認(rèn)是 8 連通線,如果開啟抗鋸齒,效率有影響,但是線條會(huì)變的平滑,一般情況下,省略即可,非必填項(xiàng)。

      繪制直線 cv2.line

      函數(shù)的基本使用和效果可以參考下述代碼:

      import numpy as np import cv2 # 創(chuàng)建一個(gè) 400 * 400 的 3 通道黑色圖片 img = np.zeros((400, 400, 3), np.uint8) # 畫一條線 cv2.line(img, (0, 0), (250, 250), (0, 0, 255), 3) cv2.namedWindow("img", cv2.WINDOW_AUTOSIZE) cv2.imshow("img", img) cv2.waitKey()

      代碼運(yùn)行結(jié)果是從坐標(biāo)(0,0)點(diǎn)到 (250,250)點(diǎn)繪制一條紅色的、線條粗細(xì)為 3 的直線。

      上述代碼基本使用是沒有問題的,也很容易看懂,常見的問題如下,在代碼執(zhí)行的時(shí)候,會(huì)因?yàn)樽鴺?biāo)點(diǎn)元組的數(shù)據(jù)類型報(bào)錯(cuò),錯(cuò)誤提示如下:

      TypeError: integer argument expected, got float

      該問題是由于下述代碼樣例造成的。

      # 畫一條線,注意第二個(gè)坐標(biāo)點(diǎn)元組中值的類型為 float cv2.line(img, (0, 0), (250.0, 250.0), (0, 0, 255), 3)

      既然是類型錯(cuò)誤,直接修改數(shù)據(jù)類型即可。

      第二點(diǎn)需要注意的問題是,該類型函數(shù)在原圖像上進(jìn)行圖形繪制,不需要額外通過變量接收返回值,所以下述是正確的,但是很少出現(xiàn)。

      # 畫一條線 new_img = cv2.line(img, (0, 0), (250, 250), (0, 0, 255), 3)

      備注一下該函數(shù)的原型:

      line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img

      繪制矩形 cv2.rectangle

      矩形繪制只需要知道待繪制矩形左上角頂點(diǎn)坐標(biāo)和右下角頂點(diǎn)坐標(biāo)即可實(shí)現(xiàn)。

      例如下述代碼:

      cv2.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 3, cv2.LINE_4)

      函數(shù)的基本使用依舊不在本文范圍內(nèi),你需要注意一點(diǎn),兩個(gè)坐標(biāo)點(diǎn)嚴(yán)格說并沒有先后順序。

      只要是矩形對(duì)角線上的兩個(gè)點(diǎn)就可以,核心是依據(jù)元組的值進(jìn)行運(yùn)算的,例如下面兩行代碼得到的矩形一致

      cv2.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 3, cv2.LINE_4) cv2.rectangle(img, (200, 200), (100, 100), (0, 255, 0), 3, cv2.LINE_4)

      繪制矩形也會(huì)出現(xiàn)下述代碼異常,即數(shù)據(jù)類型問題,例如:

      TypeError: argument for rectangle() given by name ('thickness') and position (4)

      該異常如果出現(xiàn),原因是 thickness參數(shù)提供了非整數(shù)類型的值,例如 thickness = 4.0

      其它更多內(nèi)容,可以參看文檔

      繪制圓形與橢圓形 cv2.circle 和 cv2.ellipse

      在 OpenCV 中繪制圓形與橢圓形方法基本一致,使用 help 函數(shù)可以得到相關(guān)用法。

      circle(img, center, radius, color[, thickness[, lineType[, shift]]]) -> img

      該函數(shù)與上面兩個(gè)的差異是多出 center 與 radius 參數(shù),含義分別是中心點(diǎn)與半徑。

      測(cè)試案例如下:

      cv2.circle(img, (200, 200), 100, (255, 0, 0)) cv2.namedWindow("img", cv2.WINDOW_AUTOSIZE) cv2.imshow("img", img) cv2.waitKey()

      運(yùn)行效果如下圖所示:

      橢圓形繪制的函數(shù)原型如下:

      ellipse(img, center, axes, angle, start_angle, end_angle, color, thickness=1, lineType=8, shift=0)

      新增參數(shù)是 center,axes,angle,start_angle,end_angle。

      先測(cè)試一下相關(guān)函數(shù),然后在解決常見的問題。

      cv2.ellipse(img, (200, 200), (100, 50), 0, 0, 180, (0, 0, 255))

      該代碼運(yùn)行之后,會(huì)形成如下圖形,以上參數(shù)解釋在圖片后面。

      番外3. Python OpenCV 中如何繪制各種圖形?

      center:橢圓的中心點(diǎn);

      axes:橢圓長軸與短軸,使用元組表示,例如(100,50)

      angle:繪制的橢圓旋轉(zhuǎn)的角度,你可以嘗試 0 度,90 度,該角度為順時(shí)針旋轉(zhuǎn);

      start_angle,end_angle:橢圓弧起始角度與結(jié)束角度。

      測(cè)試 angle 參數(shù),可以使用下面代碼查閱。

      cv2.ellipse(img, (200, 200), (100, 50), 0, 0, 180, (0, 255, 0)) cv2.ellipse(img, (200, 200), (100, 50), 60, 0, 180, (0, 0, 255)) cv2.namedWindow("img", cv2.WINDOW_AUTOSIZE) cv2.imshow("img", img) cv2.waitKey()

      運(yùn)行結(jié)果如下所示

      按照函數(shù)簡介,我們可以知道繪制整個(gè)橢圓是 0,360,繪制下半橢圓就是 0,180。

      在繪制橢圓形的時(shí)候,如果想要獲得一個(gè)實(shí)心的橢圓,按照如下代碼進(jìn)行設(shè)置,當(dāng)然下面的代碼繪制的依舊是一個(gè)半橢圓,你可以進(jìn)行修改,實(shí)現(xiàn)循環(huán)繪制。

      cv2.ellipse(img, (200, 200), (100, 50), 0, 0, 45, (0, 255, 0),-1) cv2.ellipse(img, (200, 200), (100, 50), 0, 45, 90, (0, 0, 255),-1) cv2.ellipse(img, (200, 200), (100, 50), 0, 90, 135, (255, 0, 0),-1) cv2.ellipse(img, (200, 200), (100, 50), 0, 135, 180, (255, 255, 0),-1)

      圖像繪制文字 cv2.putText

      在圖像上繪制問題最大的問題是中文問題,并且該問題無法使用 OPenCV 自行解決,網(wǎng)上提供的策略也是采用 PIL 繪制文字,大家可以直接參考即可。

      核心原因是因?yàn)?cv2.putText 不支持完整 ASCII 字符,只支持一部分,更不用說 unicode 字符了,所以只能用 PIL 進(jìn)行繪制。

      該函數(shù)的原型如下:

      putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) -> img

      其中差異化的參數(shù)分別是: text 、 org 、 fontFace 、 fontScale

      先實(shí)現(xiàn)案例,在對(duì)其進(jìn)行說明:

      cv2.putText(img, 'OpenCV', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

      關(guān)于 fontFace 參數(shù),我直接查閱了 OPenCV 的 C++源碼,提供給你作為參考:

      //! Only a subset of Hershey fonts enum HersheyFonts { FONT_HERSHEY_SIMPLEX = 0, //!< normal size sans-serif font FONT_HERSHEY_PLAIN = 1, //!< small size sans-serif font FONT_HERSHEY_DUPLEX = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX) FONT_HERSHEY_COMPLEX = 3, //!< normal size serif font FONT_HERSHEY_TRIPLEX = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX) FONT_HERSHEY_COMPLEX_SMALL = 5, //!< smaller version of FONT_HERSHEY_COMPLEX FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX FONT_ITALIC = 16 //!< flag for italic font };

      其它的參數(shù),最重要的就是 fontScale 字體大小了。

      學(xué)了這個(gè)函數(shù)之后,我們可以操作視頻文件,然后添加英文字體水印了,修改上篇博客對(duì)應(yīng)位置,最終結(jié)果如下所示

      寫在最后:網(wǎng)上的很多資料都會(huì)告訴你,這些圖形函數(shù)沒有返回值,一般給你的函數(shù)原型如下:

      cv.Circle(img, center, radius, color, thickness=1, lineType=8, shift=0) → None

      視頻文件,然后添加英文字體水印了,修改上篇博客對(duì)應(yīng)位置,最終結(jié)果如下所示

      寫在最后:網(wǎng)上的很多資料都會(huì)告訴你,這些圖形函數(shù)沒有返回值,一般給你的函數(shù)原型如下:

      cv.Circle(img, center, radius, color, thickness=1, lineType=8, shift=0) → None

      注意,這個(gè)是錯(cuò)誤的,3.0 以上版本,本文涉及的函數(shù)都是有返回值的,不再為空值,學(xué)習(xí)的時(shí)候,請(qǐng)進(jìn)行實(shí)際測(cè)試。

      OpenCV Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:WPS表格中怎么改變工作表標(biāo)簽顏色(wps文檔表格顏色怎么改)
      下一篇:讓字體的顏色變淡一些(怎么把字體的顏色變淺)
      相關(guān)文章
      亚洲熟妇中文字幕五十中出| 久久久久亚洲精品日久生情| 亚洲国产视频网站| 亚洲人成色77777| 亚洲乱码国产一区网址| 亚洲成a人在线看天堂无码| 亚洲国产成人AV网站| 亚洲精品久久久久无码AV片软件| 亚洲国产精品免费观看| 中中文字幕亚洲无线码| 国产成人精品亚洲2020| 亚洲精品午夜国产va久久| 亚洲一区二区三区成人网站 | 亚洲国产综合在线| 亚洲成年人电影在线观看| 亚洲欧洲日韩国产| 亚洲国语在线视频手机在线| 亚洲国产成人超福利久久精品| 亚洲最大免费视频网| 亚洲AV无码一区二区三区人| 久久精品国产99国产精品亚洲| 亚洲影视自拍揄拍愉拍| 亚洲无线码一区二区三区| 久久久无码精品亚洲日韩京东传媒| 亚洲Aⅴ无码专区在线观看q| 久久精品国产96精品亚洲| 亚洲人成影院在线| 亚洲美女视频免费| 亚洲制服丝袜精品久久| 久久亚洲精品国产精品婷婷| 亚洲乱码国产乱码精华| 国产精品亚洲а∨无码播放麻豆| 亚洲国产精品碰碰| 亚洲精品乱码久久久久久按摩 | 亚洲欧洲国产成人精品| 亚洲香蕉久久一区二区三区四区| 亚洲日韩一区精品射精| 国产产在线精品亚洲AAVV| 国产亚洲精品不卡在线| 亚洲成av人影院| 亚洲精品一区二区三区四区乱码|