本文主要是介绍OpenCV7---绘制形状文字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
七、绘制形状和文字
1、在图片中绘制一条线
Point表示2D平面上的一个点,可用以下两个方式定义
Point p;
p1.x = 10; p1.y = 8;//第一种
p = Point(10, 8);//第二种
画线用到函数line( );
void MyLines() {//划线函数定义Point p1 = Point(20, 30);//定义线的起始点Point p2 = Point(300, 300);//定义线的终点//p2.x = 300;//p2.y = 300;Scalar color = Scalar(0, 0, 255);//定义线的颜色line(image, p1, p2, color, 1, LINE_8);//在图片src中生成一条线,从点p1到点p2,颜色为color, 线的宽度为1,类型为LINE_8//line(src, p1, p2, color, 1, LINE_AA);//类型为LINE_AA,反锯齿类型,生成的线更平滑
}
显示效果:
2、绘制长方形框
绘制长方形框用到函数rectangle( );
void MyRectangle() {//画长方形框函数定义Rect rect = Rect(20, 30, 300, 300);//定义长方形框的起点(20,30),长宽分别为300和300Scalar color = Scalar(255, 0, 0);//定义长方形框的颜色rectangle(src, rect, color, 2, LINE_8);在图片src中生成一个长方形框,参数为rect,颜色为color,线宽为2,类型为LINE_8
}
显示效果:
3、绘制椭圆
绘制椭圆用函数ellipse( ),可以通过调节倾斜度数得到不同朝向的椭圆,可以通过调节显示范围得到弧形。
void MyEllipse() {//画椭圆函数定义Scalar color = Scalar(0, 255, 0);//定义椭圆颜色ellipse(src, Point(src.cols / 2, src.rows / 2), Size(src.cols / 4, src.rows / 8), 90, 0, 360, color, 2, LINE_8);//在图片src中生成一个椭圆框,中心点为Point,长短轴参数在Size中,倾斜角度为90°,显示范围为0-360°,颜色为color,线长为2,类型为LINE_8
}
显示效果:
4、绘制圆形
绘制圆形用函数circle( );
void MyCircle() {//画圆函数定义Scalar color = Scalar(0, 255, 255);//定义圆的颜色Point center = Point(src.cols / 2, src.rows / 2);//定义圆的圆心circle(src, center, 150, color, 2, 8);//在图片src中生成一个圆,圆心坐标为Point,半径为150,颜色为color,线宽为2,类型为LINE_8
}
显示效果:
5、绘制填充图形
填充图形用函数fillPoly( );
void MyPolygon() {//填充函数定义Point pts[2][5];//声明填充范围轮廓点的坐标,为一个2维数组,第一维代表有几个填充范围,第二维代表该范围的边界点,最终应传出指向某一个填充范围的指针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);pts[1][0] = Point(300, 300);pts[1][1] = Point(300, 400);pts[1][2] = Point(400, 400);pts[1][3] = Point(400, 300);pts[1][4] = Point(300, 300);const Point* ppts[] = { pts[0], pts[1] };//指向第0个轮廓的指针int npt[] = { 5, 5 };//数组中存放每一个轮廓的轮廓点数Scalar color = Scalar(255, 12, 255);//定义轮廓颜色fillPoly(src, ppts, npt, 2, color, 8);//在图片src中填充一个范围,ppts中存放着这个轮廓信息的位置,npt代表该轮廓有几个轮廓点,2代表填充的轮廓数目
}
显示效果:
6、打印文字
打印文字用到函数putText( );
putText(src, "Hello OpenCV", Point(100, 200), FONT_HERSHEY_COMPLEX, 1.0, Scalar(12, 255, 200), 2, 8);//在屏幕上点Point处打印文字"Hello OpenCV",字体类型为FONT_HERSHEY_COMPLEX,放缩程度为1.0,后3个参数为颜色,线宽,类型
显示效果:
7、生成随机线
随机数生成cv::RNG
- 随机数生成器RNG rng(12345);
- 生成正态分布随机数uniform(int a, int b),随机生成啊[a, b)之间的数
void RandomLineDemo() {//生成随机线函数定义RNG rng(12345);//生成高斯随机函数Point pt1;Point pt2;Mat dst = Mat::zeros(src.size(), src.type());//构造新的一张与图片src大小类型一致的黑图dstfor (int i = 0; i < 100000; i++) {//执行100000次,不断生成随机线pt1.x = rng.uniform(0, src.cols);//第1个点x坐标生成正态分布随机数0到src.cols之间pt2.x = rng.uniform(0, src.cols);pt1.y = rng.uniform(0, src.rows);pt2.y = rng.uniform(0, src.rows);Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//随机生成颜色值if (waitKey(50) > 0) {//直到有按键按下才会结束break;}line(dst, pt1, pt2, color, 1, 8);//随机划线imshow("random line demo", dst);}
}
显示效果:
示例代码(绘制图片文字综合):
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;void MyLines();//划线函数声明
void MyRectangle();//画长方形框函数声明
void MyEllipse();//画椭圆函数声明
void MyCircle();//画圆函数声明
void MyPolygon();//填充函数声明
void RandomLineDemo();
Mat src;//定义一个全局的图片int main(int argc, char** argv) {src = imread("C:/Users/26839/Pictures/测试.png");if (!src.data) {cout << "could not load image...\n" << endl;return -1;}imshow("yuantupian", src);MyLines();//调用划线函数MyRectangle();//调用长方形框函数MyEllipse();//调用画椭圆函数MyCircle();//调用画圆函数MyPolygon();//调用填充函数putText(src, "Hello OpenCV", Point(100, 200), FONT_HERSHEY_COMPLEX, 1.0, Scalar(12, 255, 200), 2, 8);//在屏幕上点Point处打印文字"Hello OpenCV",字体类型为FONT_HERSHEY_COMPLEX,放缩程度为1.0,后3个参数为颜色,线宽,类型imshow("input", src);//RandomLineDemo();//声明生成随机线函数waitKey(0);destroyAllWindows();return 0;
}void MyLines() {Point p1 = Point(20, 30);Point p2 = Point(300, 300);Scalar color = Scalar(0, 0, 255);line(src, p1, p2, color, 1, LINE_8);
}void MyRectangle() {//画长方形框函数定义Rect rect = Rect(20, 30, 300, 300);//定义长方形框的起点(20,30),长宽分别为300和300Scalar color = Scalar(255, 0, 0);//定义长方形框的颜色rectangle(src, rect, color, 2, LINE_8);在图片src中生成一个长方形框,参数为rect,颜色为color,线宽为2,类型为LINE_8
}void MyEllipse() {//画椭圆函数定义Scalar color = Scalar(0, 255, 0);//定义椭圆颜色ellipse(src, Point(src.cols / 2, src.rows / 2), Size(src.cols / 4, src.rows / 8), 90, 0, 360, color, 2, LINE_8);//在图片src中生成一个椭圆框,中心点为Point,长短轴参数在Size中,倾斜角度为90°,显示范围为0-360°,颜色为color,线长为2,类型为LINE_8
}void MyCircle() {//画圆函数定义Scalar color = Scalar(0, 255, 255);//定义圆的颜色Point center = Point(src.cols / 2, src.rows / 2);//定义圆的圆心circle(src, center, 150, color, 2, 8);//在图片src中生成一个圆,圆心坐标为Point,半径为150,颜色为color,线宽为2,类型为LINE_8
}void MyPolygon() {//填充函数定义Point pts[2][5];//声明填充范围轮廓点的坐标,为一个2维数组,第一维代表有几个填充范围,第二维代表该范围的边界点,最终应传出指向某一个填充范围的指针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);pts[1][0] = Point(300, 300);pts[1][1] = Point(300, 400);pts[1][2] = Point(400, 400);pts[1][3] = Point(400, 300);pts[1][4] = Point(300, 300);const Point* ppts[] = { pts[0], pts[1] };//指向第0个轮廓的指针int npt[] = { 5, 5 };//数组中存放每一个轮廓的轮廓点数Scalar color = Scalar(255, 12, 255);//定义轮廓颜色fillPoly(src, ppts, npt, 2, color, 8);//在图片src中填充一个范围,ppts中存放着这个轮廓信息的位置,npt代表该轮廓有几个轮廓点,2代表填充的轮廓数目
}
输出结果如下:
这篇关于OpenCV7---绘制形状文字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!