日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在图像中绘制基本形状和文字

發布時間:2024/9/5 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在图像中绘制基本形状和文字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一 基本形狀的繪制
  • 二 隨機數
  • 三 繪制文字

注:原創不易,轉載請務必注明原作者和出處,感謝支持!

一 基本形狀的繪制

本文的內容和數字圖像處理的關系不大,主要是關于OpenCV提供的在圖像中繪制基本形狀和文字的相關API。

OpenCV中的兩種基本數據結構Point和Scalar
Point數據結構表示了由圖像坐標\(x\)\(y\)所指定的2D點。注意,圖像坐標原點在左上角,向右為\(x\)軸(列)正向,向下為\(y\)軸(行)正向。比如圖像第10行第8列可以用下列的代碼來表示其位置。

Point pt; pt.y = 10; pt.x = 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的詳細信息如下所示。

void cv::line (InputOutputArray img, // 要被繪制直線的圖像Point pt1, // 線段端點1Point pt2, // 線段端點2const Scalar &color, // 線段顏色int thickness = 1, // 線段粗細int lineType = LINE_8, // 線的類型int shift = 0 );

比如,要在圖像上繪制一條從左上角到右下角的一條粗度為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的詳細參數如下。

void cv::ellipse(InputOutputArray img, // 要被繪制橢圓的圖片Point center, // 橢圓中心位置Size axes, // 橢圓的長半軸和短半軸的長度double angle, // 旋轉角度double startAngle, // 橢圓弧起始角度double endAngle, // 橢圓弧終止角度const Scalar &color, // 橢圓的顏色int thickness = 1, // 線的粗細,為負則表示填充該橢圓int lineType = LINE_8, // 線類型int shift = 0 );

比如,要在圖像中心繪制一個旋轉了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對該矩形進行填充。

void cv::rectangle(InputOutputArray img, // 要被繪制矩形的圖像Point pt1, // 端點1Point pt2, // 端點2const Scalar &color, // 顏色int thickness = 1, // 線的粗細,為負數則表示使用color對矩形進行填充int lineType = LINE_8, // 矩形邊線的類型int shift = 0 );

比如要在圖像中心繪一個寬為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(),具體參數如下所示。

void cv::circle(InputOutputArray img,Point center,int radius, // 圓的半徑const Scalar &color,int thickness = 1, // 線的粗細,為負則表示填充圓形int lineType = LINE_8,int shift = 0 );

比如要在圖像中心位置繪制一個半徑為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()用于填充多邊形。其詳細情況如下。

void cv::fillPoly(Mat &img,const Point **pts, // 多邊形頂點集const int *npts, // 多邊形頂點數目int ncountours, // 多邊形數量const Scalar &color,int lineType = LINE_8,int shift = 0,Point offset = Point() );

下面是一個填充多邊形的一個例子。

// 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

總結

以上是生活随笔為你收集整理的在图像中绘制基本形状和文字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。