本节内容对opencv提供的一些绘图接口进行了学习。
其中对于绘制椭圆的偏转以及绘制矩形时的坐标计算,都使用注释标明了
#include "widget.h" #include <QApplication> #include <opencv2/opencv.hpp> #include <stdio.h> #include <QDebug> #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif using namespace std; using namespace cv; const int w = 400; //绘制椭圆 void MyEllipse(Mat img, double angle) { int thickness = 2;//线宽 int lineType = 8;//线的类型 //img 输入输出图像 //Point 指定的椭圆中心坐标 //Size 指定的椭圆所在的区域矩形。这里两个参数表示长和高(相差越大椭圆越椭,相等则为圆) //angle 椭圆长轴偏离角度(起始绘图点和中心坐标的角度) //startAngle 绘制椭圆起始角度 //endAngle 绘制椭圆中点角度 //start-end 如果是0-360,则表示整个椭圆,180表示半个椭圆。所绘制的形状和起始绘制点有关 //Scalar 指定绘制线的颜色 ellipse(img, Point(w/2.0, w/2.0), Size(w/4.0, w/16.0), angle, 0, 270, Scalar(255, 0, 0), thickness, lineType); } //绘制圆形 void MyFilledCircle(Mat img, Point center) { int thickness = -1; int lineType = 8; //img 输入输出图像 //Point 指定二维点作为圆心 //int 圆半径 //Scalar 指定的绘制圆颜色 circle(img, center, w/32.0, Scalar(0, 0, 255), thickness, lineType); } //绘制直线 void MyLine(Mat img, Point start, Point end) { int thickness = 2; int lineType = 8; line(img, start, end, Scalar(0, 0, 0), thickness, lineType); } //绘制多边形 void MyPolygon(Mat img) { int lineType = 8; 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};//说明顶点个数 fillPoly(img, ppt, npt, 1, Scalar(255,255,255), lineType); } int main(int argc, char *argv[]) { QApplication a(argc, argv); QLabel *lab = NULL; if(lab) qDebug() << "null"; else{ qDebug() << "not null"; } int i; Widget w; w.show(); /**绘制图形 */ QString atom_window = "Drawing 1:Action"; QString rook_window = "Drawing 2:Rook"; //创建两个空的图像 Mat atom_image = Mat::zeros(w, w, CV_8UC3); Mat rook_image = Mat::zeros(w, w, CV_8UC3); // 角度是延y轴顺时针计算,例如45表示y轴顺时针转动45°开始画 MyEllipse(atom_image, 0); MyEllipse(atom_image, 45); MyEllipse(atom_image, 90);//-90 MyEllipse(atom_image, -45);//-45 两个不同 MyFilledCircle(atom_image, Point(w/2.0, w/2.0)); namedWindow(atom_window.toStdString(), WINDOW_AUTOSIZE); imshow(atom_window.toStdString(), atom_image); //绘制多边形 MyPolygon(rook_image); rectangle(rook_image, Point(0, 7*w/8.0),Point(w,w), Scalar(0,255,255), -1, 8); //直线 MyLine(rook_image, Point(0, 15*w/16), Point(w, 15*w/16)); MyLine(rook_image, Point(w/4, 7*w/8), Point(w/4, w)); MyLine(rook_image, Point(w/2, 7*w/8), Point(w/2, w)); MyLine(rook_image, Point(3*w/4, 7*w/8), Point(3*w/4, w)); namedWindow(rook_window.toStdString(), WINDOW_AUTOSIZE); imshow(rook_window.toStdString(), rook_image); /**绘制字体*/ QString text = "你好"; int fontFace = FONT_HERSHEY_SCRIPT_COMPLEX; double fontScale = 2; int thickness = 3; Mat img(600, 800, CV_8UC3, Scalar::all(0));//创建一个黑色的三通道图片 int baseline = 0; Size textSize = getTextSize(text.toStdString(), fontFace, fontScale, thickness, &baseline); qDebug() << "textSize width:" << textSize.width; qDebug() << "textSize height:" << textSize.height; qDebug() << "text y :" << baseline; // 确定矩形框大小所用 baseline += thickness; //Org坐标为字符串左下角位置坐标 Point textOrg((img.cols - textSize.width)/2, (img.rows + textSize.height)/2); cout << "textOrg:" << endl << textOrg << endl; //绘制矩形,坐标点分别是 //左上角坐标 textOrg - Point(0, textSize.height) //右下角坐标 textOrg + Point(textSize.width, baseline) //左下角坐标 textOrg + Point(0, baseline); //右上角坐标 textOrg + Point(textSize.width, -textSize.height) rectangle(img, textOrg - Point(0, textSize.height), textOrg + Point(textSize.width, baseline), Scalar(0,0,255)); cout << "text-Point:" << endl << textOrg + Point(textSize.width, -textSize.height) << endl; line(img, textOrg + Point(0, thickness), textOrg + Point(textSize.width, thickness), Scalar(0,0,255)); putText(img, text.toStdString(), textOrg, fontFace, fontScale, Scalar::all(255), thickness, 8); imshow("t", img); return a.exec(); }View Code