【opencv】2.opencv绘图、视频等
1.opencv在圖片中繪圖常使用的幾個函數
opencv中的(0,0)坐標是在圖像的左上角。
cv::putText的用法:
對于cv::putText后面參數int lineType = 8, 是線型(4鄰域或8鄰域,默認8鄰域),實際工程中我一般選擇16鄰域的cv::LINE_AA或者CV_AA或者直接填16,這三種填法都是一個意思。看起來平滑效果很好,不填的話默認8鄰域,看起來字體有鋸齒的樣子,不好看。所以建議填上該參數值為16領域。
建議像下面這樣組合,效果會好看些:
cv::putText(img, str, pt, cv::FONT_HERSHEY_SIMPLEX, 0.5, CV_RGB(255, 255, 0), 1, 16);
cv::FONT_HERSHEY_SIMPLEX字體類型會比 cv::FONT_HERSHEY_PLAIN字體類型默認顯示的大一些,所以,通常字體尺寸設為0.5,字體就是正常大小。
字體和大小如下圖所示:
一般會將 cv::getTextSize() 與 cv::putText() 結合使用:
cv::getTextSize() //實際繪制文字之前,使用cv::getTextSize()接口先獲取待繪制文本框的大小,以方便放置文本框。返回值為cv::Size。設返回值為size,可以通過size.width和size.height來獲取文本框的寬和高.cv::putText() //在圖像上繪制文字//在Mat上畫矩形矩形框,如果要填充矩形,需要把thickness設為-1。詳解看后面。cv::rectangle() //矩形,有成員變量左上角x,左上角y,weight,height,如Rect rect1(256, 256, 128, 128),這樣用是構造函數;cv::Rect //定義一個2D的點:如Point point = Point(10, 8);或者 Point point;//創建一個2D點對象 point.x = 10;//初始化x坐標值 point.y = 8;//初始化y坐標值 cv::Point() //一般作為值來設置顏色。他是一個由長度為4的數組作為元素構成的結構體,Scalar最多可以存儲四個值,沒有提供的值默認是0。 cv::Scalar(255, 255, 0) // 關于cv::Scalar的更詳細資料可以參考 https://blog.csdn.net/liuweiyuxiang/article/details/76929534cv::Size cv::getTextSize(const string& text, // 待繪制的文字int fontFace, // 字體類型 (如 cv::FONT_HERSHEY_PLAIN, cv::FONT_HERSHEY_SIMPLEX)double fontScale, // 尺寸因子,值越大文字越大int thickness, // 線條寬度int* baseLine);void cv::putText(cv::Mat& img, // 待繪制的圖像const string& text, // 待繪制的文字cv::Point origin, // 文本框的左下角坐標(x,y),記住是左下角,不是左上角,要和cv::rectangle()的左上角區分開int fontFace, // 字體類型 (如cv::FONT_HERSHEY_PLAIN, cv::FONT_HERSHEY_SIMPLEX)double fontScale, // 尺寸因子,值越大文字越大cv::Scalar color, // 線條的顏色(RGB)int thickness = 1, // 線條寬度int lineType = 8, // 線型(4鄰域或8鄰域,默認8鄰域),選擇16鄰域的cv::LINE_AA或者CV_AA效果很好bool bottomLeftOrigin = false // true='origin at lower left');// 對于在圖片中畫矩形框的函數,C++中opencv對void cv::rectangle()重載了兩種用法: // pt1 矩形的一個頂點; pt2 矩形對角線上的另一個頂點; color 線條顏色 (RGB) 或亮度(灰度圖像 ) // thickness 組成矩形的線條的粗細程度。取負值時(如 CV_FILLED)函數繪制填充了色彩的矩形。 // line_type 線條的類型。見cvLine的描述。 shift 坐標點的小數點位數。 // 兩個函數的不同之處在于第二個函數把第一個函數中的兩個對角線定點改為了cv::Rect。 void cv::rectangle(cv::Mat& img, cv::Point pt1, cv::Point pt2, const cv::Scalar& color, int thickness=1, int lineType=8, int shift=0) void cv::rectangle(cv::Mat& img, cv::Rect rec, const cv::Scalar& color, int thickness=1, int lineType=8, int shift=0 )下面通過一個示例,來看看cv::getTextSize()與cv::putText()相結合的妙用:
{ //創建空白圖用于繪制文字 cv::Mat image = cv::Mat::zeros(cv::Size(640, 480), CV_8UC3); //設置藍色背景 image.setTo(cv::Scalar(100, 0, 0));//設置繪制文本的相關參數 std::string text = "Hello World!"; int font_face = cv::FONT_HERSHEY_COMPLEX; double font_scale = 2; int thickness = 2; int baseline; //獲取文本框的長寬 cv::Size text_size = cv::getTextSize(text, font_face, font_scale, thickness, &baseline);//將文本框居中繪制 cv::Point origin; origin.x = image.cols / 2 - text_size.width / 2; origin.y = image.rows / 2 + text_size.height / 2; cv::putText(image, text, origin, font_face, font_scale, cv::Scalar(0, 255, 255), thickness, 8, 0);//顯示繪制結果 cv::imshow("image", image); cv::waitKey(0); return 0; }=================================================================
2. cv::Mat 與cv::Rect 在一起使用的情況
// cv::Mat frame; // cv::Rect rect; //創建的新圖像img是fram的一部分,具體的范圍rect指定,此構造函數也不進行圖像數據的復制操作,新圖像img與frame共用圖像數據。 cv::Mat img(frame, rect); //cv::Mat::Mat(cv::Mat const&, cv::Rect_<int> const&) 這種方式構造函數創建的img,他的兩個參數都不能修改,因為是const,修改后就會出錯。cv::Mat img1(img2); //拷貝構造 img1(rect); //從img1中截取rect區域,返回cv::Mat。=================================================================
總結
以上是生活随笔為你收集整理的【opencv】2.opencv绘图、视频等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【c++】1.const和constex
- 下一篇: 【c++】4.std::shared_p