OpenCV putText函數詳解

一、簡介

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-hk/n/282972.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 08:06
下一篇 2024-12-22 08:06

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • 如何在PyCharm中安裝OpenCV?

    本文將從以下幾個方面詳細介紹如何在PyCharm中安裝OpenCV。 一、安裝Python 在安裝OpenCV之前,請確保已經安裝了Python。 如果您還沒有安裝Python,可…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python OpenCV 直線檢測

    本文將介紹在Python OpenCV中進行直線檢測的方法,主要涉及到圖像的邊緣檢測、霍夫變換和繪製直線等操作。 一、邊緣檢測 由於直線檢測是從圖像的邊緣開始的,因此必須先找到圖像…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29

發表回復

登錄後才能評論