1. 程式人生 > 實用技巧 >影象加文字與執行時間——opencv

影象加文字與執行時間——opencv

本文轉自:https://blog.csdn.net/you_big_father/article/details/90604390

使用opencv處理影象,有時需要實時處理,並將處理結果或者相關資訊直接顯示在影象上。例如顯示幀率,物體標籤等。

加文字:putText()函式

此函式在opencv的imgproc模組中的Drawing Functions中,同樣一同存在的有:畫線函式(line)、畫矩形框函式(rectangle)、畫圓函式(circle)等。

//函式各項引數如下
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 圖片 text 要繪製的文字字串 org 影象中文字字串的左下角 fontFace 字型型別, 型別參看HersheyFonts fontScale 字型比例因子乘以字型特定的基本大小 color 文字顏色 thickness 用於繪製文字的線條的粗細 lineType 線型。請參見LineTypes bottomLeftOrigin 如果為true,則影象資料原點位於左下角。否則,它位於左上角

字型型別:

enum HersheyFonts {
    FONT_HERSHEY_SIMPLEX        = 0, //!< 常規大小 沒有襯線的字型
    FONT_HERSHEY_PLAIN          = 1, //!< 小號 沒有襯線的字型
    FONT_HERSHEY_DUPLEX         = 2, //!< 常規大小 複雜的沒有襯線的字型
    FONT_HERSHEY_COMPLEX        = 3, //!< 常規大小 襯線字型
    FONT_HERSHEY_TRIPLEX        = 4, //!< 常規大小 複雜的襯線字型
FONT_HERSHEY_COMPLEX_SMALL = 5, //!< 小號 襯線字型 FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< 手寫風格的字型 FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< 複雜的手寫風格的字型 FONT_ITALIC = 16 //!< 斜體字型 };

另外可見百科:

西方國家字母體系分為兩類:襯線字型(serif)以及無襯線體(sans serif)。

襯線字型,意思是在字的筆畫開始、結束的地方有額外的裝飾,而且筆畫的粗細會有所不同。

無襯線體是無襯線字型,沒有這些額外的裝飾,而且筆畫的粗細差不多。

中文字型中的宋體就是一種最標準的襯線字型,襯線的特徵非常明顯。字形結構也和手寫的楷書一致。因此宋體一直被做為最適合的正文字型。

線型:

enum LineTypes {
    FILLED  = -1,
    LINE_4  = 4, //!< 4-connected line
    LINE_8  = 8, //!< 8-connected line
    LINE_AA = 16 //!< antialiased line
};

值越大字型越圓滑。

執行時間的函式:所用函式為getTickCount()和getTickFrequency()

getTickCount():返回CPU自某個時間(如啟動電腦)以來走過的時鐘週期數。

getTickFrequency():返回CPU一秒中所走的時鐘週期數。所以可以以秒為單位對某運算時間計時。

使用方法:

//記錄當前時間
    double start = static_cast<double>(getTickCount());
 
    /*
        中間為耗時程式
    */
 
    //再次獲取時間減去上一次記錄的時間,即為執行時間
double time = ((double)getTickCount() - start) / getTickFrequency();
cout << "所用時間為:" << time << "" << endl;

也可用函式cvGetTickCount()和cvGetTickFrequency()。但注意,此時得到的單位是us級的統計時間。

double start = static_cast<double>(cvGetTickCount());
double time = ((double)cvGetTickCount() - start) / cvGetTickFrequency();
cout << "所花費時間為:" << time << "us" << endl;

綜合:

在輸出圖片上打印出執行時間,程式碼大致如下:

//得到函式的執行時間,並列印到輸出影象左上角
 
    cv::Mat imageIn, imageOut;
    stringstream buffer;
    double start = static_cast<double>(getTickCount());
 
    imageIn = imread("picture.jpg");
    imageOut = dosomething(imageIn);
 
double time = ((double)getTickCount() - start) / getTickFrequency();
    buffer << time;
 
    std::string str = "Time : " + buffer.str() + "s";
    cv::putText(imageOut , str, cv::Point(0.1*imageOut.cols,0.1*imageOut.rows), cv::FONT_HERSHEY_DUPLEX, 1, cv::Scalar(0, 255,0 ), 2, 16);
 
    cv::imshow("sb", imageOut);
    cv::waitKey(10);

參考:

https://blog.csdn.net/yzhang6_10/article/details/51126789

https://blog.csdn.net/guyuealian/article/details/77870983?locationNum=7&fps=1

https://www.cnblogs.com/lyggqm/p/4562727.html