一、簡介
OpenCV庫是一個開源計算機視覺庫,旨在提供用於人工智能、深度學習、機器人、編程和計算機視覺研究的基本工具。其中,OpenCV putText函數是一個常用的圖像處理函數,用於將文本字符串繪製在圖像上。
二、函數參數
putText函數有以下參數:
void 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:表示輸入的圖像,可以是Mat類型或UMat類型
- text:表示要在圖像上繪製的文本字符串
- org:表示繪製文本的位置,是一個二維的坐標值(x,y)
- fontFace:表示字體類型,如FONT_HERSHEY_SIMPLEX、FONT_HERSHEY_PLAIN、FONT_HERSHEY_DUPLEX等
- fontScale:表示字體大小的縮放因子
- color:表示文本字符串的顏色,包括RGB顏色值(例如Scalar(0,255,0)表示綠色,Scalar(255,0,0)表示藍色等)
- thickness:表示文本字符串的粗細程度(一般為1~10之間的整數,值越大表示越粗的字體)
- lineType:表示線條的類型,常用的有LINE_4、LINE_8、LINE_AA等
- bottomLeftOrigin:表示文本字符串的起始繪圖位置,如果為false,則默認以左上角點作為起始位置,如果為true,則以左下角點作為起始位置
三、函數用例
下面給出一些putText函數的用例。
1. 文字水印
在圖像上加入文字水印是OpenCV中的常見應用之一,可以有效抵禦圖片盜用、轉載、傳播等行為。下面介紹如何在一張圖片上加上水印。
cv::Mat image = cv::imread("input.jpg");
std::string text = "By Li Ming";
cv::putText(image, text, cv::Point(50, 50), cv::FONT_HERSHEY_SIMPLEX,1.5,cv::Scalar(0, 0, 255),2,LINE_AA);
cv::imwrite("output.jpg", image);
這段代碼中,我們用imread函數讀入了一張圖片,並定義了水印文本text,使用putText函數在坐標(50, 50)處把文本寫入圖片中。最後使用imwrite函數把寫好水印的圖片保存下來。
2. 多行文字
如果需要在一塊區域內寫入多行文字,可以利用putText函數的高度計算功能來實現,具體做法是先計算出字體的高度,然後依次寫入不同的行。
cv::Mat image = cv::imread("input.jpg");
std::string text = "OpenCV\nputText\nFunction";
cv::Scalar textColor = cv::Scalar(0, 0, 255);
double fontScale = 2;
int thickness = 2;
int fontFace = cv::FONT_HERSHEY_SIMPLEX;
int baseline=0;
Size textSize = cv::getTextSize(text, fontFace, fontScale, thickness, &baseline);
Point textOrg((image.cols - textSize.width)/2, (image.rows + textSize.height)/2);
cv::putText(image, text, textOrg, fontFace, fontScale, textColor, thickness);
cv::imwrite("output.jpg", image);
這段代碼中,我們定義了一個多行文本字符串,並把它寫在了中央位置。先通過getTextSize函數來計算字體高度,計算好之後,再根據圖像大小和字體高度來確定文本的繪製位置。這裡使用的是cv::FONT_HERSHEY_SIMPLEX字體,字號為2,字體顏色為紅色,字體粗細為2px。
3. 文字輪廓
通過調整putText函數的粗細參數,can實現繪製文字輪廓的功能,常用於實現一些炫酷的效果。例如下面的代碼片段實現在圖像上繪製帶有輪廓的文字。
//讀入圖像
Mat img = imread("input.jpg", IMREAD_COLOR);
//現在在原圖像上繪製文字
putText(img, "OpenCV", Point(50, 50), FONT_HERSHEY_SIMPLEX, 2.0, Scalar(0, 255, 0), 3, LINE_AA, false);
//設置輸出圖像的大小
Size sz1 = img.size();
int h1 = sz1.height;
int w1 = sz1.width;
//初始化新圖像
Mat img_new=cv::Mat::zeros(w1, h1, CV_8UC1);
//將原圖像轉為灰度圖像
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
//用Canny函數計算邊緣
Canny(gray, img_new, 100, 200, 3);
//顯示輸出圖像
imshow("Output Image", img_new);
waitKey(0);
以上代碼首先讀入一張彩色圖像,然後利用putText函數在圖像上繪製文本字符串。接下來,我們將原圖像轉為灰度圖像,並利用Canny函數計算圖像邊緣。最後將邊緣圖輸出並顯示。
4. 色彩變換
putText函數除了可以繪製文字,還可以結合一些顏色變換函數,實現一些炫酷的效果。例如,可以結合applyColorMap函數實現對文字顏色漸變的效果。下面是一段代碼示例:
Mat image = imread("input.jpg");
String text = "OpenCV";
int fontFace = cv::FONT_HERSHEY_SIMPLEX;
double fontScale = 2;
int thickness = 2;
int colorMap = cv::COLORMAP_RAINBOW;
int stepSize = 4;
Mat heatMap;
applyColorMap(image, heatMap, colorMap);
cvtColor(heatMap, heatMap, cv::COLOR_BGR2GRAY);
flip(heatMap,heatMap,0);
Mat outputImage = Mat::zeros(image.rows,image.cols,heatMap.type());
putText(outputImage,text,Point(150,150),fontFace,fontScale,Scalar(0,255,0),thickness);
for(int i=0;i<(image.rows)-stepSize;i+=stepSize)
{
for(int j=0;j<(image.cols)-stepSize;j+=stepSize)
{
Rect ROI = Rect(i,j,stepSize,stepSize);
Mat colorROI = heatMap(ROI);
Scalar colour = mean(colorROI);
rectangle(outputImage, Rect(i,j,stepSize,stepSize), colour, -1, 8);
}
}
imshow("Output Image", outputImage);
waitKey(0);
這段代碼首先讀入一張圖像,然後使用applyColorMap函數將圖像轉化為熱度圖。接着把熱度圖轉為灰度圖,並實現了一個綠色的文本字符串。最後,我們在熱度圖上按矩形遍歷,並根據矩形內像素的平均顏色填充矩形,實現了一個絢麗的色彩效果。
四、結語
OpenCV putText函數可以在圖像上繪製出各種風格的文本,對於熟練使用OpenCV的開發者來說非常實用。文章介紹了putText函數的基本用法,也給出了一些實用的代碼示例,希望對大家的OpenCV開發工作有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/282972.html