文章目錄
- 繪制圖形相關API
- cv::Point與cv::Scalar 物件
- cv::Point:
- cv::Scalar:
- 畫線 cv::line (LINE_4\LINE_8\LINE_AA)
- 畫橢圓cv::ellipse
- 畫矩形cv::rectangle
- 畫圓cv::circle
- 畫填充cv::fillPoly
- 畫文字cv::putText
- 代碼示例
繪制圖形相關API
cv::Point與cv::Scalar 物件
cv::Point:
Point:用于表示二維坐標系下的點,如:
Point p = Point(2,3);
Point2f p =Point2f(42.4, 24.4);
Point3i p = Point3i(2,3,4)
還可以這樣創建
Point p;
p.x = 10;
p.y = 8;
or
p = Pont(10,8);
cv::Scalar:
Scalar:具有四個元素的模板類 在opencv中廣泛用于傳遞和讀取影像中的像素值,如:
//定義RGB顏色值 B代表藍色,G為綠色,R為紅色、有時還有個A 表示透明度,
Scalar(B,G,R);
Scalar表示四個元素的向量
Scalar(a, b, c);// a = blue, b = green, c = red表示RGB三個通道
上面兩個物件都是畫圖形常用的引數,另外還有一個常用的引數是Size,Size:主要用來表示一幅影像或一個矩形的大小,有兩個成員變數分別是 width height,如:Size_(_Tp _width, _Tp _height),
畫線 cv::line (LINE_4\LINE_8\LINE_AA)
函式原型:
void line(
Mat& img,
Point pt1,
Point pt2,
const Scalar& color,
int thickness=1,
int lineType=8,
int shift=0
)
引數:
img:影像,pt1:線段的第一個端點,pt2:線段的第二個端點,color:線段的顏色,thicness:線段的粗細程度,linetype:線段的型別,
8 (or 0) - 8-connected line(8鄰接)連接 線,
4 - 4-connected line(4鄰接)連接線,
CV_AA - antialiased 線條,shif:
坐標點的小數點位數,
函式cvLine 在影像中的點1和點2之間畫一條線段,線段被影像或感興趣的矩形(ROI rectangle)所裁剪,對于具有整數坐標的non-antialiasing 線條,使用8-連接或者4-連接Bresenham 演算法,畫粗線條時結尾是圓形的,畫 antialiased 線條使用高斯濾波,要指定線段顏色,用戶可以使用使用宏CV_RGB( r, g, b ),
畫橢圓cv::ellipse
函式原型:
void ellipse(
Mat& img,
Point center,
Size axes,
double angle,
double startAngle,
double endAngle,
const Scalar& color,
int thickness=1,
int lineType=8,
int shift=0
)
引數:
img:影像,center:橢圓圓心坐標,axes:軸的長度,angle:偏轉的角度,start_angle:圓弧起始角的角度,end_angle:圓弧終結角的角度,color:線條的顏色,thickness:線條的粗細程度,line_type:線條的型別,見CVLINE的描述,shift:圓心坐標點和數軸的精度,
畫矩形cv::rectangle
函式原型:
void rectangle(
Mat& img,
Point pt1,
Point pt2,
const Scalar& color,
int thickness=1,
int lineType=8,
int shift=0
)
引數:
img:影像,pt1:線段的第一個端點,pt2:線段的第二個端點,color:線段的顏色,thicness:線段的粗細程度,linetype:線段的型別,
8 (or 0) - 8-connected line(8鄰接)連接 線,
4 - 4-connected line(4鄰接)連接線,
CV_AA - antialiased 線條,shif:
坐標點的小數點位數,
函式cvLine 在影像中的點1和點2之間畫一條線段,線段被影像或感興趣的矩形(ROI rectangle)所裁剪,對于具有整數坐標的non-antialiasing 線條,使用8-連接或者4-連接Bresenham 演算法,畫粗線條時結尾是圓形的,畫 antialiased 線條使用高斯濾波,要指定線段顏色,用戶可以使用使用宏CV_RGB( r, g, b ),
畫圓cv::circle
函式原型:
void circle(
Mat& img,
Point center,
int radius,
const Scalar& color,
int thickness=1,
int lineType=8,
int shift=0
)
引數:
img:影像,center:圓心坐標,radius:圓形的半徑,color:線條的顏色,thickness:如果是正數,表示組成圓的線條的粗細程度,否則,表示圓是否被填充,line_type:線條的型別,見 cvLine 的描述shift:圓心坐標點和半徑值的小數點位數,
函式cvCircle繪制或填充一個給定圓心和半徑的圓,圓被感興趣矩形所裁剪, 若指定圓的顏色,可以使用宏 CV_RGB ( r, g, b ),
畫填充cv::fillPoly
函式原型:
void fillPoly(
Mat& img,
const Point** pts,
const int* npts,
int ncontours,
const Scalar& color,
int lineType=8,
int shift=0,
Point offset=Point()
)
引數:
img:影像,pts:指向多邊形的陣列指標,npts:多邊形的頂點個數的陣列,contours:組成填充區域的線段的數量,color:多邊形的顏色,line_type:組成多邊形的線條的型別,shift:頂點坐標的小數點位數,
函式cvFillPoly用于一個單獨被多邊形輪廓所限定的區域內進行填充,函式可以填充復雜的區域,例如,有漏洞的區域和有交叉點的區域等等,
下面這個函式表示非填充多邊形,isClosed代表是否閉合
void polylines(Mat& img, const Point** pts, const int* npts, int ncontours, bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )
畫文字cv::putText
void cv::putText(
cv::Mat& img, // 待繪制的影像
const string& text, // 待繪制的文字
cv::Point origin, // 文本框的左下角
int fontFace, // 字體 (如cv::FONT_HERSHEY_PLAIN)
double fontScale, // 尺寸因子,值越大文字越大
cv::Scalar color, // 線條的顏色(RGB)
int thickness = 1, // 線條寬度
int lineType = 8, // 線型(4鄰域或8鄰域,默認8鄰域)
bool bottomLeftOrigin = false // true='origin at lower left'
);
引數說明:函式原型中注釋寫明,
opencv支持的文字字體有以下幾種:

代碼示例
畫圖形運行結果:

畫隨機直線運行結果

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
using namespace std;
using namespace cv;
Mat bgImage;
const char* drawdemo_win = "draw shapes and text demo";
void MyLines();
void MyRectangle();
void MyEllipse();
void MyCircle();
void MyPolygon();
void RandomLineDemo();
int main(int argc, char** argv) {
bgImage = imread("./test1.jpg");
if (!bgImage.data) {
printf("could not load image...\n");
return -1;
}
//MyLines();
//MyRectangle();
//MyEllipse();
//MyCircle();
//MyPolygon();
putText(bgImage, "Hello OpenCV", Point(400, 400), CV_FONT_HERSHEY_COMPLEX, 1.0, Scalar(12, 23, 200), 3, 8);
namedWindow(drawdemo_win, CV_WINDOW_AUTOSIZE);
imshow(drawdemo_win, bgImage);
RandomLineDemo();
waitKey(0);
return 0;
}
void MyLines() {
Point p1 = Point(20, 30);
Point p2;
p2.x = 400;
p2.y = 400;
Scalar color = Scalar(0, 0, 255);
line(bgImage, p1, p2, color, 1, LINE_AA);
}
void MyRectangle() {
Rect rect = Rect(200, 100, 300, 300);
Scalar color = Scalar(255, 0, 0);
rectangle(bgImage, rect, color, 2, LINE_8);
}
void MyEllipse() {
Scalar color = Scalar(0, 255, 0);
ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows / 8), 90, 0, 360, color, 2, LINE_8);
}
void MyCircle() {
Scalar color = Scalar(0, 255, 255);
Point center = Point(bgImage.cols / 2, bgImage.rows / 2);
circle(bgImage, center, 150, color, 2, 8);
}
void MyPolygon() {
Point pts[1][5];
pts[0][0] = Point(100, 100);
pts[0][1] = Point(100, 200);
pts[0][2] = Point(200, 200);
pts[0][3] = Point(200, 100);
pts[0][4] = Point(100, 100);
const Point* ppts[] = { pts[0] };
int npt[] = { 5 };
Scalar color = Scalar(255, 12, 255);
fillPoly(bgImage, ppts, npt, 1, color, 8);
}
void RandomLineDemo() {
RNG rng(12345);
Point pt1;
Point pt2;
Mat bg = Mat::zeros(bgImage.size(), bgImage.type());
namedWindow("random line demo", CV_WINDOW_AUTOSIZE);
for (int i = 0; i < 100000; i++) {
pt1.x = rng.uniform(0, bgImage.cols);
pt2.x = rng.uniform(0, bgImage.cols);
pt1.y = rng.uniform(0, bgImage.rows);
pt2.y = rng.uniform(0, bgImage.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
if (waitKey(50) > 0) {
break;
}
line(bg, pt1, pt2, color, 1, 8);
imshow("random line demo", bg);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354785.html
標籤:其他
下一篇:通過 “貓片” 認識生成對抗網路思想(Make Your First GAN With PyTorch 第五章)
