1. 概述
在OpenCV中,調(diào)用cv2.putText()函數(shù)可添加文字到指定位置,對(duì)于需要在圖片中加入文字的場(chǎng)景提供了一種比較直接方便的方式。
注意:OpenCV 不支持顯示中文字符,使用 cv2.putText() 時(shí)添加的文本字符串不能包含中文字符(包括中文標(biāo)點(diǎn)符號(hào))
2. cv2.putText()函數(shù)參數(shù)
其函數(shù)原型如下所示:
cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
上述參數(shù)分別表示:
-
img:需要繪制文本的圖像;
-
text:要繪制的文本內(nèi)容;
-
org:表示要繪制的位置,圖像中文本字符串的左下角;可以用一個(gè)元祖來(lái)表示x、y坐標(biāo),例如(10, 100)表示x=10,y=100。
-
fontFace:字體類型,如cv2.FONT_HERSHEY_SIMPLEX、cv2.FONT_HERSHEY_PLAIN等;對(duì)應(yīng)的字體類型如下:
cv2.FONT_ITALIC:斜體字的標(biāo)志 cv2.FONT_HERSHEY_PLAIN:小尺寸無(wú)襯線字體 cv2.FONT_HERSHEY_SIMPLEX:正常大小的無(wú)襯線字體 cv2.FONT_HERSHEY_DUPLEX:正常大小的無(wú)襯線字體(比FONT_HERSHEY_SIMPLEX更復(fù)雜) cv2.FONT_HERSHEY_COMPLEX:正常大小的襯線字體 cv2.FONT_HERSHEY_TRIPLEX:正常大小的襯線字體(比FONT_HERSHEY_COMPLEX更復(fù)雜) cv2.FONT_HERSHEY_SCRIPT_SIMPLEX:手寫體字體 cv2.FONT_HERSHEY_SCRIPT_COMPLEX(比FONT_HERSHEY_SCRIPT_SIMPLEX的更復(fù)雜)
-
fontScale:字體的大小,字體比例因子乘以font-specific基本大小;
-
color:文本字體顏色,設(shè)置三通道的元組BGR,比如(255,0,0)
常見顏色:
red (0, 0, 255)
green (0, 128, 0)
blue (255, 0, 0)
yellow (0, 255, 255)
purple (128, 0, 128)
orange (0, 165, 255)
white (255, 255, 255)
black (0, 0, 0)
gray (128, 128, 128) -
thickness:字體粗細(xì),默認(rèn)為1;
-
lineType:線條類型,默認(rèn)為cv2.LINE_AA;
-
bottomLeftOrigin:坐標(biāo)原點(diǎn),如果為真,則圖像數(shù)據(jù)原點(diǎn)位于左下角,否則它在左上角;
其中,org定義了文本起始位置,可以用一個(gè)元祖來(lái)表示x、y坐標(biāo),例如(10, 100)表示x=10,y=100。
3. 圖像上繪制非中文文字
import cv2
img = cv2.imread('test.png') # 讀取彩色圖像(BGR)
cv2.putText(img, '@Elaine', (300, 40), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 128), 2, cv2.LINE_AA)
cv2.imshow('test', img) # 顯示疊加圖像
cv2.waitKey() # 等待按鍵命令
效果展示:
4. 圖像上繪制中文文字
(1) 如果不做處理,直接使用cv2.putText()展示,中文會(huì)變成?,OpenCV 不支持顯示中文字符。
import cv2
img = cv2.imread('test.png') # 讀取彩色圖像(BGR)
cv2.putText(img, '@Elaine猿', (300, 40), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 128), 2, cv2.LINE_AA)
cv2.imshow('test', img) # 顯示疊加圖像
cv2.waitKey() # 等待按鍵命令
效果展示:
(2) 在圖像中添加中文字符,可以使用 opencv+PIL 實(shí)現(xiàn)
注意Image.fromarray()與np.array()之間的相互轉(zhuǎn)化
參考鏈接:https://blog.csdn.net/qq_41273999/article/details/134569426?spm=1001.2014.3001.5501
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np
img = cv2.imread('test.png') # 讀取彩色圖像(BGR)
imgPIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# cv2.putText(img, '@Elaine猿', (300, 40), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 128), 2, cv2.LINE_AA)
drawPIL = ImageDraw.Draw(imgPIL)
textSize = 35
fontText = ImageFont.truetype("font/simsun.ttc", textSize, encoding="utf-8")
pos = (300, 40) # (left, top),字符串左上角坐標(biāo)
text = '@Elaine猿'
color = (128, 128, 128) # gray
drawPIL.text(pos, text, color, font=fontText)
imgPutText = cv2.cvtColor(np.asarray(imgPIL), cv2.COLOR_RGB2BGR)
cv2.imshow('test', imgPutText) # 顯示疊加圖像
cv2.waitKey() # 等待按鍵命令
效果展示:
5. 圖片上添加傾斜透明文字水印
方法1:
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import cv2
# 讀取彩色圖像(BGR)
img = cv2.imread('test.png')
imgPIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 圖片的顏色模式設(shè)置為RGBA
img_RGBA = imgPIL.convert('RGBA')
# 新建一個(gè)和原圖大小一樣的水印覆蓋層
text_overlay = Image.new('RGBA', img_RGBA.size, (255, 255, 255, 0))
# 創(chuàng)建一個(gè)畫圖對(duì)象
drawPIL = ImageDraw.Draw(text_overlay)
# 設(shè)置字體大小
textSize = 35
fontText = ImageFont.truetype("font/simsun.ttc", textSize, encoding="utf-8")
# 在指定位置畫上文字水印
box = drawPIL.textbbox((0, 0), '@Elaine猿', font=fontText)
text_width, text_height = box[2], box[3]
x = img_RGBA.width / 2 - text_width / 2
y = img_RGBA.height / 2 - text_height / 2
# fill參數(shù)的(128, 128, 128)為顏色gray, 最后一位為透明度
drawPIL.text((x, y), '@Elaine猿', font=fontText, fill=(128, 128, 128, 160))
# 設(shè)置文本旋轉(zhuǎn)角度
angle = 20
# 中心點(diǎn)
center = (img_RGBA.width / 2, img_RGBA.height / 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
text_overlay = cv2.warpAffine(np.array(text_overlay), M, (img_RGBA.width, img_RGBA.height), flags=cv2.INTER_CUBIC,
borderMode=cv2.BORDER_REPLICATE)
text_overlay = Image.fromarray(text_overlay)
# 合成透明圖像和背景不透明圖像
img_RGBA = Image.alpha_composite(img_RGBA, text_overlay)
img_RGB = img_RGBA.convert('RGB')
imgPutText = cv2.cvtColor(np.asarray(img_RGB), cv2.COLOR_RGB2BGR)
cv2.imshow('test', imgPutText) # 顯示疊加圖像
cv2.waitKey() # 等待按鍵命令
效果展示:
方法二:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-758631.html
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import cv2
# 打開圖片Image格式
img = Image.open('test.png')
# 圖片的顏色模式設(shè)置為RGBA
img_RGBA = img.convert('RGBA')
# 新建一個(gè)和原圖大小一樣的水印覆蓋層
text_overlay = Image.new('RGBA', img_RGBA.size, (255, 255, 255, 0))
# 創(chuàng)建一個(gè)畫圖對(duì)象
image_draw = ImageDraw.Draw(text_overlay)
# 設(shè)置字體大小
text_size = 20
font = ImageFont.truetype("font/simsun.ttc", text_size, encoding="utf-8")
# 在指定位置畫上文字水印
text = '@Elaine猿'
box = image_draw.textbbox((0, 0), text, font=font)
text_width, text_height = box[2], box[3]
x = img_RGBA.width / 2 - text_width / 2
y = img_RGBA.height / 2 - text_height / 2
# fill參數(shù)的(128, 128, 128)為顏色gray, 最后一位為透明度
image_draw.text((x, y), text, font=font, fill=(128, 128, 128, 800))
# 設(shè)置文本旋轉(zhuǎn)角度
angle = 30
# 中心點(diǎn)
center = (img_RGBA.width / 2, img_RGBA.height / 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
text_overlay = cv2.warpAffine(np.array(text_overlay), M, (img_RGBA.width, img_RGBA.height), flags=cv2.INTER_CUBIC,
borderMode=cv2.BORDER_REPLICATE)
text_overlay = Image.fromarray(text_overlay)
# 合成透明圖像和背景不透明圖像
img_RGBA = Image.alpha_composite(img_RGBA, text_overlay)
img_RGB = img_RGBA.convert('RGB')
img_RGB.show()
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-758631.html
到了這里,關(guān)于【OpenCV】圖像上繪制文字cv2.putText()函數(shù)用法,添加傾斜透明水印的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!