影象加文字與執行時間——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