在图像中绘制基本形状和文字
目錄
- 一 基本形狀的繪制
- 二 隨機數
- 三 繪制文字
注:原創不易,轉載請務必注明原作者和出處,感謝支持!
一 基本形狀的繪制
本文的內容和數字圖像處理的關系不大,主要是關于OpenCV提供的在圖像中繪制基本形狀和文字的相關API。
OpenCV中的兩種基本數據結構Point和Scalar
Point數據結構表示了由圖像坐標\(x\)和\(y\)所指定的2D點。注意,圖像坐標原點在左上角,向右為\(x\)軸(列)正向,向下為\(y\)軸(行)正向。比如圖像第10行第8列可以用下列的代碼來表示其位置。
Point其實是由模板Point_經過typedef而來。OpenCV提供了很多由模板Point_typedef而來的類型。比如下面所示的例子所示。幾乎常用的基本的數據類型(int, float, double),都有對應的Point數據類型。在使用Point時請選擇相應的類型即可。
typedef Point_<int> cv::Point2i; typedef Point2i cv::Point; typedef Point_<double> cv::Point2d; typedef Point_<float> cv::Point2f; typedef Point_<int64> cv::Point2l;OpenCV中同樣提供了3D點的Point類型,它的數據成員則為x, y和z。它的模板類為Point3_,同樣,OpenCV也為常用的基本數據類型提供了對應的Point類型如下所示。
typedef Point3_<int> cv::Point3i; typedef Point3_<float> cv::Point3f; typedef Point3_<double> cv::Point3d;Scalar表示的是有4個元素的數組,該類型在OpenCV中常常用于傳遞像素值(比如RGB三通道的像素)。該類型實際上是從cv::Vec<_Tp, 4>繼承而來的。從Scalar的構造函數可以看出,Scalar的第三個和第四個值具有默認值0。所以,當你使用三個值(比如RGB三個值)來初始化一個Scalar對象時,第4個值則默認為0。
Scalar_(_Tp v0, _Tp v1, _Tp v2 = 0, _Tp v3 = 0);OpenCV中的Scalar類型是由Scalar_<double>typedef而來的,如下面的代碼所示。所以,Scalar中的元素是double類型的。這一點需要注意一下。
typedef Scalar_<double> cv::Scalar線的繪制(line)
OpenCV中提供了APIline()來進行直線的繪制。API的詳細信息如下所示。
比如,要在圖像上繪制一條從左上角到右下角的一條粗度為3,類型為LINE_AA(反鋸齒)的藍線,則可以使用以下的代碼。
// draw a line Point pt1(0, 0); // top left point Point pt2(src.cols, src.rows); // bottom right point Scalar color = Scalar(255, 0, 0); // blue color line(src, pt1, pt2, color, 3, LINE_AA); // thickness = 3, lineType = LINE_AA imshow("line", src);橢圓的繪制(ellipse)
OpenCV中提供了APIellipse()來繪制橢圓,該API的詳細參數如下。
比如,要在圖像中心繪制一個旋轉了45度的,長半軸和短半軸分別為50像素和25像素的藍色橢圓可以使用如下的代碼。
// draw a ellipse Point center(src.cols / 2, src.rows / 2); Size axes(50, 25); Scalar color(255, 0, 0); ellipse(src, center, axes, 45, 0, 360, color, -1, LINE_AA); // ellipse(src, center, axes, 0, 0, 180, color, -1, LINE_AA); imshow("ellipse", src);矩形的繪制(rectangle)
OpenCV中提供的矩形繪制APIrectangle()與上面的line()的參數情況非常類似。需要注意的是pt1和pt2是矩形中位于斜對角線上的兩個點(比如左上角點和右下角點),thickness如果為負數,則表示使用顏色color對該矩形進行填充。
比如要在圖像中心繪一個寬為100像素,高為50個像素的紅色矩形可以使用如下的代碼。
// draw a rectangle Point center(src.cols / 2, src.rows / 2); Point pt1(center.x - 50, center.y - 25); Point pt2(center.x + 50, center.y + 25); Rect r = Rect(pt1, pt2); Scalar color = Scalar(0, 0, 255); // override method of rectangle() // rectangle(src, r, color, -1, LINE_8); rectangle(src, pt1, pt2, color, 2, LINE_8); imshow("rectangle", src);圓的繪制(circle)
OpenCV中畫圓的API為circle(),具體參數如下所示。
比如要在圖像中心位置繪制一個半徑為60個像素的紅色的圓可以使用如下代碼。
// draw a circle Point center(src.cols / 2, src.rows / 2); int radius = 60; Scalar color(0, 0, 255); circle(src, center, radius, color, -1, LINE_AA); imshow("circle", src);使用fillPoly()繪制填充的多邊形
OpenCV中提供了APIfillPoly()用于填充多邊形。其詳細情況如下。
下面是一個填充多邊形的一個例子。
// draw a poly Mat dst(Size(400, 300), src.type(), Scalar(0, 0, 0)); int w = 400; Point rook_points[1][20]; rook_points[0][0] = Point(w / 4.0, 7 * w / 8.0); rook_points[0][1] = Point(3 * w / 4.0, 7 * w / 8.0); rook_points[0][2] = Point(3 * w / 4.0, 13 * w / 16.0); rook_points[0][3] = Point(11 * w / 16.0, 13 * w / 16.0); rook_points[0][4] = Point(19 * w / 32.0, 3 * w / 8.0); rook_points[0][5] = Point(3 * w / 4.0, 3 * w / 8.0); rook_points[0][6] = Point(3 * w / 4.0, w / 8.0); rook_points[0][7] = Point(26 * w / 40.0, w / 8.0); rook_points[0][8] = Point(26 * w / 40.0, w / 4.0); rook_points[0][9] = Point(22 * w / 40.0, w / 4.0); rook_points[0][10] = Point(22 * w / 40.0, w / 8.0); rook_points[0][11] = Point(18 * w / 40.0, w / 8.0); rook_points[0][12] = Point(18 * w / 40.0, w / 4.0); rook_points[0][13] = Point(14 * w / 40.0, w / 4.0); rook_points[0][14] = Point(14 * w / 40.0, w / 8.0); rook_points[0][15] = Point(w / 4.0, w / 8.0); rook_points[0][16] = Point(w / 4.0, 3 * w / 8.0); rook_points[0][17] = Point(13 * w / 32.0, 3 * w / 8.0); rook_points[0][18] = Point(5 * w / 16.0, 13 * w / 16.0); rook_points[0][19] = Point(w / 4.0, 13 * w / 16.0); const Point *ppt[1] = { rook_points[0] }; int npt[] = { 20 }; Scalar color(255, 255, 255); fillPoly(dst, ppt, npt, 1, color, LINE_8); imshow("poly", dst);二 隨機數
OpenCV提供了RNG類用于產生隨機數。其最常用的兩個方法是產生高斯分布的gaussian()和均勻分布的uniform()。下面的代碼可以生成20條線,每條線的位置、顏色和粗細都是隨機的。
RNG rng(time(NULL)); Point p1, p2; Mat bg = Mat::zeros(Size(400, 300), CV_8UC3); namedWindow("random lines", WINDOW_AUTOSIZE);for (int i = 0; i < 20; ++i) {p1.x = rng.uniform(0, bg.cols);p2.x = rng.uniform(0, bg.cols);p1.y = rng.uniform(0, bg.rows);p2.y = rng.uniform(0, bg.rows);Scalar color(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));int thickness = rng.uniform(1, 4);waitKey(50);line(bg, p1, p2, color, thickness, LINE_8);imshow("random lines", bg); }三 繪制文字
OpenCV提供了APIputText()來向圖片中繪制文字。該API的詳細信息如下。
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 );下面的代碼可以在圖像中繪制“windows !”。
// draw text "Windows !" char text[] = "Windows !"; Point pos(src.cols / 2 - 80, src.rows / 2); Scalar color(255, 0, 255); putText(src, text, pos, CV_FONT_HERSHEY_COMPLEX, 1.0, color, 2, LINE_8); imshow("putText", src);轉載于:https://www.cnblogs.com/laizhenghong2012/p/11256415.html
總結
以上是生活随笔為你收集整理的在图像中绘制基本形状和文字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL删除元素注意事项
- 下一篇: MSCRM2011 Current Us